Skip to content

Commit 1360290

Browse files
committed
c++: Implement CWG 2654 - Un-deprecation of compound volatile assignments
The following patch implements CWG 2654. 2022-11-16 Jakub Jelinek <[email protected]> * typeck.cc (cp_build_modify_expr): Implement CWG 2654 - Un-deprecation of compound volatile assignments. Remove -Wvolatile warning about compound volatile assignments. * g++.dg/cpp2a/volatile1.C (fn2, fn3, racoon): Adjust expected diagnostics. * g++.dg/cpp2a/volatile3.C (fn2, fn3, racoon): Likewise. * g++.dg/cpp2a/volatile5.C (f): Likewise. * g++.dg/ext/vector25.C (foo): Don't expect a warning. * g++.dg/cpp1y/new1.C (test_unused): Likewise.
1 parent d59858f commit 1360290

File tree

6 files changed

+19
-32
lines changed

6 files changed

+19
-32
lines changed

gcc/cp/typeck.cc

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9513,19 +9513,6 @@ cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode,
95139513
&& MAYBE_CLASS_TYPE_P (TREE_TYPE (lhstype)))
95149514
|| MAYBE_CLASS_TYPE_P (lhstype)));
95159515

9516-
/* An expression of the form E1 op= E2. [expr.ass] says:
9517-
"Such expressions are deprecated if E1 has volatile-qualified
9518-
type and op is not one of the bitwise operators |, &, ^."
9519-
We warn here rather than in cp_genericize_r because
9520-
for compound assignments we are supposed to warn even if the
9521-
assignment is a discarded-value expression. */
9522-
if (modifycode != BIT_AND_EXPR
9523-
&& modifycode != BIT_IOR_EXPR
9524-
&& modifycode != BIT_XOR_EXPR
9525-
&& (TREE_THIS_VOLATILE (lhs) || CP_TYPE_VOLATILE_P (lhstype)))
9526-
warning_at (loc, OPT_Wvolatile,
9527-
"compound assignment with %<volatile%>-qualified left "
9528-
"operand is deprecated");
95299516
/* Preevaluate the RHS to make sure its evaluation is complete
95309517
before the lvalue-to-rvalue conversion of the LHS:
95319518

gcc/testsuite/g++.dg/cpp1y/new1.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void
6565
test_unused() {
6666
volatile double d = 0.0;
6767
double *p = new double ();
68-
d += 1.0; // { dg-warning "deprecated" "" { target c++2a } }
68+
d += 1.0;
6969
delete p;
7070
}
7171

gcc/testsuite/g++.dg/cpp2a/volatile1.C

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ fn2 ()
7474
decltype(i = vi = 42) x3 = i;
7575

7676
// Compound assignments.
77-
vi += i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
78-
vi -= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
79-
vi %= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
77+
vi += i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
78+
vi -= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
79+
vi %= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8080
vi ^= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8181
vi |= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8282
vi &= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
83-
vi /= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
83+
vi /= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8484
vi = vi += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
8585
vi += vi = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
8686
i *= vi;
87-
decltype(vi -= 42) x2 = vi; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
87+
decltype(vi -= 42) x2 = vi; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8888

8989
// Structured bindings.
9090
int a[] = { 10, 5 };
@@ -107,12 +107,12 @@ fn3 ()
107107
volatile U u;
108108
u.c = 42;
109109
i = u.c = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
110-
u.c += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
110+
u.c += 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
111111

112112
volatile T t;
113113
t.a = 3;
114114
j = t.a = 3; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
115-
t.a += 3; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
115+
t.a += 3; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
116116

117117
volatile int *src = &i;
118118
*src; // No assignment, don't warn.
@@ -135,7 +135,7 @@ void raccoon ()
135135
volatile T t, u;
136136
t = 42;
137137
u = t = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
138-
t += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" "" { target c++20 } }
138+
t += 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
139139
t &= 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
140140
}
141141

gcc/testsuite/g++.dg/cpp2a/volatile3.C

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,17 @@ fn2 ()
7575
decltype(i = vi = 42) x3 = i;
7676

7777
// Compound assignments.
78-
vi += i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
79-
vi -= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
80-
vi %= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
78+
vi += i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
79+
vi -= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
80+
vi %= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8181
vi ^= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8282
vi |= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8383
vi &= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
84-
vi /= i; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
84+
vi /= i; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8585
vi = vi += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
8686
vi += vi = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
8787
i *= vi;
88-
decltype(vi -= 42) x2 = vi; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
88+
decltype(vi -= 42) x2 = vi; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
8989

9090
// Structured bindings.
9191
int a[] = { 10, 5 };
@@ -108,12 +108,12 @@ fn3 ()
108108
volatile U u;
109109
u.c = 42;
110110
i = u.c = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
111-
u.c += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
111+
u.c += 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
112112

113113
volatile T t;
114114
t.a = 3;
115115
j = t.a = 3; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
116-
t.a += 3; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
116+
t.a += 3; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
117117

118118
volatile int *src = &i;
119119
*src; // No assignment, don't warn.
@@ -136,7 +136,7 @@ void raccoon ()
136136
volatile T t, u;
137137
t = 42;
138138
u = t = 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
139-
t += 42; // { dg-warning "assignment with .volatile.-qualified left operand is deprecated" }
139+
t += 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
140140
t &= 42; // { dg-bogus "assignment with .volatile.-qualified left operand is deprecated" }
141141
}
142142

gcc/testsuite/g++.dg/cpp2a/volatile5.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ void
77
f (bool b)
88
{
99
(b ? x : y) = 1;
10-
(b ? x : y) += 1; // { dg-warning "compound assignment" "" { target c++20 } }
10+
(b ? x : y) += 1; // { dg-bogus "compound assignment" }
1111
z = (b ? x : y) = 1; // { dg-warning "using value of assignment" "" { target c++20 } }
1212
((z = 2) ? x : y) = 1; // { dg-warning "using value of assignment" "" { target c++20 } }
1313
(b ? (x = 2) : y) = 1; // { dg-warning "using value of assignment" "" { target c++20 } }

gcc/testsuite/g++.dg/ext/vector25.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ volatile int i __attribute__((vector_size(8)));
22

33
void foo()
44
{
5-
i += i; // { dg-warning "deprecated" "" { target c++2a } }
5+
i += i; // { dg-bogus "deprecated" }
66
}

0 commit comments

Comments
 (0)