aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2015-02-03 04:49:42 +0200
committerJason Merrill <jason@gcc.gnu.org>2015-02-02 21:49:42 -0500
commit879887f1d250f677eb22d9aec6714ce131fd995b (patch)
treefbd3dcc17bb1e58f29e78e17a2c5e8d6616018cb
parentcf55ec5696f2cfff129869dbefab85a2866b80d3 (diff)
downloadgcc-879887f1d250f677eb22d9aec6714ce131fd995b.zip
gcc-879887f1d250f677eb22d9aec6714ce131fd995b.tar.gz
gcc-879887f1d250f677eb22d9aec6714ce131fd995b.tar.bz2
re PR c++/64901 (overriding final function defined out of line does not lead to an error)
PR c++/64901 * decl.c (duplicate_decls): Also duplicate DECL_FINAL_P and DECL_OVERRIDE_P. From-SVN: r220363
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/override1.C4
3 files changed, 12 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2e5e2a5..7c200d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-02 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ PR c++/64901
+ * decl.c (duplicate_decls): Also duplicate DECL_FINAL_P and
+ DECL_OVERRIDE_P.
+
2015-02-02 Jason Merrill <jason@redhat.com>
* tree.c (handle_abi_tag_attribute): Diagnose invalid arguments.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5119964..d2b0814 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -1813,6 +1813,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
DECL_PURE_VIRTUAL_P (newdecl) |= DECL_PURE_VIRTUAL_P (olddecl);
DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl);
DECL_INVALID_OVERRIDER_P (newdecl) |= DECL_INVALID_OVERRIDER_P (olddecl);
+ DECL_FINAL_P (newdecl) |= DECL_FINAL_P (olddecl);
+ DECL_OVERRIDE_P (newdecl) |= DECL_OVERRIDE_P (olddecl);
DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK)
SET_OVERLOADED_OPERATOR_CODE
diff --git a/gcc/testsuite/g++.dg/cpp0x/override1.C b/gcc/testsuite/g++.dg/cpp0x/override1.C
index 05d7290..7686a28 100644
--- a/gcc/testsuite/g++.dg/cpp0x/override1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/override1.C
@@ -4,8 +4,11 @@ struct B
virtual void f() final {}
virtual void g() {}
virtual void x() const {}
+ virtual void y() final;
};
+void B::y() {} // { dg-error "overriding" }
+
struct B2
{
virtual void h() {}
@@ -14,6 +17,7 @@ struct B2
struct D : B
{
virtual void g() override final {} // { dg-error "overriding" }
+ virtual void y() override final {} // { dg-error "virtual" }
};
template <class T> struct D2 : T