[gcc r16-1351] c: partial fix for qualifier inconsistency [PR120510]
Martin Uecker
uecker@gcc.gnu.org
Mon Jun 9 23:14:42 GMT 2025
https://gcc.gnu.org/g:c1904cd27b2bb69f884e4958d9ceb78159470975
commit r16-1351-gc1904cd27b2bb69f884e4958d9ceb78159470975
Author: Martin Uecker <uecker@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]);
+
More information about the Gcc-cvs
mailing list