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

Reply via email to