1 // RUN: %clang_cc1 -triple x86_64-linux -fexperimental-new-constant-interpreter -verify=expected,all -std=c11 -Wcast-qual %s
2 // RUN: %clang_cc1 -triple x86_64-linux -fexperimental-new-constant-interpreter -pedantic -verify=pedantic,pedantic-expected,all -std=c11 -Wcast-qual %s
3 // RUN: %clang_cc1 -triple x86_64-linux -verify=ref,all -std=c11 -Wcast-qual %s
4 // RUN: %clang_cc1 -triple x86_64-linux -pedantic -verify=pedantic,pedantic-ref,all -std=c11 -Wcast-qual %s
6 typedef __INTPTR_TYPE__
intptr_t;
7 typedef __PTRDIFF_TYPE__
ptrdiff_t;
11 _Static_assert(__objc_yes
, "");
12 _Static_assert(!__objc_no
, "");
14 _Static_assert(0 != 1, "");
15 _Static_assert(1.0 == 1.0, ""); // pedantic-ref-warning {{not an integer constant expression}} \
16 // pedantic-expected-warning {{not an integer constant expression}}
17 _Static_assert(1 && 1.0, ""); // pedantic-ref-warning {{not an integer constant expression}} \
18 // pedantic-expected-warning {{not an integer constant expression}}
19 _Static_assert( (5 > 4) + (3 > 2) == 2, "");
20 _Static_assert(!!1.0, ""); // pedantic-ref-warning {{not an integer constant expression}} \
21 // pedantic-expected-warning {{not an integer constant expression}}
22 _Static_assert(!!1, "");
24 _Static_assert(!(_Bool
){(void*)0}, ""); // pedantic-ref-warning {{not an integer constant expression}} \
25 // pedantic-expected-warning {{not an integer constant expression}}
27 int a
= (1 == 1 ? 5 : 3);
28 _Static_assert(a
== 5, ""); // all-error {{not an integral constant expression}}
30 const int DiscardedPtrToIntCast
= ((intptr_t)((void*)0), 0); // all-warning {{left operand of comma operator has no effect}}
33 _Static_assert(b
== 3, ""); // pedantic-ref-warning {{not an integer constant expression}} \
34 // pedantic-expected-warning {{not an integer constant expression}}
36 const int c
; // all-note {{declared here}}
37 _Static_assert(c
== 0, ""); // ref-error {{not an integral constant expression}} \
38 // ref-note {{initializer of 'c' is unknown}} \
39 // pedantic-ref-error {{not an integral constant expression}} \
40 // pedantic-ref-note {{initializer of 'c' is unknown}} \
41 // expected-error {{not an integral constant expression}} \
42 // expected-note {{initializer of 'c' is unknown}} \
43 // pedantic-expected-error {{not an integral constant expression}} \
44 // pedantic-expected-note {{initializer of 'c' is unknown}}
46 _Static_assert(&c
!= 0, ""); // ref-warning {{always true}} \
47 // pedantic-ref-warning {{always true}} \
48 // pedantic-ref-warning {{is a GNU extension}} \
49 // expected-warning {{always true}} \
50 // pedantic-expected-warning {{always true}} \
51 // pedantic-expected-warning {{is a GNU extension}}
52 _Static_assert(&a
!= 0, ""); // ref-warning {{always true}} \
53 // pedantic-ref-warning {{always true}} \
54 // pedantic-ref-warning {{is a GNU extension}} \
55 // expected-warning {{always true}} \
56 // pedantic-expected-warning {{always true}} \
57 // pedantic-expected-warning {{is a GNU extension}}
58 _Static_assert((&c
+ 1) != 0, ""); // pedantic-ref-warning {{is a GNU extension}} \
59 // pedantic-expected-warning {{is a GNU extension}}
60 _Static_assert((&a
+ 100) != 0, ""); // pedantic-ref-warning {{is a GNU extension}} \
61 // pedantic-ref-note {{100 of non-array}} \
62 // pedantic-expected-note {{100 of non-array}} \
63 // pedantic-expected-warning {{is a GNU extension}}
64 _Static_assert((&a
- 100) != 0, ""); // pedantic-ref-warning {{is a GNU extension}} \
65 // pedantic-expected-warning {{is a GNU extension}} \
66 // pedantic-ref-note {{-100 of non-array}} \
67 // pedantic-expected-note {{-100 of non-array}}
68 /// extern variable of a composite type.
69 extern struct Test50S Test50
;
70 _Static_assert(&Test50
!= (void*)0, ""); // all-warning {{always true}} \
71 // pedantic-warning {{is a GNU extension}} \
72 // pedantic-note {{this conversion is not allowed in a constant expression}}
75 int a2
[(intptr_t)&((struct y
*)0)->y
]; // all-warning {{folded to constant array}}
77 const struct y
*yy
= (struct y
*)0;
78 const intptr_t L
= (intptr_t)(&(yy
->y
)); // all-error {{not a compile-time constant}}
80 _Static_assert((long)&((struct y
*)0)->y
> 0, ""); // pedantic-ref-warning {{GNU extension}} \
81 // pedantic-ref-note {{this conversion is not allowed in a constant expression}} \
82 // pedantic-expected-warning {{GNU extension}} \
83 // pedantic-expected-note {{this conversion is not allowed in a constant expression}}
85 const ptrdiff_t m
= &m
+ 137 - &m
;
86 _Static_assert(m
== 137, ""); // pedantic-ref-warning {{GNU extension}} \
87 // pedantic-expected-warning {{GNU extension}}
89 /// from test/Sema/switch.c, used to cause an assertion failure.
92 default: z
--; // all-error {{'default' statement not in switch}}
97 int chooseexpr
[__builtin_choose_expr(1, 1, expr
)];
100 return (i
, 65537) * 65537; // all-warning {{left operand of comma operator has no effect}} \
101 // all-warning {{overflow in expression; result is 131'073 with type 'int'}}
104 #pragma clang diagnostic ignored "-Wpointer-to-int-cast"
108 char name2
[(int)&((struct ArrayStruct
*)0)->n
]; // expected-warning {{folded to constant array}} \
109 // pedantic-expected-warning {{folded to constant array}} \
110 // ref-warning {{folded to constant array}} \
111 // pedantic-ref-warning {{folded to constant array}}
112 _Static_assert(sizeof(name2
) == 0, "");
114 #ifdef __SIZEOF_INT128__
115 void *PR28739d
= &(&PR28739d
)[(__int128
)(unsigned long)-1]; // all-warning {{refers past the last possible element}}
118 extern float global_float
;
119 struct XX
{ int a
, *b
; };
120 struct XY
{ int before
; struct XX xx
, *xp
; float* after
; } xy
[] = {
121 0, 0, &xy
[0].xx
.a
, &xy
[0].xx
, &global_float
,
122 [1].xx
= 0, &xy
[1].xx
.a
, &xy
[1].xx
, &global_float
,
123 0, // all-note {{previous initialization is here}}
124 0, // all-note {{previous initialization is here}}
125 [2].before
= 0, // all-warning {{initializer overrides prior initialization of this subobject}}
126 0, // all-warning {{initializer overrides prior initialization of this subobject}}
127 &xy
[2].xx
.a
, &xy
[2].xx
, &global_float
131 int array
[256] = { 0 }; // expected-note {{array 'array' declared here}} \
132 // pedantic-expected-note {{array 'array' declared here}} \
133 // ref-note {{array 'array' declared here}} \
134 // pedantic-ref-note {{array 'array' declared here}}
136 int val
= array
[b
]; // expected-warning {{array index -1 is before the beginning of the array}} \
137 // pedantic-expected-warning {{array index -1 is before the beginning of the array}} \
138 // ref-warning {{array index -1 is before the beginning of the array}} \
139 // pedantic-ref-warning {{array index -1 is before the beginning of the array}}
149 const struct C S
= {0, 0};
151 *(int *)(&S
.a
) = 0; // all-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
152 *(int *)(&S
.b
) = 0; // all-warning {{cast from 'const int *' to 'int *' drops const qualifier}}
155 /// Complex-to-bool casts.
156 const int A
= ((_Complex
double)1.0 ? 21 : 1);
157 _Static_assert(A
== 21, ""); // pedantic-ref-warning {{GNU extension}} \
158 // pedantic-expected-warning {{GNU extension}}
160 const int CTI1
= ((_Complex
double){0.0, 1.0}); // pedantic-ref-warning {{extension}} \
161 // pedantic-expected-warning {{extension}}
162 _Static_assert(CTI1
== 0, ""); // pedantic-ref-warning {{GNU extension}} \
163 // pedantic-expected-warning {{GNU extension}}
165 const _Bool CTB2
= (_Bool
)(_Complex
double){0.0, 1.0}; // pedantic-ref-warning {{extension}} \
166 // pedantic-expected-warning {{extension}}
167 _Static_assert(CTB2
, ""); // pedantic-ref-warning {{GNU extension}} \
168 // pedantic-expected-warning {{GNU extension}}
170 const _Bool CTB3
= (_Complex
double){0.0, 1.0}; // pedantic-ref-warning {{extension}} \
171 // pedantic-expected-warning {{extension}}
172 _Static_assert(CTB3
, ""); // pedantic-ref-warning {{GNU extension}} \
173 // pedantic-expected-warning {{GNU extension}}
176 int t1
= sizeof(int);
181 void localCompoundLiteral(void) {
182 struct S
{ int x
, y
; } s
= {}; // pedantic-expected-warning {{use of an empty initializer}} \
183 // pedantic-ref-warning {{use of an empty initializer}}
187 } t1
= { 1, {} }; // pedantic-expected-warning {{use of an empty initializer}} \
188 // pedantic-ref-warning {{use of an empty initializer}}
191 (int){}, // pedantic-expected-warning {{use of an empty initializer}} \
192 // pedantic-ref-warning {{use of an empty initializer}}
193 {} // pedantic-expected-warning {{use of an empty initializer}} \
194 // pedantic-ref-warning {{use of an empty initializer}}
199 struct StrA
{int a
; };
200 const struct StrA sa
= { 12 };
201 const struct StrA
* const sb
= &sa
;
202 const struct StrA sc
= *sb
;
203 _Static_assert(sc
.a
== 12, ""); // pedantic-ref-warning {{GNU extension}} \
204 // pedantic-expected-warning {{GNU extension}}
206 _Static_assert(((void*)0 + 1) != (void*)0, ""); // pedantic-expected-warning {{arithmetic on a pointer to void is a GNU extension}} \
207 // pedantic-expected-warning {{not an integer constant expression}} \
208 // pedantic-expected-note {{cannot perform pointer arithmetic on null pointer}} \
209 // pedantic-ref-warning {{arithmetic on a pointer to void is a GNU extension}} \
210 // pedantic-ref-warning {{not an integer constant expression}} \
211 // pedantic-ref-note {{cannot perform pointer arithmetic on null pointer}}
213 typedef __INTPTR_TYPE__
intptr_t;
214 int array
[(intptr_t)(int*)1]; // ref-warning {{variable length array folded to constant array}} \
215 // pedantic-ref-warning {{variable length array folded to constant array}} \
216 // expected-warning {{variable length array folded to constant array}} \
217 // pedantic-expected-warning {{variable length array folded to constant array}}
219 int castViaInt
[*(int*)(unsigned long)"test"]; // ref-error {{variable length array}} \
220 // pedantic-ref-error {{variable length array}} \
221 // expected-error {{variable length array}} \
222 // pedantic-expected-error {{variable length array}}
224 const void (*const funcp
)(void) = (void*)123; // pedantic-warning {{converts between void pointer and function pointer}}
225 _Static_assert(funcp
== (void*)0, ""); // all-error {{failed due to requirement 'funcp == (void *)0'}} \
226 // pedantic-warning {{expression is not an integer constant expression}}
227 _Static_assert(funcp
== (void*)123, ""); // pedantic-warning {{equality comparison between function pointer and void pointer}} \
228 // pedantic-warning {{expression is not an integer constant expression}}
230 void unaryops(void) {
231 (void)(++(struct x
{unsigned x
;}){3}.x
);
232 (void)(--(struct y
{unsigned x
;}){3}.x
);
233 (void)(++(struct z
{float x
;}){3}.x
);
234 (void)(--(struct w
{float x
;}){3}.x
);
236 (void)((struct xx
{unsigned x
;}){3}.x
++);
237 (void)((struct yy
{unsigned x
;}){3}.x
--);
238 (void)((struct zz
{float x
;}){3}.x
++);
239 (void)((struct ww
{float x
;}){3}.x
--);
242 /// This used to fail because we didn't properly mark the struct
243 /// initialized through a CompoundLiteralExpr as initialized.
248 int Y
__attribute__((annotate(
249 "GlobalValAnnotationWithArgs",
251 (struct TestStruct
) { .a
= 1, .b
= 2 }
254 #ifdef __SIZEOF_INT128__
256 const __int128 K
= (__int128
)(int*)0;
257 const unsigned __int128 KU
= (unsigned __int128
)(int*)0;
263 a
[0] = test3
; // all-error {{incompatible pointer to integer conversion assigning to 'int' from 'int (void)'}}
266 /// This tests that we have full type info, even for values we cannot read.
268 _Static_assert(&dummyarray
[0] < &dummyarray
[1], ""); // pedantic-warning {{GNU extension}}
270 void addrlabelexpr(void) {
272 static void *ps
[] = { &&a0
}; // pedantic-warning {{use of GNU address-of-label extension}}
278 return &cv2
; // pedantic-warning{{address of an expression of type 'void'}}
281 __attribute__((weak
)) const unsigned int test10_bound
= 10;
282 char test10_global
[test10_bound
]; // all-error {{variable length array declaration not allowed at file scope}}
284 char test10_local
[test10_bound
] = "help"; // all-error {{variable-sized object may not be initialized}}
287 void SuperSpecialFunc(void) {
288 const int SuperSpecialCase
= 10;
289 _Static_assert((sizeof(SuperSpecialCase
) == 12 && SuperSpecialCase
== 3) || SuperSpecialCase
== 10, ""); // pedantic-warning {{GNU extension}}
294 static int *y
[1] = {({ static int _x
= 20; (void*)0;})}; // all-error {{initializer element is not a compile-time constant}} \
295 // pedantic-warning {{use of GNU statement expression extension}}
298 enum teste1
test1f(void), (*test1
)(void) = test1f
; // pedantic-warning {{ISO C forbids forward references to 'enum' types}}
299 enum teste1
{ TEST1
};
302 _Static_assert(func
+ 1 - func
== 1, ""); // pedantic-warning {{arithmetic on a pointer to the function type}} \
303 // pedantic-warning {{arithmetic on pointers to the function type}} \
304 // pedantic-warning {{not an integer constant expression}}
305 _Static_assert(func
+ 0xdead000000000000UL
- 0xdead000000000000UL
== func
, ""); // pedantic-warning 2{{arithmetic on a pointer to the function type}} \
306 // pedantic-warning {{not an integer constant expression}} \
307 // pedantic-note {{cannot refer to element 16045481047390945280 of non-array object in a constant expression}}
308 _Static_assert(func
+ 1 != func
, ""); // pedantic-warning {{arithmetic on a pointer to the function type}} \
309 // pedantic-warning {{expression is not an integer constant expression}}
310 func
+ 0xdead000000000000UL
; // all-warning {{expression result unused}} \
311 // pedantic-warning {{arithmetic on a pointer to the function type}}
312 func
- 0xdead000000000000UL
; // all-warning {{expression result unused}} \
313 // pedantic-warning {{arithmetic on a pointer to the function type}}