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  <muecker@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: New test.
This commit is contained in:
Martin Uecker 2020-12-16 23:47:52 +01:00
parent ec13758ed4
commit 58a45ce44a
2 changed files with 21 additions and 10 deletions

View File

@ -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

View File

@ -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;