Bootstrapped and regression tested on x86_64.
c: Fix ICE for invalid code with variadic and old-school prototypes
[PR121507]
When mixing old-school definition without prototype and new C23
variadic functions without named argument, there can be an ICE
when trying to form the composite type. Avoid this by modifying
letting it fail later due to incompatible types.
PR c/121507
gcc/c/ChangeLog:
* c-decl.cc (start_function): Adapt condition.
gcc/testsuite/ChangeLog:
* gcc.dg/pr121507.c: New test.
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index e79f77e6883..c509d7d53fa 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -10787,7 +10787,8 @@ start_function (struct c_declspecs *declspecs, struct
c_declarator *declarator,
tree newrt = TREE_TYPE (newtype);
if (old_decl != NULL_TREE
&& TREE_CODE (oldtype) == FUNCTION_TYPE
- && comptypes (oldrt, newrt))
+ && comptypes (oldrt, newrt)
+ && !TYPE_NO_NAMED_ARGS_STDARG_P (oldtype))
{
if (stdarg_p (oldtype))
{
diff --git a/gcc/testsuite/gcc.dg/pr121507.c b/gcc/testsuite/gcc.dg/pr121507.c
new file mode 100644
index 00000000000..2b9516aaffe
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr121507.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c23" } */
+
+int * xmalloc(...);
+int * xmalloc(n) /* { dg-error "conflicting types" } */
+ int n; /* { dg-warning "old-style function definition" "" {
target *-*-* } .-1 } */
+{
+ return 0;
+}
+