From: Jason Merrill Date: Fri, 4 Jul 2025 09:15:00 +0000 (-0400) Subject: c++: -Wtemplate-body and tentative parsing [PR120575] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=35d6f55f7d6655a8683b45286283d44674fa997e;p=thirdparty%2Fgcc.git c++: -Wtemplate-body and tentative parsing [PR120575] Here we were asserting non-zero errorcount, which is not the case if the parse error was reduced to a warning (or silenced) in a template body. So check seen_error instead. PR c++/120575 PR c++/116064 gcc/cp/ChangeLog: * parser.cc (cp_parser_abort_tentative_parse): Check seen_error instead of errorcount. gcc/testsuite/ChangeLog: * g++.dg/template/permissive-error3.C: New test. --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 617b7cd47d8..cac74e36ece 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -36664,7 +36664,7 @@ static void cp_parser_abort_tentative_parse (cp_parser* parser) { gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED - || errorcount > 0); + || seen_error ()); cp_parser_simulate_error (parser); /* Now, pretend that we want to see if the construct was successfully parsed. */ diff --git a/gcc/testsuite/g++.dg/template/permissive-error3.C b/gcc/testsuite/g++.dg/template/permissive-error3.C new file mode 100644 index 00000000000..988b7fa39de --- /dev/null +++ b/gcc/testsuite/g++.dg/template/permissive-error3.C @@ -0,0 +1,12 @@ +// PR c++/120575 +// { dg-additional-options -Wno-template-body } + +template< int > +struct T {}; + +template< int > +struct S { + + operator typename T< oops >::anything () {}; + +};