Commit 879887f1 by Ville Voutilainen Committed by Jason Merrill

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
parent cf55ec56
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> 2015-02-02 Jason Merrill <jason@redhat.com>
* tree.c (handle_abi_tag_attribute): Diagnose invalid arguments. * tree.c (handle_abi_tag_attribute): Diagnose invalid arguments.
......
...@@ -1813,6 +1813,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) ...@@ -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_PURE_VIRTUAL_P (newdecl) |= DECL_PURE_VIRTUAL_P (olddecl);
DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl); DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl);
DECL_INVALID_OVERRIDER_P (newdecl) |= DECL_INVALID_OVERRIDER_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); DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl);
if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK) if (DECL_OVERLOADED_OPERATOR_P (olddecl) != ERROR_MARK)
SET_OVERLOADED_OPERATOR_CODE SET_OVERLOADED_OPERATOR_CODE
......
...@@ -4,8 +4,11 @@ struct B ...@@ -4,8 +4,11 @@ struct B
virtual void f() final {} virtual void f() final {}
virtual void g() {} virtual void g() {}
virtual void x() const {} virtual void x() const {}
virtual void y() final;
}; };
void B::y() {} // { dg-error "overriding" }
struct B2 struct B2
{ {
virtual void h() {} virtual void h() {}
...@@ -14,6 +17,7 @@ struct B2 ...@@ -14,6 +17,7 @@ struct B2
struct D : B struct D : B
{ {
virtual void g() override final {} // { dg-error "overriding" } virtual void g() override final {} // { dg-error "overriding" }
virtual void y() override final {} // { dg-error "virtual" }
}; };
template <class T> struct D2 : T template <class T> struct D2 : T
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment