c++: Fix ICE-on-invalid with -Wvexing-parse [PR97881]
authorMarek Polacek <polacek@redhat.com>
Tue, 17 Nov 2020 18:39:39 +0000 (13:39 -0500)
committerMarek Polacek <polacek@redhat.com>
Sat, 21 Nov 2020 20:48:15 +0000 (15:48 -0500)
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.

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
gcc/testsuite/g++.dg/warn/Wvexing-parse9.C [new file with mode: 0644]

index ea5af7094874cdef317fd7d822b27b63485e538c..cea7cb0bd17df7be5df02c82ecd323c5e85b4213 100644 (file)
@@ -20790,13 +20790,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 (file)
index 0000000..92724bc
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/97881
+// { dg-do compile }
+
+void
+cb ()
+{
+  volatile _Atomic (int) a1; // { dg-error "" }
+}