On 11/17/20 2:32 PM, Marek Polacek wrote:
This invalid (?) code broke my assumption that if decl_specifiers->type
is null, there must be any type-specifiers.  Turn the assert into an if
to fix this crash.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

gcc/cp/ChangeLog:

        PR c++/97881
        * parser.c (warn_about_ambiguous_parse): Only assume "int" if we
        actually saw any type-specifiers.

gcc/testsuite/ChangeLog:

        PR c++/97881
        * g++.dg/warn/Wvexing-parse9.C: New test.
---
  gcc/cp/parser.c                            | 11 +++++------
  gcc/testsuite/g++.dg/warn/Wvexing-parse9.C |  8 ++++++++
  2 files changed, 13 insertions(+), 6 deletions(-)
  create mode 100644 gcc/testsuite/g++.dg/warn/Wvexing-parse9.C

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index b7ef259b048..7a6bf4ad2cf 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -20792,13 +20792,12 @@ warn_about_ambiguous_parse (const 
cp_decl_specifier_seq *decl_specifiers,
        if (same_type_p (type, void_type_node))
        return;
      }
+  else if (decl_specifiers->any_type_specifiers_p)
+    /* Code like long f(); will have null ->type.  If we have any
+       type-specifiers, pretend we've seen int.  */
+    type = integer_type_node;
    else
-    {
-      /* Code like long f(); will have null ->type.  If we have any
-        type-specifiers, pretend we've seen int.  */
-      gcc_checking_assert (decl_specifiers->any_type_specifiers_p);
-      type = integer_type_node;
-    }
+    return;
auto_diagnostic_group d;
    location_t loc = declarator->u.function.parens_loc;
diff --git a/gcc/testsuite/g++.dg/warn/Wvexing-parse9.C 
b/gcc/testsuite/g++.dg/warn/Wvexing-parse9.C
new file mode 100644
index 00000000000..dc4198d6c5e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wvexing-parse9.C
@@ -0,0 +1,8 @@
+// PR c++/97881
+// { dg-do compile }
+
+void
+cb ()
+{
+  volatile _Atomic (int) a1; // { dg-error "expected initializer" }

I'm not sure it's useful to test for this particular error, since a missing initializer isn't the problem with this declaration. OK either way.

+}

base-commit: a5f9c27bfc4417224e332392bb81a2d733b2b5bf


Reply via email to