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 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.
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))
{
--- /dev/null
+/* { 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;
+}
+