From 58a45ce44a9acf3d15fada265d2a391a8e1bc960 Mon Sep 17 00:00:00 2001 From: Martin Uecker Date: Wed, 16 Dec 2020 23:47:52 +0100 Subject: [PATCH] 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. --- gcc/c/c-typeck.c | 13 +++---------- gcc/testsuite/gcc.dg/qual-assign-7.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/qual-assign-7.c 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; + + + -- 2.30.2