From: Martin Uecker Date: Wed, 16 Dec 2020 22:47:52 +0000 (+0100) Subject: C: Drop qualifiers of assignment expressions. [PR98047] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=58a45ce44a9acf3d15fada265d2a391a8e1bc960;p=gcc.git 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-16 Martin Uecker gcc/c/ PR c/98047 * c-typeck.c (build_modify_expr): Drop qualifiers. gcc/testsuite/ PR c/98047 * gcc.dg/qual-assign-7.c: New test. --- diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 7d58e8de342..f68cb01529b 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -6275,16 +6275,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; + + +