mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 08:00:40 +08:00
[C++ PATCH] vfunc overrider simplification
https://gcc.gnu.org/ml/gcc-patches/2019-08/msg01674.html * class.c (check_for_override): Checking IDENTIFIER_VIRTUAL_P is sufficient, reorder DECL_OVERRIDE_P check. From-SVN: r274867
This commit is contained in:
parent
7d35d2bf5a
commit
5f9f1ffebe
@ -1,3 +1,8 @@
|
||||
2019-08-23 Nathan Sidwell <nathan@acm.org>
|
||||
|
||||
* class.c (check_for_override): Checking IDENTIFIER_VIRTUAL_P is
|
||||
sufficient, reorder DECL_OVERRIDE_P check.
|
||||
|
||||
2019-08-23 Iain Sandoe <iain@sandoe.co.uk>
|
||||
|
||||
PR pch/61250
|
||||
|
@ -2802,31 +2802,34 @@ get_basefndecls (tree name, tree t, vec<tree> *base_fndecls)
|
||||
}
|
||||
}
|
||||
|
||||
/* If this declaration supersedes the declaration of
|
||||
a method declared virtual in the base class, then
|
||||
mark this field as being virtual as well. */
|
||||
/* If this method overrides a virtual method from a base, then mark
|
||||
this member function as being virtual as well. Do 'final' and
|
||||
'override' checks too. */
|
||||
|
||||
void
|
||||
check_for_override (tree decl, tree ctype)
|
||||
{
|
||||
bool overrides_found = false;
|
||||
if (TREE_CODE (decl) == TEMPLATE_DECL)
|
||||
/* In [temp.mem] we have:
|
||||
|
||||
A specialization of a member function template does not
|
||||
override a virtual function from a base class. */
|
||||
return;
|
||||
if ((DECL_DESTRUCTOR_P (decl)
|
||||
|| IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
|
||||
|| DECL_CONV_FN_P (decl))
|
||||
|
||||
/* IDENTIFIER_VIRTUAL_P indicates whether the name has ever been
|
||||
used for a vfunc. That avoids the expensive
|
||||
look_for_overrides call that when we know there's nothing to
|
||||
find. */
|
||||
if (IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
|
||||
&& look_for_overrides (ctype, decl)
|
||||
/* Check staticness after we've checked if we 'override'. */
|
||||
&& !DECL_STATIC_FUNCTION_P (decl))
|
||||
/* 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. */
|
||||
{
|
||||
/* 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;
|
||||
overrides_found = true;
|
||||
|
||||
if (warn_override
|
||||
&& !DECL_OVERRIDE_P (decl)
|
||||
&& !DECL_FINAL_P (decl)
|
||||
@ -2834,19 +2837,23 @@ check_for_override (tree decl, tree ctype)
|
||||
warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wsuggest_override,
|
||||
"%qD can be marked override", decl);
|
||||
}
|
||||
else if (DECL_OVERRIDE_P (decl))
|
||||
error ("%q+#D marked %<override%>, but does not override", decl);
|
||||
|
||||
if (DECL_VIRTUAL_P (decl))
|
||||
{
|
||||
/* Remember this identifier is virtual name. */
|
||||
IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = true;
|
||||
|
||||
if (!DECL_VINDEX (decl))
|
||||
/* It's a new vfunc. */
|
||||
DECL_VINDEX (decl) = error_mark_node;
|
||||
IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
|
||||
|
||||
if (DECL_DESTRUCTOR_P (decl))
|
||||
TYPE_HAS_NONTRIVIAL_DESTRUCTOR (ctype) = true;
|
||||
}
|
||||
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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user