+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.
void
check_for_override (tree decl, tree ctype)
{
+ bool overrides_found = false;
if (TREE_CODE (decl) == TEMPLATE_DECL)
/* In [temp.mem] we have:
/* 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))
{
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.
+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
{
virtual void f() final {}
virtual void g() {}
+ virtual void x() const {}
};
struct B2
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" }
};
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;
}