https://gcc.gnu.org/g:b46e4afaff5b2cfd23b6d4d364d12f3f7ec07f78

commit r16-6473-gb46e4afaff5b2cfd23b6d4d364d12f3f7ec07f78
Author: Martin Uecker <[email protected]>
Date:   Sun Dec 21 19:10:56 2025 +0100

    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 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:
---
 gcc/c/c-decl.cc                 |  3 ++-
 gcc/testsuite/gcc.dg/pr121507.c | 10 ++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index fb17db4cb8ec..89ccf8205708 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 000000000000..2b9516aaffe6
--- /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;
+}
+

Reply via email to