[flang][cuda] Adapt ExternalNameConversion to work in gpu module (#117039)
[llvm-project.git] / clang / test / AST / ByteCode / builtin-functions.cpp
blobb5d334178f8213c13c45f00acddd4edd778dccea
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
11 namespace strcmp {
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
45 namespace strlen {
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}}
90 namespace nan {
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}}
97 #endif
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("")), "");
115 namespace fmin {
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(), "");
127 namespace 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()), "");
137 #ifndef __AVR__
138 static_assert(__builtin_issubnormal(0x1p-1070), "");
139 #endif
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
158 #ifndef __AVR__
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
163 #endif
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
174 #ifndef __AVR__
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
177 #endif
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
196 namespace signbit {
197 static_assert(
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) &&
203 true, ""
207 namespace floating_comparison {
208 #define LESS(X, Y) \
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)];
258 #ifndef __AVR__
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)];
262 #endif
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)];
268 namespace abs {
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}}
279 #undef BITSIZE
280 } // namespace abs
282 namespace fabs {
283 static_assert(__builtin_fabs(-14.0) == 14.0, "");
286 namespace std {
287 struct source_location {
288 struct __impl {
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__, "");
307 struct Foo {
308 int a = __builtin_LINE();
311 static_assert(Foo{}.a == __LINE__, "");
313 struct AA {
314 int n = __builtin_LINE();
316 struct B {
317 AA a = {};
319 constexpr void f() {
320 constexpr B c = {};
321 static_assert(c.a.n == __LINE__ - 1, "");
325 #define BITSIZE(x) (sizeof(x) * 8)
326 namespace popcount {
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, "");
346 #endif
347 #ifndef __AVR__
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, "");
350 #endif
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];
370 #endif
371 #ifndef __AVR__
372 char popcount17[__builtin_popcountg(~(unsigned _BitInt(128))0) == BITSIZE(_BitInt(128)) ? 1 : -1];
373 #endif
376 namespace parity {
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];
390 namespace clrsb {
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];
412 namespace expect {
413 constexpr int a() {
414 return 12;
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];
434 namespace ffs {
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 {
445 void test11(int X) {
446 switch (X) {
447 case __builtin_eh_return_data_regno(0): // constant foldable.
448 break;
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")
459 struct Dummy {};
461 using FnType = int(char);
462 using MemFnType = int (Dummy::*)(char);
463 using ConstMemFnType = int (Dummy::*)() const;
465 void foo() {}
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) {
483 int x;
484 __builtin_launder(x); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
486 TEST_TYPE(p, char*);
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 (**)());
504 template <class Tp>
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), "");
525 void f() {
526 constexpr int i = 42;
527 static_assert(test_in_constexpr(i), "");
530 struct Incomplete; // both-note {{forward declaration}}
531 struct IncompleteMember {
532 Incomplete &i;
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)), "");
544 #undef TEST_TYPE
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.
550 namespace clz {
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];
608 #endif
609 #ifndef __AVR__
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];
616 #endif
619 namespace ctz {
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];
676 #endif
677 #ifndef __AVR__
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];
686 #endif
689 namespace bswap {
690 extern int f(void);
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
697 void test7(void) {
698 const void *X;
699 #if !defined(_AIX)
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}}
704 #endif
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.
716 #ifndef __AVR__
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},
818 vector8double);
819 constexpr vector8float from_vector8double_to_vector8float_var =
820 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
821 vector8float);
822 constexpr vector8long from_vector8double_to_vector8long_var =
823 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
824 vector8long);
825 constexpr vector8int from_vector8double_to_vector8int_var =
826 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
827 vector8int);
828 constexpr vector8short from_vector8double_to_vector8short_var =
829 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
830 vector8short);
831 constexpr vector8char from_vector8double_to_vector8char_var =
832 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
833 vector8char);
834 constexpr vector8BitInt128 from_vector8double_to_vector8BitInt128_var =
835 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
836 vector8BitInt128);
837 constexpr vector8double from_vector8float_to_vector8double_var =
838 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
839 vector8double);
840 constexpr vector8float from_vector8float_to_vector8float_var =
841 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
842 vector8float);
843 constexpr vector8long from_vector8float_to_vector8long_var =
844 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
845 vector8long);
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},
850 vector8short);
851 constexpr vector8char from_vector8float_to_vector8char_var =
852 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
853 vector8char);
854 constexpr vector8BitInt128 from_vector8float_to_vector8BitInt128_var =
855 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
856 vector8BitInt128);
857 constexpr vector8double from_vector8long_to_vector8double_var =
858 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
859 vector8double);
860 constexpr vector8float from_vector8long_to_vector8float_var =
861 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
862 vector8float);
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},
869 vector8short);
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},
874 vector8double);
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},
887 vector8double);
888 constexpr vector8float from_vector8short_to_vector8float_var =
889 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
890 vector8float);
891 constexpr vector8long from_vector8short_to_vector8long_var =
892 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
893 vector8long);
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},
898 vector8short);
899 constexpr vector8char from_vector8short_to_vector8char_var =
900 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
901 vector8char);
903 constexpr vector8double from_vector8char_to_vector8double_var =
904 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
905 vector8double);
906 constexpr vector8float from_vector8char_to_vector8float_var =
907 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
908 vector8float);
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},
915 vector8short);
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},
920 vector8double);
921 constexpr vector8float from_vector8BitInt128_to_vector8float_var =
922 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
923 vector8float);
924 constexpr vector8long from_vector8BitInt128_to_vector8long_var =
925 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
926 vector8long);
927 constexpr vector8int from_vector8BitInt128_to_vector8int_var =
928 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
929 vector8int);
930 constexpr vector8short from_vector8BitInt128_to_vector8short_var =
931 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
932 vector8short);
933 constexpr vector8char from_vector8BitInt128_to_vector8char_var =
934 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
935 vector8char);
936 constexpr vector8BitInt128 from_vector8BitInt128_to_vector8BitInt128_var =
937 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
938 vector8BitInt128);
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}}
974 vector4charConst1,
975 vector4charConst2, -1, -1, -1, -1);
978 #endif
980 namespace FunctionStart {
981 void a(void) {}
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 {
988 constexpr struct {
989 int a = __builtin_isnan(1.0);
990 } Foo;
991 static_assert(Foo.a == 0, "");