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

commit r16-1351-gc1904cd27b2bb69f884e4958d9ceb78159470975
Author: Martin Uecker <uec...@tugraz.at>
Date:   Thu Jun 5 23:55:39 2025 +0200

    c: partial fix for qualifier inconsistency [PR120510]
    
    Checking assertions revealed that we sometimes produce
    composite types with incorrect qualifiers, e.g. the example
    
    int f(int [_Atomic]);
    int f(int [_Atomic]);
    int f(int [_Atomic]);
    
    was rejected because atomic was lost in the second declaration.
    
            PR c/120510
    
    gcc/c/ChangeLog:
            * c-typeck.cc (composite_types_internal): Handle arrays
            declared with atomic for function arguments.
    
    gcc/testsuite/ChangeLog:
            * gcc.dg/pr120510.c

Diff:
---
 gcc/c/c-typeck.cc               | 14 ++++++++------
 gcc/testsuite/gcc.dg/pr120510.c |  7 +++++++
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index b59b5c8a8bb1..0ffb9f65bf13 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -911,14 +911,16 @@ composite_type_internal (tree t1, tree t2, struct 
composite_cache* cache)
             p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n))
          {
             tree mv1 = TREE_VALUE (p1);
-            if (mv1 && mv1 != error_mark_node
-                && TREE_CODE (mv1) != ARRAY_TYPE)
-              mv1 = TYPE_MAIN_VARIANT (mv1);
+            if (mv1 && mv1 != error_mark_node)
+              mv1 = TYPE_ATOMIC (mv1)
+                    ? c_build_qualified_type (TYPE_MAIN_VARIANT (mv1), 
TYPE_QUAL_ATOMIC)
+                    : TYPE_MAIN_VARIANT (mv1);
 
             tree mv2 = TREE_VALUE (p2);
-            if (mv2 && mv2 != error_mark_node
-                && TREE_CODE (mv2) != ARRAY_TYPE)
-              mv2 = TYPE_MAIN_VARIANT (mv2);
+            if (mv2 && mv2 != error_mark_node)
+              mv2 = TYPE_ATOMIC (mv2)
+                    ? c_build_qualified_type (TYPE_MAIN_VARIANT (mv2), 
TYPE_QUAL_ATOMIC)
+                    : TYPE_MAIN_VARIANT (mv2);
 
            /* A null type means arg type is not specified.
               Take whatever the other function type has.  */
diff --git a/gcc/testsuite/gcc.dg/pr120510.c b/gcc/testsuite/gcc.dg/pr120510.c
new file mode 100644
index 000000000000..d99c329c1d7f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr120510.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c23" } */
+
+void f (int [_Atomic]);
+void f (int [_Atomic]);
+void f (int [_Atomic]);
+

Reply via email to