You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-Wcast-qual does not trigger on the following code in Clang, but does
in GCC.
const auto i = 42;
using T = int*;
auto p = T(&i);
The expected behavior is that a functional cast should trigger
the warning the same as the equivalent C cast because
the meaning is the same, and nothing about the functional cast
makes it easier to recognize that a const_cast is occurring.
Fixesllvm#62083
Differential Revision: https://reviews.llvm.org/D148276
Copy file name to clipboardExpand all lines: clang/test/SemaCXX/warn-cast-qual.cpp
+102Lines changed: 102 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -34,6 +34,17 @@ void foo_0() {
34
34
constint &a6 = (int &)((int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
35
35
constint &a7 = (int &)((constint &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
36
36
constint &a8 = (constint &)((int &)a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
37
+
38
+
using T = int&;
39
+
using T2 = constint&;
40
+
constint &a11 =T2(a); // no warning
41
+
int a22 = T(a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
42
+
constint &a33 = T(a); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
43
+
int &a44 = T(T2(a)); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
44
+
int &a55 = T(T(a)); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
45
+
constint &a66 = T(T(a)); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
46
+
int &a77 = T(T2(a)); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
47
+
constint &a88 = T2(T(a)); // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
37
48
}
38
49
39
50
voidfoo_1() {
@@ -49,6 +60,17 @@ void foo_1() {
49
60
volatileint &a6 = (int &)((int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
50
61
volatileint &a7 = (int &)((volatileint &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
51
62
volatileint &a8 = (volatileint &)((int &)a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
63
+
64
+
using T = int&;
65
+
using T2 = volatileint&;
66
+
volatileint &a11 =T2(a); // no warning
67
+
int a22 = T(a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
68
+
volatileint &a33 = T(a); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
69
+
int &a44 = T(T2(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
70
+
int &a55 = T(T(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
71
+
volatileint &a66 = T(T(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
72
+
int &a77 = T(T2(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
73
+
volatileint &a88 = T2(T(a)); // expected-warning {{cast from 'volatile int' to 'int &' drops volatile qualifier}}
52
74
}
53
75
54
76
voidfoo_2() {
@@ -64,6 +86,17 @@ void foo_2() {
64
86
constvolatileint &a6 = (int &)((int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
65
87
constvolatileint &a7 = (int &)((constvolatileint &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
66
88
constvolatileint &a8 = (constvolatileint &)((int &)a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
89
+
90
+
using T = int&;
91
+
using T2 = constvolatileint&;
92
+
constvolatileint &a11 =T2(a); // no warning
93
+
int a22 = T(a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
94
+
constvolatileint &a33 = T(a); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
95
+
int &a44 = T(T2(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
96
+
int &a55 = T(T(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
97
+
constvolatileint &a66 = T(T(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
98
+
constvolatileint &a77 = T(T2(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
99
+
constvolatileint &a88 = T2(T(a)); // expected-warning {{cast from 'const volatile int' to 'int &' drops const and volatile qualifiers}}
67
100
}
68
101
69
102
voidbar_0() {
@@ -78,6 +111,16 @@ void bar_0() {
78
111
79
112
constint **a4 = (constint **)((int **)a); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int **' to 'const int **' must have all intermediate pointers const qualified to be safe}}
80
113
constint **a5 = (constint **)((constint **)a); // no warning
114
+
115
+
using T = int**;
116
+
using T2 = constint**;
117
+
118
+
int **a00 = T(T2(a)) ; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
119
+
int **a11 = T(T(a)); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
120
+
121
+
constint **a44 = T2(T(a)); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'T' (aka 'int **') to 'T2' (aka 'const int **') must have all intermediate pointers const qualified to be safe}}
122
+
constint **a55 = T2(T2(a)); // no warning
123
+
81
124
}
82
125
83
126
voidbar_1() {
@@ -92,6 +135,15 @@ void bar_1() {
92
135
93
136
constint *&a4 = (constint *&)((int *&)a); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int *' to 'const int *&' must have all intermediate pointers const qualified to be safe}}
94
137
constint *&a5 = (constint *&)((constint *&)a); // no warning
138
+
139
+
using T = int*&;
140
+
using T2 = constint*&;
141
+
142
+
int *&a00 = T(T2(a)); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
143
+
int *&a11 = T(T(a)); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
144
+
145
+
constint *&a44 = T2(T(a)); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}} expected-warning {{cast from 'int *' to 'T2' (aka 'const int *&') must have all intermediate pointers const qualified to be safe}}
146
+
constint *&a55 = T2(T2(a)); // no warning
95
147
}
96
148
97
149
voidbaz_0() {
@@ -108,6 +160,14 @@ void baz_0() {
108
160
109
161
((C *)&S)->B(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
110
162
((C *)&S)->A(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
163
+
164
+
using T = C&;
165
+
using T2 = C*;
166
+
T(S).B(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}}
167
+
T(S).A(); // expected-warning {{cast from 'const C' to 'C &' drops const qualifier}}
168
+
169
+
T2(&S)->B(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
170
+
T2(&S)->A(); // expected-warning {{cast from 'const C *' to 'C *' drops const qualifier}}
111
171
}
112
172
113
173
voidbaz_1() {
@@ -127,6 +187,14 @@ void baz_1() {
127
187
128
188
*(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
129
189
*(int *)(&S.b) = 0; // no warning
190
+
191
+
using T = int&;
192
+
using T2 = int*;
193
+
T(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
194
+
T(S.b) = 0; // no warning
195
+
196
+
*T2(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
197
+
*T2(&S.b) = 0; // no warning
130
198
}
131
199
{
132
200
const C S;
@@ -136,5 +204,39 @@ void baz_1() {
136
204
137
205
*(int *)(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
138
206
*(int *)(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
207
+
208
+
using T = int&;
209
+
using T2 = int*;
210
+
T(S.a) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
211
+
T(S.b) = 0; // expected-warning {{cast from 'const int' to 'int &' drops const qualifier}}
212
+
213
+
*T2(&S.a) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
214
+
*T2(&S.b) = 0; // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
139
215
}
140
216
}
217
+
218
+
voidqux_0() {
219
+
constauto i = 42;
220
+
using T = int*;
221
+
auto p = T(&i); // expected-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
222
+
223
+
constauto i2 = 42;
224
+
using T2 = constint*;
225
+
auto p2 = T2(&i2);
226
+
227
+
volatileauto i3 = 42;
228
+
using T3= int*;
229
+
auto p3 = T3(&i3); // expected-warning {{cast from 'volatile int *' to 'int *' drops volatile qualifier}}
230
+
231
+
volatileauto i4 = 42;
232
+
using T4 = volatileint*;
233
+
auto p4 = T4(&i4);
234
+
235
+
constvolatileauto i5 = 42;
236
+
using T5= int*;
237
+
auto p5 = T5(&i5); // expected-warning {{cast from 'const volatile int *' to 'int *' drops const and volatile qualifiers}}
0 commit comments