https://gcc.gnu.org/g:556a882feeaa7be7518fed3d97a3986a61ca9e45

commit r16-1416-g556a882feeaa7be7518fed3d97a3986a61ca9e45
Author: Martin Uecker <uec...@tugraz.at>
Date:   Wed Jun 4 20:07:11 2025 +0200

    c: fix ICE for invalid code in generic selection [PR120303]
    
    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.

Diff:
---
 gcc/c/c-parser.cc               | 8 +++++++-
 gcc/testsuite/gcc.dg/pr120303.c | 5 +++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index 85580c57abfe..faa50a4fd86b 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -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
index 000000000000..caeff9290abd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr120303.c
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c2y" } */
+
+int t = _Generic (char(1));    /* { dg-error "before numeric constant" } */
+

Reply via email to