From: Jason Merrill Date: Thu, 2 Sep 2021 21:42:32 +0000 (-0400) Subject: c++: Avoid bogus -Wunused with recent change X-Git-Tag: basepoints/gcc-13~4973 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ec4990bc777dd191b86aee6156be3f60cf9de24;p=thirdparty%2Fgcc.git c++: Avoid bogus -Wunused with recent change My change to make limit_bad_template_recursion avoid instantiating members of erroneous classes produced a bogus "used but not defined" warning for 23_containers/unordered_set/instantiation_neg.cc; it's not defined because we decided not to instantiate it. So we need to suppress that warning. gcc/cp/ChangeLog: * pt.c (limit_bad_template_recursion): Suppress -Wunused for decls we decide not to instantiate. --- diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 72b22d8c4873..1b81501386bb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10890,15 +10890,27 @@ limit_bad_template_recursion (tree decl) return false; /* Avoid instantiating members of an ill-formed class. */ - if (DECL_CLASS_SCOPE_P (decl) - && CLASSTYPE_ERRONEOUS (DECL_CONTEXT (decl))) - return true; + bool refuse + = (DECL_CLASS_SCOPE_P (decl) + && CLASSTYPE_ERRONEOUS (DECL_CONTEXT (decl))); - for (; lev; lev = lev->next) - if (neglectable_inst_p (lev->maybe_get_node ())) - break; + if (!refuse) + { + for (; lev; lev = lev->next) + if (neglectable_inst_p (lev->maybe_get_node ())) + break; + refuse = (lev && errs > lev->errors); + } - return (lev && errs > lev->errors); + if (refuse) + { + /* Don't warn about it not being defined. */ + suppress_warning (decl, OPT_Wunused); + tree clone; + FOR_EACH_CLONE (clone, decl) + suppress_warning (clone, OPT_Wunused); + } + return refuse; } static int tinst_depth;