Here is a patch to drop qualifiers in assignment expressions. -- Martin
C: Drop qualifiers of assignment expressions. [PR98047] ISO C17 6.5.15.1 specifies that the result is the type the LHS would have after lvalue conversion. 2020-12-12 Martin Uecker <muec...@gwdg.de> gcc/c/ PR c/98047 * c-typeck.c (build_modify_expr): Drop qualifiers. gcc/testsuite/ PR c/98047 * gcc.dg/qual-assign-7.c.c: New test. diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 138af073925..d8b2ca12766 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -6276,16 +6276,9 @@ build_modify_expr (location_t location, tree lhs, tree lhs_origtype, "enum conversion in assignment is invalid in C++"); } - /* If the lhs is atomic, remove that qualifier. */ - if (is_atomic_op) - { - lhstype = build_qualified_type (lhstype, - (TYPE_QUALS (lhstype) - & ~TYPE_QUAL_ATOMIC)); - olhstype = build_qualified_type (olhstype, - (TYPE_QUALS (lhstype) - & ~TYPE_QUAL_ATOMIC)); - } + /* Remove qualifiers. */ + lhstype = build_qualified_type (lhstype, TYPE_UNQUALIFIED); + olhstype = build_qualified_type (olhstype, TYPE_UNQUALIFIED); /* Convert new value to destination type. Fold it first, then restore any excess precision information, for the sake of diff --git a/gcc/testsuite/gcc.dg/qual-assign-7.c b/gcc/testsuite/gcc.dg/qual-assign-7.c new file mode 100644 index 00000000000..3e064e82f5f --- /dev/null +++ b/gcc/testsuite/gcc.dg/qual-assign-7.c @@ -0,0 +1,18 @@ +/* test that assignment drops qualifiers, Bug 98047 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + + +volatile int jv; +extern int j; +extern typeof(jv = 1) j; + +_Atomic int ja; +extern typeof(ja = 1) j; + +int * __restrict pa; +extern int *p; +extern typeof(pa = 0) p; + + +