Fixes for override/final.

* class.c (check_for_override): Diagnose final on a nonvirtual
	member function, diagnose override for a virtual with no matching
	override. Don't fiddle around with DECL_VINDEX.

From-SVN: r173626
This commit is contained in:
Ville Voutilainen 2011-05-10 20:58:30 +03:00 committed by Jason Merrill
parent d26e59864b
commit 7506ab1de5
4 changed files with 45 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2011-05-10 Ville Voutilainen <ville.voutilainen@gmail.com>
Fixes for override/final.
* class.c (check_for_override): Diagnose final on a nonvirtual
member function, diagnose override for a virtual with no matching
override. Don't fiddle around with DECL_VINDEX.
2011-05-10 Nathan Froyd <froydnj@codesourcery.com>
* cp-tree.def (EXPR_PACK_EXPANSION): Add an operand.

View File

@ -2453,6 +2453,7 @@ get_basefndecls (tree name, tree t)
void
check_for_override (tree decl, tree ctype)
{
bool overrides_found = false;
if (TREE_CODE (decl) == TEMPLATE_DECL)
/* In [temp.mem] we have:
@ -2467,7 +2468,10 @@ check_for_override (tree decl, tree ctype)
/* Set DECL_VINDEX to a value that is neither an INTEGER_CST nor
the error_mark_node so that we know it is an overriding
function. */
DECL_VINDEX (decl) = decl;
{
DECL_VINDEX (decl) = decl;
overrides_found = true;
}
if (DECL_VIRTUAL_P (decl))
{
@ -2477,11 +2481,10 @@ check_for_override (tree decl, tree ctype)
if (DECL_DESTRUCTOR_P (decl))
TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true;
}
else if (DECL_OVERRIDE_P (decl))
{
DECL_VINDEX (decl) = error_mark_node;
error ("%q+#D marked override, but does not override", decl);
}
else if (DECL_FINAL_P (decl))
error ("%q+#D marked final, but is not virtual", decl);
if (DECL_OVERRIDE_P (decl) && !overrides_found)
error ("%q+#D marked override, but does not override", decl);
}
/* Warn about hidden virtual functions that are not overridden in t.

View File

@ -1,3 +1,7 @@
2011-05-10 Ville Voutilainen <ville.voutilainen@gmail.com>
* g++.dg/inherit/virtual9.C: Extend.
2011-05-10 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/48857

View File

@ -3,6 +3,7 @@ struct B
{
virtual void f() final {}
virtual void g() {}
virtual void x() const {}
};
struct B2
@ -20,7 +21,12 @@ template <class T> struct D2 : T
void h() override {} // { dg-error "marked override, but does not override" }
};
struct D3 : D
template <class T> struct D3 : T
{
void h() override {}
};
struct D4 : D
{
void g() {} // { dg-error "virtual function" }
};
@ -30,10 +36,25 @@ struct B3
virtual void f() final final {} // { dg-error "duplicate virt-specifier" }
};
void g() override {} // { dg-error "virt-specifiers" }
struct B4
{
void f() final {} // { dg-error "marked final, but is not virtual" }
};
struct D5 : B
{
void ff() override {} // { dg-error "marked override, but does not override" }
virtual void fff() override {} // { dg-error "marked override, but does not override" }
virtual void x() override {} // { dg-error "marked override, but does not override" }
void g() override;
};
void D5::g() override {} // { dg-error "not allowed outside a class definition" }
void g() override {} // { dg-error "not allowed outside a class definition" }
int main()
{
D2<B> d2;
D2<B2> d3;
D2<B> d;
D2<B2> d2;
D3<B2> d3;
}