Tested x86_64-pc-linux-gnu, applying to trunk and 15. -- 8< --
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. --- gcc/cp/parser.cc | 2 +- gcc/testsuite/g++.dg/template/permissive-error3.C | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/permissive-error3.C 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 () {}; + +}; base-commit: 2f19d9408477829ab7de465310fa0068be0f43ff -- 2.49.0