re PR c++/64901 (overriding final function defined out of line does not lead to an...
authorVille Voutilainen <ville.voutilainen@gmail.com>
Tue, 3 Feb 2015 02:49:42 +0000 (04:49 +0200)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 3 Feb 2015 02:49:42 +0000 (21:49 -0500)
PR c++/64901
* decl.c (duplicate_decls): Also duplicate DECL_FINAL_P and
DECL_OVERRIDE_P.

From-SVN: r220363

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/override1.C

index 2e5e2a53d18f4769d43a74addad718c5bc4e8f79..7c200d629a275bc7d104c053efab856898f92d73 100644 (file)
@@ -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.
index 5119964dea9a7539bf8fe22db1997aba266446a1..d2b0814543d561c85eee81633d1d002dea50784e 100644 (file)
@@ -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
index 05d729084daa0987d0b8f7687350bff69172d605..7686a286fc612cb671b2dbae66f3c167e587f060 100644 (file)
@@ -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