From 5f9f1ffebe2a3c86d2835118e28714d4a8c878c9 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 23 Aug 2019 19:26:04 +0000 Subject: [PATCH] [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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/class.c | 35 +++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f014423ca00..c4160820fee 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2019-08-23 Nathan Sidwell + + * class.c (check_for_override): Checking IDENTIFIER_VIRTUAL_P is + sufficient, reorder DECL_OVERRIDE_P check. + 2019-08-23 Iain Sandoe PR pch/61250 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index cc53b15401a..99332f456e2 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2802,31 +2802,34 @@ get_basefndecls (tree name, tree t, vec *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 %, 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 %, but is not virtual", decl); - if (DECL_OVERRIDE_P (decl) && !overrides_found) - error ("%q+#D marked %, but does not override", decl); } /* Warn about hidden virtual functions that are not overridden in t. -- 2.30.2