1 // RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
2 // RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both
3 // RUN: %clang_cc1 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
4 // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
5 // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both
6 // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
7 // RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
8 // RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
12 constexpr char kFoobar
[6] = {'f','o','o','b','a','r'};
13 constexpr char kFoobazfoobar
[12] = {'f','o','o','b','a','z','f','o','o','b','a','r'};
15 static_assert(__builtin_strcmp("", "") == 0, "");
16 static_assert(__builtin_strcmp("abab", "abab") == 0, "");
17 static_assert(__builtin_strcmp("abab", "abba") == -1, "");
18 static_assert(__builtin_strcmp("abab", "abaa") == 1, "");
19 static_assert(__builtin_strcmp("ababa", "abab") == 1, "");
20 static_assert(__builtin_strcmp("abab", "ababa") == -1, "");
21 static_assert(__builtin_strcmp("a\203", "a") == 1, "");
22 static_assert(__builtin_strcmp("a\203", "a\003") == 1, "");
23 static_assert(__builtin_strcmp("abab\0banana", "abab") == 0, "");
24 static_assert(__builtin_strcmp("abab", "abab\0banana") == 0, "");
25 static_assert(__builtin_strcmp("abab\0banana", "abab\0canada") == 0, "");
26 static_assert(__builtin_strcmp(0, "abab") == 0, ""); // both-error {{not an integral constant}} \
27 // both-note {{dereferenced null}}
28 static_assert(__builtin_strcmp("abab", 0) == 0, ""); // both-error {{not an integral constant}} \
29 // both-note {{dereferenced null}}
31 static_assert(__builtin_strcmp(kFoobar
, kFoobazfoobar
) == -1, "");
32 static_assert(__builtin_strcmp(kFoobar
, kFoobazfoobar
+ 6) == 0, ""); // both-error {{not an integral constant}} \
33 // both-note {{dereferenced one-past-the-end}}
35 /// Used to assert because we're passing a dummy pointer to
36 /// __builtin_strcmp() when evaluating the return statement.
37 constexpr bool char_memchr_mutable() {
38 char buffer
[] = "mutable";
39 return __builtin_strcmp(buffer
, "mutable") == 0;
41 static_assert(char_memchr_mutable(), "");
44 /// Copied from constant-expression-cxx11.cpp
46 constexpr const char *a
= "foo\0quux";
47 constexpr char b
[] = "foo\0quux";
48 constexpr int f() { return 'u'; }
49 constexpr char c
[] = { 'f', 'o', 'o', 0, 'q', f(), 'u', 'x', 0 };
51 static_assert(__builtin_strlen("foo") == 3, "");
52 static_assert(__builtin_strlen("foo\0quux") == 3, "");
53 static_assert(__builtin_strlen("foo\0quux" + 4) == 4, "");
55 constexpr bool check(const char *p
) {
56 return __builtin_strlen(p
) == 3 &&
57 __builtin_strlen(p
+ 1) == 2 &&
58 __builtin_strlen(p
+ 2) == 1 &&
59 __builtin_strlen(p
+ 3) == 0 &&
60 __builtin_strlen(p
+ 4) == 4 &&
61 __builtin_strlen(p
+ 5) == 3 &&
62 __builtin_strlen(p
+ 6) == 2 &&
63 __builtin_strlen(p
+ 7) == 1 &&
64 __builtin_strlen(p
+ 8) == 0;
67 static_assert(check(a
), "");
68 static_assert(check(b
), "");
69 static_assert(check(c
), "");
71 constexpr int over1
= __builtin_strlen(a
+ 9); // both-error {{constant expression}} \
72 // both-note {{one-past-the-end}}
73 constexpr int over2
= __builtin_strlen(b
+ 9); // both-error {{constant expression}} \
74 // both-note {{one-past-the-end}}
75 constexpr int over3
= __builtin_strlen(c
+ 9); // both-error {{constant expression}} \
76 // both-note {{one-past-the-end}}
78 constexpr int under1
= __builtin_strlen(a
- 1); // both-error {{constant expression}} \
79 // both-note {{cannot refer to element -1}}
80 constexpr int under2
= __builtin_strlen(b
- 1); // both-error {{constant expression}} \
81 // both-note {{cannot refer to element -1}}
82 constexpr int under3
= __builtin_strlen(c
- 1); // both-error {{constant expression}} \
83 // both-note {{cannot refer to element -1}}
85 constexpr char d
[] = { 'f', 'o', 'o' }; // no nul terminator.
86 constexpr int bad
= __builtin_strlen(d
); // both-error {{constant expression}} \
87 // both-note {{one-past-the-end}}
91 constexpr double NaN1
= __builtin_nan("");
93 /// The current interpreter does not accept this, but it should.
94 constexpr float NaN2
= __builtin_nans([](){return "0xAE98";}()); // ref-error {{must be initialized by a constant expression}}
95 #if __cplusplus < 201703L
96 // expected-error@-2 {{must be initialized by a constant expression}}
99 constexpr double NaN3
= __builtin_nan("foo"); // both-error {{must be initialized by a constant expression}}
100 constexpr float NaN4
= __builtin_nanf("");
101 //constexpr long double NaN5 = __builtin_nanf128("");
103 /// FIXME: This should be accepted by the current interpreter as well.
104 constexpr char f
[] = {'0', 'x', 'A', 'E', '\0'};
105 constexpr double NaN6
= __builtin_nan(f
); // ref-error {{must be initialized by a constant expression}}
107 /// FIXME: Current interpreter misses diagnostics.
108 constexpr char f2
[] = {'0', 'x', 'A', 'E'}; /// No trailing 0 byte.
109 constexpr double NaN7
= __builtin_nan(f2
); // both-error {{must be initialized by a constant expression}} \
110 // expected-note {{read of dereferenced one-past-the-end pointer}}
111 static_assert(!__builtin_issignaling(__builtin_nan("")), "");
112 static_assert(__builtin_issignaling(__builtin_nans("")), "");
116 constexpr float f1
= __builtin_fmin(1.0, 2.0f
);
117 static_assert(f1
== 1.0f
, "");
119 constexpr float min
= __builtin_fmin(__builtin_nan(""), 1);
120 static_assert(min
== 1, "");
121 constexpr float min2
= __builtin_fmin(1, __builtin_nan(""));
122 static_assert(min2
== 1, "");
123 constexpr float min3
= __builtin_fmin(__builtin_inf(), __builtin_nan(""));
124 static_assert(min3
== __builtin_inf(), "");
128 static_assert(__builtin_isinf(__builtin_inf()), "");
129 static_assert(!__builtin_isinf(1.0), "");
131 static_assert(__builtin_isfinite(1.0), "");
132 static_assert(!__builtin_isfinite(__builtin_inf()), "");
134 static_assert(__builtin_isnormal(1.0), "");
135 static_assert(!__builtin_isnormal(__builtin_inf()), "");
138 static_assert(__builtin_issubnormal(0x1p
-1070), "");
140 static_assert(!__builtin_issubnormal(__builtin_inf()), "");
142 static_assert(__builtin_iszero(0.0), "");
143 static_assert(!__builtin_iszero(__builtin_inf()), "");
145 static_assert(__builtin_issignaling(__builtin_nans("")), "");
146 static_assert(!__builtin_issignaling(__builtin_inf()), "");
149 namespace isfpclass
{
150 char isfpclass_inf_pos_0
[__builtin_isfpclass(__builtin_inf(), 0x0200) ? 1 : -1]; // fcPosInf
151 char isfpclass_inf_pos_1
[!__builtin_isfpclass(__builtin_inff(), 0x0004) ? 1 : -1]; // fcNegInf
152 char isfpclass_inf_pos_2
[__builtin_isfpclass(__builtin_infl(), 0x0207) ? 1 : -1]; // fcSNan|fcQNan|fcNegInf|fcPosInf
153 char isfpclass_inf_pos_3
[!__builtin_isfpclass(__builtin_inf(), 0x01F8) ? 1 : -1]; // fcFinite
154 char isfpclass_pos_0
[__builtin_isfpclass(1.0, 0x0100) ? 1 : -1]; // fcPosNormal
155 char isfpclass_pos_1
[!__builtin_isfpclass(1.0f
, 0x0008) ? 1 : -1]; // fcNegNormal
156 char isfpclass_pos_2
[__builtin_isfpclass(1.0L, 0x01F8) ? 1 : -1]; // fcFinite
157 char isfpclass_pos_3
[!__builtin_isfpclass(1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan
159 char isfpclass_pdenorm_0
[__builtin_isfpclass(1.0e-40f
, 0x0080) ? 1 : -1]; // fcPosSubnormal
160 char isfpclass_pdenorm_1
[__builtin_isfpclass(1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite
161 char isfpclass_pdenorm_2
[!__builtin_isfpclass(1.0e-40f
, 0x003C) ? 1 : -1]; // fcNegative
162 char isfpclass_pdenorm_3
[!__builtin_isfpclass(1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite
164 char isfpclass_pzero_0
[__builtin_isfpclass(0.0f
, 0x0060) ? 1 : -1]; // fcZero
165 char isfpclass_pzero_1
[__builtin_isfpclass(0.0, 0x01F8) ? 1 : -1]; // fcFinite
166 char isfpclass_pzero_2
[!__builtin_isfpclass(0.0L, 0x0020) ? 1 : -1]; // fcNegZero
167 char isfpclass_pzero_3
[!__builtin_isfpclass(0.0, 0x0003) ? 1 : -1]; // fcNan
168 char isfpclass_nzero_0
[__builtin_isfpclass(-0.0f
, 0x0060) ? 1 : -1]; // fcZero
169 char isfpclass_nzero_1
[__builtin_isfpclass(-0.0, 0x01F8) ? 1 : -1]; // fcFinite
170 char isfpclass_nzero_2
[!__builtin_isfpclass(-0.0L, 0x0040) ? 1 : -1]; // fcPosZero
171 char isfpclass_nzero_3
[!__builtin_isfpclass(-0.0, 0x0003) ? 1 : -1]; // fcNan
172 char isfpclass_ndenorm_0
[__builtin_isfpclass(-1.0e-40f
, 0x0010) ? 1 : -1]; // fcNegSubnormal
173 char isfpclass_ndenorm_2
[!__builtin_isfpclass(-1.0e-40f
, 0x03C0) ? 1 : -1]; // fcPositive
175 char isfpclass_ndenorm_1
[__builtin_isfpclass(-1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite
176 char isfpclass_ndenorm_3
[!__builtin_isfpclass(-1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite
178 char isfpclass_neg_0
[__builtin_isfpclass(-1.0, 0x0008) ? 1 : -1]; // fcNegNormal
179 char isfpclass_neg_1
[!__builtin_isfpclass(-1.0f
, 0x00100) ? 1 : -1]; // fcPosNormal
180 char isfpclass_neg_2
[__builtin_isfpclass(-1.0L, 0x01F8) ? 1 : -1]; // fcFinite
181 char isfpclass_neg_3
[!__builtin_isfpclass(-1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan
182 char isfpclass_inf_neg_0
[__builtin_isfpclass(-__builtin_inf(), 0x0004) ? 1 : -1]; // fcNegInf
183 char isfpclass_inf_neg_1
[!__builtin_isfpclass(-__builtin_inff(), 0x0200) ? 1 : -1]; // fcPosInf
184 char isfpclass_inf_neg_2
[__builtin_isfpclass(-__builtin_infl(), 0x0207) ? 1 : -1]; // ~fcFinite
185 char isfpclass_inf_neg_3
[!__builtin_isfpclass(-__builtin_inf(), 0x03C0) ? 1 : -1]; // fcPositive
186 char isfpclass_qnan_0
[__builtin_isfpclass(__builtin_nan(""), 0x0002) ? 1 : -1]; // fcQNan
187 char isfpclass_qnan_1
[!__builtin_isfpclass(__builtin_nanf(""), 0x0001) ? 1 : -1]; // fcSNan
188 char isfpclass_qnan_2
[__builtin_isfpclass(__builtin_nanl(""), 0x0207) ? 1 : -1]; // ~fcFinite
189 char isfpclass_qnan_3
[!__builtin_isfpclass(__builtin_nan(""), 0x01F8) ? 1 : -1]; // fcFinite
190 char isfpclass_snan_0
[__builtin_isfpclass(__builtin_nansf(""), 0x0001) ? 1 : -1]; // fcSNan
191 char isfpclass_snan_1
[!__builtin_isfpclass(__builtin_nans(""), 0x0002) ? 1 : -1]; // fcQNan
192 char isfpclass_snan_2
[__builtin_isfpclass(__builtin_nansl(""), 0x0207) ? 1 : -1]; // ~fcFinite
193 char isfpclass_snan_3
[!__builtin_isfpclass(__builtin_nans(""), 0x01F8) ? 1 : -1]; // fcFinite
198 !__builtin_signbit(1.0) && __builtin_signbit(-1.0) && !__builtin_signbit(0.0) && __builtin_signbit(-0.0) &&
199 !__builtin_signbitf(1.0f
) && __builtin_signbitf(-1.0f
) && !__builtin_signbitf(0.0f
) && __builtin_signbitf(-0.0f
) &&
200 !__builtin_signbitl(1.0L) && __builtin_signbitf(-1.0L) && !__builtin_signbitf(0.0L) && __builtin_signbitf(-0.0L) &&
201 !__builtin_signbit(1.0f
) && __builtin_signbit(-1.0f
) && !__builtin_signbit(0.0f
) && __builtin_signbit(-0.0f
) &&
202 !__builtin_signbit(1.0L) && __builtin_signbit(-1.0L) && !__builtin_signbit(0.0L) && __builtin_signbit(-0.0L) &&
207 namespace floating_comparison
{
209 !__builtin_isgreater(X, Y) && __builtin_isgreater(Y, X) && \
210 !__builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) && \
211 __builtin_isless(X, Y) && !__builtin_isless(Y, X) && \
212 __builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) && \
213 __builtin_islessgreater(X, Y) && __builtin_islessgreater(Y, X) && \
214 !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
215 #define EQUAL(X, Y) \
216 !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \
217 __builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) && \
218 !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \
219 __builtin_islessequal(X, Y) && __builtin_islessequal(Y, X) && \
220 !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \
221 !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
222 #define UNORDERED(X, Y) \
223 !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \
224 !__builtin_isgreaterequal(X, Y) && !__builtin_isgreaterequal(Y, X) && \
225 !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \
226 !__builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) && \
227 !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \
228 __builtin_isunordered(X, Y) && __builtin_isunordered(Y, X)
230 static_assert(LESS(0.0, 1.0));
231 static_assert(LESS(0.0, __builtin_inf()));
232 static_assert(LESS(0.0f
, 1.0f
));
233 static_assert(LESS(0.0f
, __builtin_inff()));
234 static_assert(LESS(0.0L, 1.0L));
235 static_assert(LESS(0.0L, __builtin_infl()));
237 static_assert(EQUAL(1.0, 1.0));
238 static_assert(EQUAL(0.0, -0.0));
239 static_assert(EQUAL(1.0f
, 1.0f
));
240 static_assert(EQUAL(0.0f
, -0.0f
));
241 static_assert(EQUAL(1.0L, 1.0L));
242 static_assert(EQUAL(0.0L, -0.0L));
244 static_assert(UNORDERED(__builtin_nan(""), 1.0));
245 static_assert(UNORDERED(__builtin_nan(""), __builtin_inf()));
246 static_assert(UNORDERED(__builtin_nanf(""), 1.0f
));
247 static_assert(UNORDERED(__builtin_nanf(""), __builtin_inff()));
248 static_assert(UNORDERED(__builtin_nanl(""), 1.0L));
249 static_assert(UNORDERED(__builtin_nanl(""), __builtin_infl()));
252 namespace fpclassify
{
253 char classify_nan
[__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nan(""))];
254 char classify_snan
[__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nans(""))];
255 char classify_inf
[__builtin_fpclassify(-1, +1, -1, -1, -1, __builtin_inf())];
256 char classify_neg_inf
[__builtin_fpclassify(-1, +1, -1, -1, -1, -__builtin_inf())];
257 char classify_normal
[__builtin_fpclassify(-1, -1, +1, -1, -1, 1.539)];
259 char classify_normal2
[__builtin_fpclassify(-1, -1, +1, -1, -1, 1e-307)];
260 char classify_denorm
[__builtin_fpclassify(-1, -1, -1, +1, -1, 1e-308)];
261 char classify_denorm2
[__builtin_fpclassify(-1, -1, -1, +1, -1, -1e-308)];
263 char classify_zero
[__builtin_fpclassify(-1, -1, -1, -1, +1, 0.0)];
264 char classify_neg_zero
[__builtin_fpclassify(-1, -1, -1, -1, +1, -0.0)];
265 char classify_subnorm
[__builtin_fpclassify(-1, -1, -1, +1, -1, 1.0e-38f
)];
269 static_assert(__builtin_abs(14) == 14, "");
270 static_assert(__builtin_labs(14L) == 14L, "");
271 static_assert(__builtin_llabs(14LL) == 14LL, "");
272 static_assert(__builtin_abs(-14) == 14, "");
273 static_assert(__builtin_labs(-0x14L
) == 0x14L
, "");
274 static_assert(__builtin_llabs(-0x141414141414LL
) == 0x141414141414LL
, "");
275 #define BITSIZE(x) (sizeof(x) * 8)
276 constexpr int abs4
= __builtin_abs(1 << (BITSIZE(int) - 1)); // both-error {{must be initialized by a constant expression}}
277 constexpr long abs6
= __builtin_labs(1L << (BITSIZE(long) - 1)); // both-error {{must be initialized by a constant expression}}
278 constexpr long long abs8
= __builtin_llabs(1LL << (BITSIZE(long long) - 1)); // both-error {{must be initialized by a constant expression}}
283 static_assert(__builtin_fabs(-14.0) == 14.0, "");
287 struct source_location
{
289 unsigned int _M_line
;
290 const char *_M_file_name
;
291 signed char _M_column
;
292 const char *_M_function_name
;
294 using BuiltinT
= decltype(__builtin_source_location()); // OK.
298 namespace SourceLocation
{
299 constexpr auto A
= __builtin_source_location();
300 static_assert(A
->_M_line
== __LINE__
-1, "");
301 static_assert(A
->_M_column
== 22, "");
302 static_assert(__builtin_strcmp(A
->_M_function_name
, "") == 0, "");
303 static_assert(__builtin_strcmp(A
->_M_file_name
, __FILE__
) == 0, "");
305 static_assert(__builtin_LINE() == __LINE__
, "");
308 int a
= __builtin_LINE();
311 static_assert(Foo
{}.a
== __LINE__
, "");
314 int n
= __builtin_LINE();
321 static_assert(c
.a
.n
== __LINE__
- 1, "");
325 #define BITSIZE(x) (sizeof(x) * 8)
327 static_assert(__builtin_popcount(~0u) == __CHAR_BIT__
* sizeof(unsigned int), "");
328 static_assert(__builtin_popcount(0) == 0, "");
329 static_assert(__builtin_popcountl(~0ul) == __CHAR_BIT__
* sizeof(unsigned long), "");
330 static_assert(__builtin_popcountl(0) == 0, "");
331 static_assert(__builtin_popcountll(~0ull) == __CHAR_BIT__
* sizeof(unsigned long long), "");
332 static_assert(__builtin_popcountll(0) == 0, "");
333 static_assert(__builtin_popcountg((unsigned char)~0) == __CHAR_BIT__
* sizeof(unsigned char), "");
334 static_assert(__builtin_popcountg((unsigned char)0) == 0, "");
335 static_assert(__builtin_popcountg((unsigned short)~0) == __CHAR_BIT__
* sizeof(unsigned short), "");
336 static_assert(__builtin_popcountg((unsigned short)0) == 0, "");
337 static_assert(__builtin_popcountg(~0u) == __CHAR_BIT__
* sizeof(unsigned int), "");
338 static_assert(__builtin_popcountg(0u) == 0, "");
339 static_assert(__builtin_popcountg(~0ul) == __CHAR_BIT__
* sizeof(unsigned long), "");
340 static_assert(__builtin_popcountg(0ul) == 0, "");
341 static_assert(__builtin_popcountg(~0ull) == __CHAR_BIT__
* sizeof(unsigned long long), "");
342 static_assert(__builtin_popcountg(0ull) == 0, "");
343 #ifdef __SIZEOF_INT128__
344 static_assert(__builtin_popcountg(~(unsigned __int128
)0) == __CHAR_BIT__
* sizeof(unsigned __int128
), "");
345 static_assert(__builtin_popcountg((unsigned __int128
)0) == 0, "");
348 static_assert(__builtin_popcountg(~(unsigned _BitInt(128))0) == __CHAR_BIT__
* sizeof(unsigned _BitInt(128)), "");
349 static_assert(__builtin_popcountg((unsigned _BitInt(128))0) == 0, "");
352 /// From test/Sema/constant-builtins-2.c
353 char popcount1
[__builtin_popcount(0) == 0 ? 1 : -1];
354 char popcount2
[__builtin_popcount(0xF0F0) == 8 ? 1 : -1];
355 char popcount3
[__builtin_popcount(~0) == BITSIZE(int) ? 1 : -1];
356 char popcount4
[__builtin_popcount(~0L) == BITSIZE(int) ? 1 : -1];
357 char popcount5
[__builtin_popcountl(0L) == 0 ? 1 : -1];
358 char popcount6
[__builtin_popcountl(0xF0F0L
) == 8 ? 1 : -1];
359 char popcount7
[__builtin_popcountl(~0L) == BITSIZE(long) ? 1 : -1];
360 char popcount8
[__builtin_popcountll(0LL) == 0 ? 1 : -1];
361 char popcount9
[__builtin_popcountll(0xF0F0LL
) == 8 ? 1 : -1];
362 char popcount10
[__builtin_popcountll(~0LL) == BITSIZE(long long) ? 1 : -1];
363 char popcount11
[__builtin_popcountg(0U) == 0 ? 1 : -1];
364 char popcount12
[__builtin_popcountg(0xF0F0U
) == 8 ? 1 : -1];
365 char popcount13
[__builtin_popcountg(~0U) == BITSIZE(int) ? 1 : -1];
366 char popcount14
[__builtin_popcountg(~0UL) == BITSIZE(long) ? 1 : -1];
367 char popcount15
[__builtin_popcountg(~0ULL) == BITSIZE(long long) ? 1 : -1];
368 #ifdef __SIZEOF_INT128__
369 char popcount16
[__builtin_popcountg(~(unsigned __int128
)0) == BITSIZE(__int128
) ? 1 : -1];
372 char popcount17
[__builtin_popcountg(~(unsigned _BitInt(128))0) == BITSIZE(_BitInt(128)) ? 1 : -1];
377 /// From test/Sema/constant-builtins-2.c
378 char parity1
[__builtin_parity(0) == 0 ? 1 : -1];
379 char parity2
[__builtin_parity(0xb821) == 0 ? 1 : -1];
380 char parity3
[__builtin_parity(0xb822) == 0 ? 1 : -1];
381 char parity4
[__builtin_parity(0xb823) == 1 ? 1 : -1];
382 char parity5
[__builtin_parity(0xb824) == 0 ? 1 : -1];
383 char parity6
[__builtin_parity(0xb825) == 1 ? 1 : -1];
384 char parity7
[__builtin_parity(0xb826) == 1 ? 1 : -1];
385 char parity8
[__builtin_parity(~0) == 0 ? 1 : -1];
386 char parity9
[__builtin_parityl(1L << (BITSIZE(long) - 1)) == 1 ? 1 : -1];
387 char parity10
[__builtin_parityll(1LL << (BITSIZE(long long) - 1)) == 1 ? 1 : -1];
391 char clrsb1
[__builtin_clrsb(0) == BITSIZE(int) - 1 ? 1 : -1];
392 char clrsb2
[__builtin_clrsbl(0L) == BITSIZE(long) - 1 ? 1 : -1];
393 char clrsb3
[__builtin_clrsbll(0LL) == BITSIZE(long long) - 1 ? 1 : -1];
394 char clrsb4
[__builtin_clrsb(~0) == BITSIZE(int) - 1 ? 1 : -1];
395 char clrsb5
[__builtin_clrsbl(~0L) == BITSIZE(long) - 1 ? 1 : -1];
396 char clrsb6
[__builtin_clrsbll(~0LL) == BITSIZE(long long) - 1 ? 1 : -1];
397 char clrsb7
[__builtin_clrsb(1) == BITSIZE(int) - 2 ? 1 : -1];
398 char clrsb8
[__builtin_clrsb(~1) == BITSIZE(int) - 2 ? 1 : -1];
399 char clrsb9
[__builtin_clrsb(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
400 char clrsb10
[__builtin_clrsb(~(1 << (BITSIZE(int) - 1))) == 0 ? 1 : -1];
401 char clrsb11
[__builtin_clrsb(0xf) == BITSIZE(int) - 5 ? 1 : -1];
402 char clrsb12
[__builtin_clrsb(~0x1f) == BITSIZE(int) - 6 ? 1 : -1];
405 namespace bitreverse
{
406 char bitreverse1
[__builtin_bitreverse8(0x01) == 0x80 ? 1 : -1];
407 char bitreverse2
[__builtin_bitreverse16(0x3C48) == 0x123C ? 1 : -1];
408 char bitreverse3
[__builtin_bitreverse32(0x12345678) == 0x1E6A2C48 ? 1 : -1];
409 char bitreverse4
[__builtin_bitreverse64(0x0123456789ABCDEFULL
) == 0xF7B3D591E6A2C480 ? 1 : -1];
416 static_assert(__builtin_expect(a(),1) == 12, "");
417 static_assert(__builtin_expect_with_probability(a(), 1, 1.0) == 12, "");
420 namespace rotateleft
{
421 char rotateleft1
[__builtin_rotateleft8(0x01, 5) == 0x20 ? 1 : -1];
422 char rotateleft2
[__builtin_rotateleft16(0x3210, 11) == 0x8190 ? 1 : -1];
423 char rotateleft3
[__builtin_rotateleft32(0x76543210, 22) == 0x841D950C ? 1 : -1];
424 char rotateleft4
[__builtin_rotateleft64(0xFEDCBA9876543210ULL
, 55) == 0x87F6E5D4C3B2A19ULL
? 1 : -1];
427 namespace rotateright
{
428 char rotateright1
[__builtin_rotateright8(0x01, 5) == 0x08 ? 1 : -1];
429 char rotateright2
[__builtin_rotateright16(0x3210, 11) == 0x4206 ? 1 : -1];
430 char rotateright3
[__builtin_rotateright32(0x76543210, 22) == 0x50C841D9 ? 1 : -1];
431 char rotateright4
[__builtin_rotateright64(0xFEDCBA9876543210ULL
, 55) == 0xB97530ECA86421FDULL
? 1 : -1];
435 char ffs1
[__builtin_ffs(0) == 0 ? 1 : -1];
436 char ffs2
[__builtin_ffs(1) == 1 ? 1 : -1];
437 char ffs3
[__builtin_ffs(0xfbe71) == 1 ? 1 : -1];
438 char ffs4
[__builtin_ffs(0xfbe70) == 5 ? 1 : -1];
439 char ffs5
[__builtin_ffs(1U << (BITSIZE(int) - 1)) == BITSIZE(int) ? 1 : -1];
440 char ffs6
[__builtin_ffsl(0x10L
) == 5 ? 1 : -1];
441 char ffs7
[__builtin_ffsll(0x100LL
) == 9 ? 1 : -1];
444 namespace EhReturnDataRegno
{
447 case __builtin_eh_return_data_regno(0): // constant foldable.
450 __builtin_eh_return_data_regno(X
); // both-error {{argument to '__builtin_eh_return_data_regno' must be a constant integer}}
454 /// From test/SemaCXX/builtins.cpp
455 namespace test_launder
{
456 #define TEST_TYPE(Ptr, Type) \
457 static_assert(__is_same(decltype(__builtin_launder(Ptr)), Type), "expected same type")
461 using FnType
= int(char);
462 using MemFnType
= int (Dummy::*)(char);
463 using ConstMemFnType
= int (Dummy::*)() const;
467 void test_builtin_launder_diags(void *vp
, const void *cvp
, FnType
*fnp
,
468 MemFnType mfp
, ConstMemFnType cmfp
, int (&Arr
)[5]) {
469 __builtin_launder(vp
); // both-error {{void pointer argument to '__builtin_launder' is not allowed}}
470 __builtin_launder(cvp
); // both-error {{void pointer argument to '__builtin_launder' is not allowed}}
471 __builtin_launder(fnp
); // both-error {{function pointer argument to '__builtin_launder' is not allowed}}
472 __builtin_launder(mfp
); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
473 __builtin_launder(cmfp
); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
474 (void)__builtin_launder(&fnp
);
475 __builtin_launder(42); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
476 __builtin_launder(nullptr); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
477 __builtin_launder(foo
); // both-error {{function pointer argument to '__builtin_launder' is not allowed}}
478 (void)__builtin_launder(Arr
);
481 void test_builtin_launder(char *p
, const volatile int *ip
, const float *&fp
,
482 double *__restrict dp
) {
484 __builtin_launder(x
); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
487 TEST_TYPE(ip
, const volatile int*);
488 TEST_TYPE(fp
, const float*);
489 TEST_TYPE(dp
, double *__restrict
);
491 char *d
= __builtin_launder(p
);
492 const volatile int *id
= __builtin_launder(ip
);
493 int *id2
= __builtin_launder(ip
); // both-error {{cannot initialize a variable of type 'int *' with an rvalue of type 'const volatile int *'}}
494 const float* fd
= __builtin_launder(fp
);
497 void test_launder_return_type(const int (&ArrayRef
)[101], int (&MArrRef
)[42][13],
498 void (**&FuncPtrRef
)()) {
499 TEST_TYPE(ArrayRef
, const int *);
500 TEST_TYPE(MArrRef
, int(*)[13]);
501 TEST_TYPE(FuncPtrRef
, void (**)());
505 constexpr Tp
*test_constexpr_launder(Tp
*tp
) {
506 return __builtin_launder(tp
);
508 constexpr int const_int
= 42;
509 constexpr int const_int2
= 101;
510 constexpr const int *const_ptr
= test_constexpr_launder(&const_int
);
511 static_assert(&const_int
== const_ptr
, "");
512 static_assert(const_ptr
!= test_constexpr_launder(&const_int2
), "");
514 void test_non_constexpr() {
515 constexpr int i
= 42; // both-note {{address of non-static constexpr variable 'i' may differ on each invocation}}
516 constexpr const int *ip
= __builtin_launder(&i
); // both-error {{constexpr variable 'ip' must be initialized by a constant expression}}
517 // both-note@-1 {{pointer to 'i' is not a constant expression}}
520 constexpr bool test_in_constexpr(const int &i
) {
521 return (__builtin_launder(&i
) == &i
);
524 static_assert(test_in_constexpr(const_int
), "");
526 constexpr int i
= 42;
527 static_assert(test_in_constexpr(i
), "");
530 struct Incomplete
; // both-note {{forward declaration}}
531 struct IncompleteMember
{
534 void test_incomplete(Incomplete
*i
, IncompleteMember
*im
) {
535 // both-error@+1 {{incomplete type 'Incomplete' where a complete type is required}}
536 __builtin_launder(i
);
537 __builtin_launder(&i
); // OK
538 __builtin_launder(im
); // OK
541 void test_noexcept(int *i
) {
542 static_assert(noexcept(__builtin_launder(i
)), "");
545 } // end namespace test_launder
548 /// FIXME: The commented out tests here use a IntAP value and fail.
549 /// This currently means we will leak the IntAP value since nothing cleans it up.
551 char clz1
[__builtin_clz(1) == BITSIZE(int) - 1 ? 1 : -1];
552 char clz2
[__builtin_clz(7) == BITSIZE(int) - 3 ? 1 : -1];
553 char clz3
[__builtin_clz(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
554 int clz4
= __builtin_clz(0);
555 char clz5
[__builtin_clzl(0xFL
) == BITSIZE(long) - 4 ? 1 : -1];
556 char clz6
[__builtin_clzll(0xFFLL
) == BITSIZE(long long) - 8 ? 1 : -1];
557 char clz7
[__builtin_clzs(0x1) == BITSIZE(short) - 1 ? 1 : -1];
558 char clz8
[__builtin_clzs(0xf) == BITSIZE(short) - 4 ? 1 : -1];
559 char clz9
[__builtin_clzs(0xfff) == BITSIZE(short) - 12 ? 1 : -1];
561 int clz10
= __builtin_clzg((unsigned char)0);
562 char clz11
[__builtin_clzg((unsigned char)0, 42) == 42 ? 1 : -1];
563 char clz12
[__builtin_clzg((unsigned char)0x1) == BITSIZE(char) - 1 ? 1 : -1];
564 char clz13
[__builtin_clzg((unsigned char)0x1, 42) == BITSIZE(char) - 1 ? 1 : -1];
565 char clz14
[__builtin_clzg((unsigned char)0xf) == BITSIZE(char) - 4 ? 1 : -1];
566 char clz15
[__builtin_clzg((unsigned char)0xf, 42) == BITSIZE(char) - 4 ? 1 : -1];
567 char clz16
[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1))) == 0 ? 1 : -1];
568 char clz17
[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == 0 ? 1 : -1];
569 int clz18
= __builtin_clzg((unsigned short)0);
570 char clz19
[__builtin_clzg((unsigned short)0, 42) == 42 ? 1 : -1];
571 char clz20
[__builtin_clzg((unsigned short)0x1) == BITSIZE(short) - 1 ? 1 : -1];
572 char clz21
[__builtin_clzg((unsigned short)0x1, 42) == BITSIZE(short) - 1 ? 1 : -1];
573 char clz22
[__builtin_clzg((unsigned short)0xf) == BITSIZE(short) - 4 ? 1 : -1];
574 char clz23
[__builtin_clzg((unsigned short)0xf, 42) == BITSIZE(short) - 4 ? 1 : -1];
575 char clz24
[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1))) == 0 ? 1 : -1];
576 char clz25
[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == 0 ? 1 : -1];
577 int clz26
= __builtin_clzg(0U);
578 char clz27
[__builtin_clzg(0U, 42) == 42 ? 1 : -1];
579 char clz28
[__builtin_clzg(0x1U
) == BITSIZE(int) - 1 ? 1 : -1];
580 char clz29
[__builtin_clzg(0x1U
, 42) == BITSIZE(int) - 1 ? 1 : -1];
581 char clz30
[__builtin_clzg(0xfU
) == BITSIZE(int) - 4 ? 1 : -1];
582 char clz31
[__builtin_clzg(0xfU
, 42) == BITSIZE(int) - 4 ? 1 : -1];
583 char clz32
[__builtin_clzg(1U << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
584 char clz33
[__builtin_clzg(1U << (BITSIZE(int) - 1), 42) == 0 ? 1 : -1];
585 int clz34
= __builtin_clzg(0UL);
586 char clz35
[__builtin_clzg(0UL, 42) == 42 ? 1 : -1];
587 char clz36
[__builtin_clzg(0x1UL
) == BITSIZE(long) - 1 ? 1 : -1];
588 char clz37
[__builtin_clzg(0x1UL
, 42) == BITSIZE(long) - 1 ? 1 : -1];
589 char clz38
[__builtin_clzg(0xfUL
) == BITSIZE(long) - 4 ? 1 : -1];
590 char clz39
[__builtin_clzg(0xfUL
, 42) == BITSIZE(long) - 4 ? 1 : -1];
591 char clz40
[__builtin_clzg(1UL << (BITSIZE(long) - 1)) == 0 ? 1 : -1];
592 char clz41
[__builtin_clzg(1UL << (BITSIZE(long) - 1), 42) == 0 ? 1 : -1];
593 int clz42
= __builtin_clzg(0ULL);
594 char clz43
[__builtin_clzg(0ULL, 42) == 42 ? 1 : -1];
595 char clz44
[__builtin_clzg(0x1ULL
) == BITSIZE(long long) - 1 ? 1 : -1];
596 char clz45
[__builtin_clzg(0x1ULL
, 42) == BITSIZE(long long) - 1 ? 1 : -1];
597 char clz46
[__builtin_clzg(0xfULL
) == BITSIZE(long long) - 4 ? 1 : -1];
598 char clz47
[__builtin_clzg(0xfULL
, 42) == BITSIZE(long long) - 4 ? 1 : -1];
599 char clz48
[__builtin_clzg(1ULL << (BITSIZE(long long) - 1)) == 0 ? 1 : -1];
600 char clz49
[__builtin_clzg(1ULL << (BITSIZE(long long) - 1), 42) == 0 ? 1 : -1];
601 #ifdef __SIZEOF_INT128__
602 // int clz50 = __builtin_clzg((unsigned __int128)0);
603 char clz51
[__builtin_clzg((unsigned __int128
)0, 42) == 42 ? 1 : -1];
604 char clz52
[__builtin_clzg((unsigned __int128
)0x1) == BITSIZE(__int128
) - 1 ? 1 : -1];
605 char clz53
[__builtin_clzg((unsigned __int128
)0x1, 42) == BITSIZE(__int128
) - 1 ? 1 : -1];
606 char clz54
[__builtin_clzg((unsigned __int128
)0xf) == BITSIZE(__int128
) - 4 ? 1 : -1];
607 char clz55
[__builtin_clzg((unsigned __int128
)0xf, 42) == BITSIZE(__int128
) - 4 ? 1 : -1];
610 // int clz58 = __builtin_clzg((unsigned _BitInt(128))0);
611 char clz59
[__builtin_clzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];
612 char clz60
[__builtin_clzg((unsigned _BitInt(128))0x1) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
613 char clz61
[__builtin_clzg((unsigned _BitInt(128))0x1, 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
614 char clz62
[__builtin_clzg((unsigned _BitInt(128))0xf) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];
615 char clz63
[__builtin_clzg((unsigned _BitInt(128))0xf, 42) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];
620 char ctz1
[__builtin_ctz(1) == 0 ? 1 : -1];
621 char ctz2
[__builtin_ctz(8) == 3 ? 1 : -1];
622 char ctz3
[__builtin_ctz(1 << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];
623 int ctz4
= __builtin_ctz(0);
624 char ctz5
[__builtin_ctzl(0x10L
) == 4 ? 1 : -1];
625 char ctz6
[__builtin_ctzll(0x100LL
) == 8 ? 1 : -1];
626 char ctz7
[__builtin_ctzs(1 << (BITSIZE(short) - 1)) == BITSIZE(short) - 1 ? 1 : -1];
627 int ctz8
= __builtin_ctzg((unsigned char)0);
628 char ctz9
[__builtin_ctzg((unsigned char)0, 42) == 42 ? 1 : -1];
629 char ctz10
[__builtin_ctzg((unsigned char)0x1) == 0 ? 1 : -1];
630 char ctz11
[__builtin_ctzg((unsigned char)0x1, 42) == 0 ? 1 : -1];
631 char ctz12
[__builtin_ctzg((unsigned char)0x10) == 4 ? 1 : -1];
632 char ctz13
[__builtin_ctzg((unsigned char)0x10, 42) == 4 ? 1 : -1];
633 char ctz14
[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1))) == BITSIZE(char) - 1 ? 1 : -1];
634 char ctz15
[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == BITSIZE(char) - 1 ? 1 : -1];
635 int ctz16
= __builtin_ctzg((unsigned short)0);
636 char ctz17
[__builtin_ctzg((unsigned short)0, 42) == 42 ? 1 : -1];
637 char ctz18
[__builtin_ctzg((unsigned short)0x1) == 0 ? 1 : -1];
638 char ctz19
[__builtin_ctzg((unsigned short)0x1, 42) == 0 ? 1 : -1];
639 char ctz20
[__builtin_ctzg((unsigned short)0x10) == 4 ? 1 : -1];
640 char ctz21
[__builtin_ctzg((unsigned short)0x10, 42) == 4 ? 1 : -1];
641 char ctz22
[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1))) == BITSIZE(short) - 1 ? 1 : -1];
642 char ctz23
[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == BITSIZE(short) - 1 ? 1 : -1];
643 int ctz24
= __builtin_ctzg(0U);
644 char ctz25
[__builtin_ctzg(0U, 42) == 42 ? 1 : -1];
645 char ctz26
[__builtin_ctzg(0x1U
) == 0 ? 1 : -1];
646 char ctz27
[__builtin_ctzg(0x1U
, 42) == 0 ? 1 : -1];
647 char ctz28
[__builtin_ctzg(0x10U
) == 4 ? 1 : -1];
648 char ctz29
[__builtin_ctzg(0x10U
, 42) == 4 ? 1 : -1];
649 char ctz30
[__builtin_ctzg(1U << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];
650 char ctz31
[__builtin_ctzg(1U << (BITSIZE(int) - 1), 42) == BITSIZE(int) - 1 ? 1 : -1];
651 int ctz32
= __builtin_ctzg(0UL);
652 char ctz33
[__builtin_ctzg(0UL, 42) == 42 ? 1 : -1];
653 char ctz34
[__builtin_ctzg(0x1UL
) == 0 ? 1 : -1];
654 char ctz35
[__builtin_ctzg(0x1UL
, 42) == 0 ? 1 : -1];
655 char ctz36
[__builtin_ctzg(0x10UL
) == 4 ? 1 : -1];
656 char ctz37
[__builtin_ctzg(0x10UL
, 42) == 4 ? 1 : -1];
657 char ctz38
[__builtin_ctzg(1UL << (BITSIZE(long) - 1)) == BITSIZE(long) - 1 ? 1 : -1];
658 char ctz39
[__builtin_ctzg(1UL << (BITSIZE(long) - 1), 42) == BITSIZE(long) - 1 ? 1 : -1];
659 int ctz40
= __builtin_ctzg(0ULL);
660 char ctz41
[__builtin_ctzg(0ULL, 42) == 42 ? 1 : -1];
661 char ctz42
[__builtin_ctzg(0x1ULL
) == 0 ? 1 : -1];
662 char ctz43
[__builtin_ctzg(0x1ULL
, 42) == 0 ? 1 : -1];
663 char ctz44
[__builtin_ctzg(0x10ULL
) == 4 ? 1 : -1];
664 char ctz45
[__builtin_ctzg(0x10ULL
, 42) == 4 ? 1 : -1];
665 char ctz46
[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1)) == BITSIZE(long long) - 1 ? 1 : -1];
666 char ctz47
[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1), 42) == BITSIZE(long long) - 1 ? 1 : -1];
667 #ifdef __SIZEOF_INT128__
668 // int ctz48 = __builtin_ctzg((unsigned __int128)0);
669 char ctz49
[__builtin_ctzg((unsigned __int128
)0, 42) == 42 ? 1 : -1];
670 char ctz50
[__builtin_ctzg((unsigned __int128
)0x1) == 0 ? 1 : -1];
671 char ctz51
[__builtin_ctzg((unsigned __int128
)0x1, 42) == 0 ? 1 : -1];
672 char ctz52
[__builtin_ctzg((unsigned __int128
)0x10) == 4 ? 1 : -1];
673 char ctz53
[__builtin_ctzg((unsigned __int128
)0x10, 42) == 4 ? 1 : -1];
674 char ctz54
[__builtin_ctzg((unsigned __int128
)1 << (BITSIZE(__int128
) - 1)) == BITSIZE(__int128
) - 1 ? 1 : -1];
675 char ctz55
[__builtin_ctzg((unsigned __int128
)1 << (BITSIZE(__int128
) - 1), 42) == BITSIZE(__int128
) - 1 ? 1 : -1];
678 // int ctz56 = __builtin_ctzg((unsigned _BitInt(128))0);
679 char ctz57
[__builtin_ctzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];
680 char ctz58
[__builtin_ctzg((unsigned _BitInt(128))0x1) == 0 ? 1 : -1];
681 char ctz59
[__builtin_ctzg((unsigned _BitInt(128))0x1, 42) == 0 ? 1 : -1];
682 char ctz60
[__builtin_ctzg((unsigned _BitInt(128))0x10) == 4 ? 1 : -1];
683 char ctz61
[__builtin_ctzg((unsigned _BitInt(128))0x10, 42) == 4 ? 1 : -1];
684 char ctz62
[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1)) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
685 char ctz63
[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1), 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
691 int h3
= __builtin_bswap16(0x1234) == 0x3412 ? 1 : f();
692 int h4
= __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f();
693 int h5
= __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f();
696 #define CFSTR __builtin___CFStringMakeConstantString
700 X
= CFSTR("\242"); // both-warning {{input conversion stopped}}
701 X
= CFSTR("\0"); // no-warning
702 X
= CFSTR(242); // both-error {{cannot initialize a parameter of type 'const char *' with an rvalue of type 'int'}}
703 X
= CFSTR("foo", "bar"); // both-error {{too many arguments to function call}}
707 /// The actual value on my machine is 22, but I have a feeling this will be different
708 /// on other targets, so just checking for != 0 here. Light testing is fine since
709 /// the actual implementation uses analyze_os_log::computeOSLogBufferLayout(), which
710 /// is tested elsewhere.
711 static_assert(__builtin_os_log_format_buffer_size("%{mask.xyz}s", "abc") != 0, "");
713 /// Copied from test/Sema/constant_builtins_vector.cpp.
714 /// Some tests are missing since we run this for multiple targets,
715 /// some of which do not support _BitInt.
717 typedef _BitInt(128) BitInt128
;
718 typedef double vector4double
__attribute__((__vector_size__(32)));
719 typedef float vector4float
__attribute__((__vector_size__(16)));
720 typedef long long vector4long
__attribute__((__vector_size__(32)));
721 typedef int vector4int
__attribute__((__vector_size__(16)));
722 typedef short vector4short
__attribute__((__vector_size__(8)));
723 typedef char vector4char
__attribute__((__vector_size__(4)));
724 typedef BitInt128 vector4BitInt128
__attribute__((__vector_size__(64)));
725 typedef double vector8double
__attribute__((__vector_size__(64)));
726 typedef float vector8float
__attribute__((__vector_size__(32)));
727 typedef long long vector8long
__attribute__((__vector_size__(64)));
728 typedef int vector8int
__attribute__((__vector_size__(32)));
729 typedef short vector8short
__attribute__((__vector_size__(16)));
730 typedef char vector8char
__attribute__((__vector_size__(8)));
731 typedef BitInt128 vector8BitInt128
__attribute__((__vector_size__(128)));
733 namespace convertvector
{
734 constexpr vector4double from_vector4double_to_vector4double_var
=
735 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4double
);
736 constexpr vector4float from_vector4double_to_vector4float_var
=
737 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4float
);
738 constexpr vector4long from_vector4double_to_vector4long_var
=
739 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4long
);
740 constexpr vector4int from_vector4double_to_vector4int_var
=
741 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4int
);
742 constexpr vector4short from_vector4double_to_vector4short_var
=
743 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4short
);
744 constexpr vector4char from_vector4double_to_vector4char_var
=
745 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4char
);
746 constexpr vector4BitInt128 from_vector4double_to_vector4BitInt128_var
=
747 __builtin_convertvector((vector4double
){0, 1, 2, 3}, vector4BitInt128
);
748 constexpr vector4double from_vector4float_to_vector4double_var
=
749 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4double
);
750 constexpr vector4float from_vector4float_to_vector4float_var
=
751 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4float
);
752 constexpr vector4long from_vector4float_to_vector4long_var
=
753 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4long
);
754 constexpr vector4int from_vector4float_to_vector4int_var
=
755 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4int
);
756 constexpr vector4short from_vector4float_to_vector4short_var
=
757 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4short
);
758 constexpr vector4char from_vector4float_to_vector4char_var
=
759 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4char
);
760 constexpr vector4BitInt128 from_vector4float_to_vector4BitInt128_var
=
761 __builtin_convertvector((vector4float
){0, 1, 2, 3}, vector4BitInt128
);
762 constexpr vector4double from_vector4long_to_vector4double_var
=
763 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4double
);
764 constexpr vector4float from_vector4long_to_vector4float_var
=
765 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4float
);
766 constexpr vector4long from_vector4long_to_vector4long_var
=
767 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4long
);
768 constexpr vector4int from_vector4long_to_vector4int_var
=
769 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4int
);
770 constexpr vector4short from_vector4long_to_vector4short_var
=
771 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4short
);
772 constexpr vector4char from_vector4long_to_vector4char_var
=
773 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4char
);
774 constexpr vector4BitInt128 from_vector4long_to_vector4BitInt128_var
=
775 __builtin_convertvector((vector4long
){0, 1, 2, 3}, vector4BitInt128
);
776 constexpr vector4double from_vector4int_to_vector4double_var
=
777 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4double
);
778 constexpr vector4float from_vector4int_to_vector4float_var
=
779 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4float
);
780 constexpr vector4long from_vector4int_to_vector4long_var
=
781 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4long
);
782 constexpr vector4int from_vector4int_to_vector4int_var
=
783 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4int
);
784 constexpr vector4short from_vector4int_to_vector4short_var
=
785 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4short
);
786 constexpr vector4char from_vector4int_to_vector4char_var
=
787 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4char
);
788 constexpr vector4BitInt128 from_vector4int_to_vector4BitInt128_var
=
789 __builtin_convertvector((vector4int
){0, 1, 2, 3}, vector4BitInt128
);
790 constexpr vector4double from_vector4short_to_vector4double_var
=
791 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4double
);
792 constexpr vector4float from_vector4short_to_vector4float_var
=
793 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4float
);
794 constexpr vector4long from_vector4short_to_vector4long_var
=
795 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4long
);
796 constexpr vector4int from_vector4short_to_vector4int_var
=
797 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4int
);
798 constexpr vector4short from_vector4short_to_vector4short_var
=
799 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4short
);
800 constexpr vector4char from_vector4short_to_vector4char_var
=
801 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4char
);
802 constexpr vector4BitInt128 from_vector4short_to_vector4BitInt128_var
=
803 __builtin_convertvector((vector4short
){0, 1, 2, 3}, vector4BitInt128
);
804 constexpr vector4double from_vector4char_to_vector4double_var
=
805 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4double
);
806 constexpr vector4float from_vector4char_to_vector4float_var
=
807 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4float
);
808 constexpr vector4long from_vector4char_to_vector4long_var
=
809 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4long
);
810 constexpr vector4int from_vector4char_to_vector4int_var
=
811 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4int
);
812 constexpr vector4short from_vector4char_to_vector4short_var
=
813 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4short
);
814 constexpr vector4char from_vector4char_to_vector4char_var
=
815 __builtin_convertvector((vector4char
){0, 1, 2, 3}, vector4char
);
816 constexpr vector8double from_vector8double_to_vector8double_var
=
817 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
819 constexpr vector8float from_vector8double_to_vector8float_var
=
820 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
822 constexpr vector8long from_vector8double_to_vector8long_var
=
823 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
825 constexpr vector8int from_vector8double_to_vector8int_var
=
826 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
828 constexpr vector8short from_vector8double_to_vector8short_var
=
829 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
831 constexpr vector8char from_vector8double_to_vector8char_var
=
832 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
834 constexpr vector8BitInt128 from_vector8double_to_vector8BitInt128_var
=
835 __builtin_convertvector((vector8double
){0, 1, 2, 3, 4, 5, 6, 7},
837 constexpr vector8double from_vector8float_to_vector8double_var
=
838 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
840 constexpr vector8float from_vector8float_to_vector8float_var
=
841 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
843 constexpr vector8long from_vector8float_to_vector8long_var
=
844 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
846 constexpr vector8int from_vector8float_to_vector8int_var
=
847 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7}, vector8int
);
848 constexpr vector8short from_vector8float_to_vector8short_var
=
849 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
851 constexpr vector8char from_vector8float_to_vector8char_var
=
852 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
854 constexpr vector8BitInt128 from_vector8float_to_vector8BitInt128_var
=
855 __builtin_convertvector((vector8float
){0, 1, 2, 3, 4, 5, 6, 7},
857 constexpr vector8double from_vector8long_to_vector8double_var
=
858 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7},
860 constexpr vector8float from_vector8long_to_vector8float_var
=
861 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7},
863 constexpr vector8long from_vector8long_to_vector8long_var
=
864 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7}, vector8long
);
865 constexpr vector8int from_vector8long_to_vector8int_var
=
866 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7}, vector8int
);
867 constexpr vector8short from_vector8long_to_vector8short_var
=
868 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7},
870 constexpr vector8char from_vector8long_to_vector8char_var
=
871 __builtin_convertvector((vector8long
){0, 1, 2, 3, 4, 5, 6, 7}, vector8char
);
872 constexpr vector8double from_vector8int_to_vector8double_var
=
873 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7},
875 constexpr vector8float from_vector8int_to_vector8float_var
=
876 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7}, vector8float
);
877 constexpr vector8long from_vector8int_to_vector8long_var
=
878 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7}, vector8long
);
879 constexpr vector8int from_vector8int_to_vector8int_var
=
880 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7}, vector8int
);
881 constexpr vector8short from_vector8int_to_vector8short_var
=
882 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7}, vector8short
);
883 constexpr vector8char from_vector8int_to_vector8char_var
=
884 __builtin_convertvector((vector8int
){0, 1, 2, 3, 4, 5, 6, 7}, vector8char
);
885 constexpr vector8double from_vector8short_to_vector8double_var
=
886 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7},
888 constexpr vector8float from_vector8short_to_vector8float_var
=
889 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7},
891 constexpr vector8long from_vector8short_to_vector8long_var
=
892 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7},
894 constexpr vector8int from_vector8short_to_vector8int_var
=
895 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7}, vector8int
);
896 constexpr vector8short from_vector8short_to_vector8short_var
=
897 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7},
899 constexpr vector8char from_vector8short_to_vector8char_var
=
900 __builtin_convertvector((vector8short
){0, 1, 2, 3, 4, 5, 6, 7},
903 constexpr vector8double from_vector8char_to_vector8double_var
=
904 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7},
906 constexpr vector8float from_vector8char_to_vector8float_var
=
907 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7},
909 constexpr vector8long from_vector8char_to_vector8long_var
=
910 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7}, vector8long
);
911 constexpr vector8int from_vector8char_to_vector8int_var
=
912 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7}, vector8int
);
913 constexpr vector8short from_vector8char_to_vector8short_var
=
914 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7},
916 constexpr vector8char from_vector8char_to_vector8char_var
=
917 __builtin_convertvector((vector8char
){0, 1, 2, 3, 4, 5, 6, 7}, vector8char
);
918 constexpr vector8double from_vector8BitInt128_to_vector8double_var
=
919 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
921 constexpr vector8float from_vector8BitInt128_to_vector8float_var
=
922 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
924 constexpr vector8long from_vector8BitInt128_to_vector8long_var
=
925 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
927 constexpr vector8int from_vector8BitInt128_to_vector8int_var
=
928 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
930 constexpr vector8short from_vector8BitInt128_to_vector8short_var
=
931 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
933 constexpr vector8char from_vector8BitInt128_to_vector8char_var
=
934 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
936 constexpr vector8BitInt128 from_vector8BitInt128_to_vector8BitInt128_var
=
937 __builtin_convertvector((vector8BitInt128
){0, 1, 2, 3, 4, 5, 6, 7},
939 static_assert(from_vector8BitInt128_to_vector8BitInt128_var
[0] == 0, "");
940 static_assert(from_vector8BitInt128_to_vector8BitInt128_var
[1] == 1, "");
941 static_assert(from_vector8BitInt128_to_vector8BitInt128_var
[2] == 2, "");
942 static_assert(from_vector8BitInt128_to_vector8BitInt128_var
[3] == 3, "");
943 static_assert(from_vector8BitInt128_to_vector8BitInt128_var
[4] == 4, "");
946 namespace shufflevector
{
947 constexpr vector4char vector4charConst1
= {0, 1, 2, 3};
948 constexpr vector4char vector4charConst2
= {4, 5, 6, 7};
949 constexpr vector8char vector8intConst
= {8, 9, 10, 11, 12, 13, 14, 15};
950 constexpr vector4char vectorShuffle1
=
951 __builtin_shufflevector(vector4charConst1
, vector4charConst2
, 0, 1, 2, 3);
952 constexpr vector4char vectorShuffle2
=
953 __builtin_shufflevector(vector4charConst1
, vector4charConst2
, 4, 5, 6, 7);
954 constexpr vector4char vectorShuffle3
=
955 __builtin_shufflevector(vector4charConst1
, vector4charConst2
, 0, 2, 4, 6);
956 constexpr vector8char vectorShuffle4
= __builtin_shufflevector(
957 vector8intConst
, vector8intConst
, 0, 2, 4, 6, 8, 10, 12, 14);
958 constexpr vector4char vectorShuffle5
=
959 __builtin_shufflevector(vector8intConst
, vector8intConst
, 0, 2, 4, 6);
960 constexpr vector8char vectorShuffle6
= __builtin_shufflevector(
961 vector4charConst1
, vector4charConst2
, 0, 2, 4, 6, 1, 3, 5, 7);
963 static_assert(vectorShuffle6
[0] == 0, "");
964 static_assert(vectorShuffle6
[1] == 2, "");
965 static_assert(vectorShuffle6
[2] == 4, "");
966 static_assert(vectorShuffle6
[3] == 6, "");
967 static_assert(vectorShuffle6
[4] == 1, "");
968 static_assert(vectorShuffle6
[5] == 3, "");
969 static_assert(vectorShuffle6
[6] == 5, "");
970 static_assert(vectorShuffle6
[7] == 7, "");
972 constexpr vector4char vectorShuffleFail1
= __builtin_shufflevector( // both-error {{must be initialized by a constant expression}}\
973 // both-error {{index for __builtin_shufflevector not within the bounds of the input vectors; index of -1 found at position 0 is not permitted in a constexpr context}}
975 vector4charConst2
, -1, -1, -1, -1);
980 namespace FunctionStart
{
982 static_assert(__builtin_function_start(a
) == a
, ""); // both-error {{not an integral constant expression}} \
983 // ref-note {{comparison against opaque constant address '&__builtin_function_start(a)'}} \
984 // expected-note {{comparison of addresses of literals has unspecified value}}
987 namespace BuiltinInImplicitCtor
{
989 int a
= __builtin_isnan(1.0);
991 static_assert(Foo
.a
== 0, "");