]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: fix ICE for invalid code in generic selection [PR120303]
authorMartin Uecker <uecker@tugraz.at>
Wed, 4 Jun 2025 18:07:11 +0000 (20:07 +0200)
committerMartin Uecker <uecker@gcc.gnu.org>
Wed, 11 Jun 2025 12:48:16 +0000 (14:48 +0200)
Fix an error recovery ICE that occurs when a typename
can not be parsed correctly in the controlling expression
of a generic selection.

PR c/120303

gcc/c/ChangeLog:
* c-parser.cc (c_parser_generic_selection): Handle error
condition.

gcc/testsuite/ChangeLog:
* gcc.dg/pr120303.c: New test.

gcc/c/c-parser.cc
gcc/testsuite/gcc.dg/pr120303.c [new file with mode: 0644]

index 85580c57abfe4626e431a3fe3f12e20af208cf2f..faa50a4fd86b76733ec4e5d04bf96573c975b977 100644 (file)
@@ -11146,8 +11146,14 @@ c_parser_generic_selection (c_parser *parser)
                   "ISO C does not support use of type name as %<_Generic%> "
                   "controlling operand before C2Y");
       struct c_type_name *type = c_parser_type_name (parser);
-      selector_type = groktypename (type, NULL, NULL);
+      if (type)
+       selector_type = groktypename (type, NULL, NULL);
       c_inhibit_evaluation_warnings--;
+      if (!type)
+       {
+         c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
+         return error_expr;
+       }
     }
   else
     {
diff --git a/gcc/testsuite/gcc.dg/pr120303.c b/gcc/testsuite/gcc.dg/pr120303.c
new file mode 100644 (file)
index 0000000..caeff92
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c2y" } */
+
+int t = _Generic (char(1));    /* { dg-error "before numeric constant" } */
+