xref: /llvm-project/clang/test/AST/ByteCode/builtin-functions.cpp (revision fd6baa477fa13a4b893aeeba7fce92eb6a1f4962)
1a07aba5dSTimm Baeder // RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
2a07aba5dSTimm Baeder // RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both
3a07aba5dSTimm Baeder // RUN: %clang_cc1 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
4a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
5a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both
6a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
7a07aba5dSTimm Baeder // RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both
8a07aba5dSTimm Baeder // RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -verify=ref,both %s -Wno-constant-evaluated
9a07aba5dSTimm Baeder 
100f4dc427STimm Baeder #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
110f4dc427STimm Baeder #define LITTLE_END 1
120f4dc427STimm Baeder #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
130f4dc427STimm Baeder #define LITTLE_END 0
140f4dc427STimm Baeder #else
150f4dc427STimm Baeder #error "huh?"
160f4dc427STimm Baeder #endif
170f4dc427STimm Baeder 
1800b50c91STimm Baeder extern "C" {
1900b50c91STimm Baeder   typedef decltype(sizeof(int)) size_t;
2000b50c91STimm Baeder   extern size_t wcslen(const wchar_t *p);
2100b50c91STimm Baeder }
22a07aba5dSTimm Baeder 
23a07aba5dSTimm Baeder namespace strcmp {
24a07aba5dSTimm Baeder   constexpr char kFoobar[6] = {'f','o','o','b','a','r'};
25a07aba5dSTimm Baeder   constexpr char kFoobazfoobar[12] = {'f','o','o','b','a','z','f','o','o','b','a','r'};
26a07aba5dSTimm Baeder 
27a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("", "") == 0, "");
28a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", "abab") == 0, "");
29a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", "abba") == -1, "");
30a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", "abaa") == 1, "");
31a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("ababa", "abab") == 1, "");
32a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", "ababa") == -1, "");
33a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("a\203", "a") == 1, "");
34a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("a\203", "a\003") == 1, "");
35a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab\0banana", "abab") == 0, "");
36a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", "abab\0banana") == 0, "");
37a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab\0banana", "abab\0canada") == 0, "");
38a07aba5dSTimm Baeder   static_assert(__builtin_strcmp(0, "abab") == 0, ""); // both-error {{not an integral constant}} \
39a07aba5dSTimm Baeder                                                        // both-note {{dereferenced null}}
40a07aba5dSTimm Baeder   static_assert(__builtin_strcmp("abab", 0) == 0, ""); // both-error {{not an integral constant}} \
41a07aba5dSTimm Baeder                                                        // both-note {{dereferenced null}}
42a07aba5dSTimm Baeder 
43a07aba5dSTimm Baeder   static_assert(__builtin_strcmp(kFoobar, kFoobazfoobar) == -1, "");
44a07aba5dSTimm Baeder   static_assert(__builtin_strcmp(kFoobar, kFoobazfoobar + 6) == 0, ""); // both-error {{not an integral constant}} \
45a07aba5dSTimm Baeder                                                                         // both-note {{dereferenced one-past-the-end}}
46a07aba5dSTimm Baeder 
47a07aba5dSTimm Baeder   /// Used to assert because we're passing a dummy pointer to
48a07aba5dSTimm Baeder   /// __builtin_strcmp() when evaluating the return statement.
49a07aba5dSTimm Baeder   constexpr bool char_memchr_mutable() {
50a07aba5dSTimm Baeder     char buffer[] = "mutable";
51a07aba5dSTimm Baeder     return __builtin_strcmp(buffer, "mutable") == 0;
52a07aba5dSTimm Baeder   }
53a07aba5dSTimm Baeder   static_assert(char_memchr_mutable(), "");
54d17e51f3STimm Baeder 
55d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 5) == -1);
56d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 4) == -1);
57d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 3) == -1);
58d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 2) == 0);
59d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 1) == 0);
60d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abaa", "abba", 0) == 0);
61d17e51f3STimm Baeder   static_assert(__builtin_strncmp(0, 0, 0) == 0);
62d17e51f3STimm Baeder   static_assert(__builtin_strncmp("abab\0banana", "abab\0canada", 100) == 0);
63a07aba5dSTimm Baeder }
64a07aba5dSTimm Baeder 
65a07aba5dSTimm Baeder /// Copied from constant-expression-cxx11.cpp
66a07aba5dSTimm Baeder namespace strlen {
67a07aba5dSTimm Baeder constexpr const char *a = "foo\0quux";
68a07aba5dSTimm Baeder   constexpr char b[] = "foo\0quux";
69a07aba5dSTimm Baeder   constexpr int f() { return 'u'; }
70a07aba5dSTimm Baeder   constexpr char c[] = { 'f', 'o', 'o', 0, 'q', f(), 'u', 'x', 0 };
71a07aba5dSTimm Baeder 
72a07aba5dSTimm Baeder   static_assert(__builtin_strlen("foo") == 3, "");
73a07aba5dSTimm Baeder   static_assert(__builtin_strlen("foo\0quux") == 3, "");
74a07aba5dSTimm Baeder   static_assert(__builtin_strlen("foo\0quux" + 4) == 4, "");
75a07aba5dSTimm Baeder 
76a07aba5dSTimm Baeder   constexpr bool check(const char *p) {
77a07aba5dSTimm Baeder     return __builtin_strlen(p) == 3 &&
78a07aba5dSTimm Baeder            __builtin_strlen(p + 1) == 2 &&
79a07aba5dSTimm Baeder            __builtin_strlen(p + 2) == 1 &&
80a07aba5dSTimm Baeder            __builtin_strlen(p + 3) == 0 &&
81a07aba5dSTimm Baeder            __builtin_strlen(p + 4) == 4 &&
82a07aba5dSTimm Baeder            __builtin_strlen(p + 5) == 3 &&
83a07aba5dSTimm Baeder            __builtin_strlen(p + 6) == 2 &&
84a07aba5dSTimm Baeder            __builtin_strlen(p + 7) == 1 &&
85a07aba5dSTimm Baeder            __builtin_strlen(p + 8) == 0;
86a07aba5dSTimm Baeder   }
87a07aba5dSTimm Baeder 
88a07aba5dSTimm Baeder   static_assert(check(a), "");
89a07aba5dSTimm Baeder   static_assert(check(b), "");
90a07aba5dSTimm Baeder   static_assert(check(c), "");
91a07aba5dSTimm Baeder 
92a07aba5dSTimm Baeder   constexpr int over1 = __builtin_strlen(a + 9); // both-error {{constant expression}} \
93a07aba5dSTimm Baeder                                                  // both-note {{one-past-the-end}}
94a07aba5dSTimm Baeder   constexpr int over2 = __builtin_strlen(b + 9); // both-error {{constant expression}} \
95a07aba5dSTimm Baeder                                                  // both-note {{one-past-the-end}}
96a07aba5dSTimm Baeder   constexpr int over3 = __builtin_strlen(c + 9); // both-error {{constant expression}} \
97a07aba5dSTimm Baeder                                                  // both-note {{one-past-the-end}}
98a07aba5dSTimm Baeder 
99a07aba5dSTimm Baeder   constexpr int under1 = __builtin_strlen(a - 1); // both-error {{constant expression}} \
100a07aba5dSTimm Baeder                                                   // both-note {{cannot refer to element -1}}
101a07aba5dSTimm Baeder   constexpr int under2 = __builtin_strlen(b - 1); // both-error {{constant expression}} \
102a07aba5dSTimm Baeder                                                   // both-note {{cannot refer to element -1}}
103a07aba5dSTimm Baeder   constexpr int under3 = __builtin_strlen(c - 1); // both-error {{constant expression}} \
104a07aba5dSTimm Baeder                                                   // both-note {{cannot refer to element -1}}
105a07aba5dSTimm Baeder 
106a07aba5dSTimm Baeder   constexpr char d[] = { 'f', 'o', 'o' }; // no nul terminator.
107a07aba5dSTimm Baeder   constexpr int bad = __builtin_strlen(d); // both-error {{constant expression}} \
108a07aba5dSTimm Baeder                                            // both-note {{one-past-the-end}}
10900b50c91STimm Baeder 
11000b50c91STimm Baeder   constexpr int wn = __builtin_wcslen(L"hello");
11100b50c91STimm Baeder   static_assert(wn == 5);
11200b50c91STimm Baeder   constexpr int wm = wcslen(L"hello"); // both-error {{constant expression}} \
11300b50c91STimm Baeder                                        // both-note {{non-constexpr function 'wcslen' cannot be used in a constant expression}}
11400b50c91STimm Baeder 
11500b50c91STimm Baeder   int arr[3]; // both-note {{here}}
11600b50c91STimm Baeder   int wk = arr[wcslen(L"hello")]; // both-warning {{array index 5}}
117a07aba5dSTimm Baeder }
118a07aba5dSTimm Baeder 
119a07aba5dSTimm Baeder namespace nan {
120a07aba5dSTimm Baeder   constexpr double NaN1 = __builtin_nan("");
121a07aba5dSTimm Baeder 
122a07aba5dSTimm Baeder   /// The current interpreter does not accept this, but it should.
123a07aba5dSTimm Baeder   constexpr float NaN2 = __builtin_nans([](){return "0xAE98";}()); // ref-error {{must be initialized by a constant expression}}
124a07aba5dSTimm Baeder #if __cplusplus < 201703L
125a07aba5dSTimm Baeder   // expected-error@-2 {{must be initialized by a constant expression}}
126a07aba5dSTimm Baeder #endif
127a07aba5dSTimm Baeder 
128a07aba5dSTimm Baeder   constexpr double NaN3 = __builtin_nan("foo"); // both-error {{must be initialized by a constant expression}}
129a07aba5dSTimm Baeder   constexpr float NaN4 = __builtin_nanf("");
130a07aba5dSTimm Baeder   //constexpr long double NaN5 = __builtin_nanf128("");
131a07aba5dSTimm Baeder 
132a07aba5dSTimm Baeder   /// FIXME: This should be accepted by the current interpreter as well.
133a07aba5dSTimm Baeder   constexpr char f[] = {'0', 'x', 'A', 'E', '\0'};
134a07aba5dSTimm Baeder   constexpr double NaN6 = __builtin_nan(f); // ref-error {{must be initialized by a constant expression}}
135a07aba5dSTimm Baeder 
136a07aba5dSTimm Baeder   /// FIXME: Current interpreter misses diagnostics.
137a07aba5dSTimm Baeder   constexpr char f2[] = {'0', 'x', 'A', 'E'}; /// No trailing 0 byte.
138a07aba5dSTimm Baeder   constexpr double NaN7 = __builtin_nan(f2); // both-error {{must be initialized by a constant expression}} \
139a07aba5dSTimm Baeder                                              // expected-note {{read of dereferenced one-past-the-end pointer}}
140a07aba5dSTimm Baeder   static_assert(!__builtin_issignaling(__builtin_nan("")), "");
141a07aba5dSTimm Baeder   static_assert(__builtin_issignaling(__builtin_nans("")), "");
142a07aba5dSTimm Baeder }
143a07aba5dSTimm Baeder 
144a07aba5dSTimm Baeder namespace fmin {
145a07aba5dSTimm Baeder   constexpr float f1 = __builtin_fmin(1.0, 2.0f);
146a07aba5dSTimm Baeder   static_assert(f1 == 1.0f, "");
147a07aba5dSTimm Baeder 
148a07aba5dSTimm Baeder   constexpr float min = __builtin_fmin(__builtin_nan(""), 1);
149a07aba5dSTimm Baeder   static_assert(min == 1, "");
150a07aba5dSTimm Baeder   constexpr float min2 = __builtin_fmin(1, __builtin_nan(""));
151a07aba5dSTimm Baeder   static_assert(min2 == 1, "");
152a07aba5dSTimm Baeder   constexpr float min3 = __builtin_fmin(__builtin_inf(), __builtin_nan(""));
153a07aba5dSTimm Baeder   static_assert(min3 == __builtin_inf(), "");
154a07aba5dSTimm Baeder }
155a07aba5dSTimm Baeder 
156a07aba5dSTimm Baeder namespace inf {
157a07aba5dSTimm Baeder   static_assert(__builtin_isinf(__builtin_inf()), "");
158a07aba5dSTimm Baeder   static_assert(!__builtin_isinf(1.0), "");
159a07aba5dSTimm Baeder 
160a07aba5dSTimm Baeder   static_assert(__builtin_isfinite(1.0), "");
161a07aba5dSTimm Baeder   static_assert(!__builtin_isfinite(__builtin_inf()), "");
162a07aba5dSTimm Baeder 
163a07aba5dSTimm Baeder   static_assert(__builtin_isnormal(1.0), "");
164a07aba5dSTimm Baeder   static_assert(!__builtin_isnormal(__builtin_inf()), "");
165a07aba5dSTimm Baeder 
166a07aba5dSTimm Baeder #ifndef __AVR__
167a07aba5dSTimm Baeder   static_assert(__builtin_issubnormal(0x1p-1070), "");
168a07aba5dSTimm Baeder #endif
169a07aba5dSTimm Baeder   static_assert(!__builtin_issubnormal(__builtin_inf()), "");
170a07aba5dSTimm Baeder 
171a07aba5dSTimm Baeder   static_assert(__builtin_iszero(0.0), "");
172a07aba5dSTimm Baeder   static_assert(!__builtin_iszero(__builtin_inf()), "");
173a07aba5dSTimm Baeder 
174a07aba5dSTimm Baeder   static_assert(__builtin_issignaling(__builtin_nans("")), "");
175a07aba5dSTimm Baeder   static_assert(!__builtin_issignaling(__builtin_inf()), "");
176a07aba5dSTimm Baeder }
177a07aba5dSTimm Baeder 
178a07aba5dSTimm Baeder namespace isfpclass {
179a07aba5dSTimm Baeder   char isfpclass_inf_pos_0[__builtin_isfpclass(__builtin_inf(), 0x0200) ? 1 : -1]; // fcPosInf
180a07aba5dSTimm Baeder   char isfpclass_inf_pos_1[!__builtin_isfpclass(__builtin_inff(), 0x0004) ? 1 : -1]; // fcNegInf
181a07aba5dSTimm Baeder   char isfpclass_inf_pos_2[__builtin_isfpclass(__builtin_infl(), 0x0207) ? 1 : -1]; // fcSNan|fcQNan|fcNegInf|fcPosInf
182a07aba5dSTimm Baeder   char isfpclass_inf_pos_3[!__builtin_isfpclass(__builtin_inf(), 0x01F8) ? 1 : -1]; // fcFinite
183a07aba5dSTimm Baeder   char isfpclass_pos_0    [__builtin_isfpclass(1.0, 0x0100) ? 1 : -1]; // fcPosNormal
184a07aba5dSTimm Baeder   char isfpclass_pos_1    [!__builtin_isfpclass(1.0f, 0x0008) ? 1 : -1]; // fcNegNormal
185a07aba5dSTimm Baeder   char isfpclass_pos_2    [__builtin_isfpclass(1.0L, 0x01F8) ? 1 : -1]; // fcFinite
186a07aba5dSTimm Baeder   char isfpclass_pos_3    [!__builtin_isfpclass(1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan
187a07aba5dSTimm Baeder #ifndef __AVR__
188a07aba5dSTimm Baeder   char isfpclass_pdenorm_0[__builtin_isfpclass(1.0e-40f, 0x0080) ? 1 : -1]; // fcPosSubnormal
189a07aba5dSTimm Baeder   char isfpclass_pdenorm_1[__builtin_isfpclass(1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite
190a07aba5dSTimm Baeder   char isfpclass_pdenorm_2[!__builtin_isfpclass(1.0e-40f, 0x003C) ? 1 : -1]; // fcNegative
191a07aba5dSTimm Baeder   char isfpclass_pdenorm_3[!__builtin_isfpclass(1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite
192a07aba5dSTimm Baeder #endif
193a07aba5dSTimm Baeder   char isfpclass_pzero_0  [__builtin_isfpclass(0.0f, 0x0060) ? 1 : -1]; // fcZero
194a07aba5dSTimm Baeder   char isfpclass_pzero_1  [__builtin_isfpclass(0.0, 0x01F8) ? 1 : -1]; // fcFinite
195a07aba5dSTimm Baeder   char isfpclass_pzero_2  [!__builtin_isfpclass(0.0L, 0x0020) ? 1 : -1]; // fcNegZero
196a07aba5dSTimm Baeder   char isfpclass_pzero_3  [!__builtin_isfpclass(0.0, 0x0003) ? 1 : -1]; // fcNan
197a07aba5dSTimm Baeder   char isfpclass_nzero_0  [__builtin_isfpclass(-0.0f, 0x0060) ? 1 : -1]; // fcZero
198a07aba5dSTimm Baeder   char isfpclass_nzero_1  [__builtin_isfpclass(-0.0, 0x01F8) ? 1 : -1]; // fcFinite
199a07aba5dSTimm Baeder   char isfpclass_nzero_2  [!__builtin_isfpclass(-0.0L, 0x0040) ? 1 : -1]; // fcPosZero
200a07aba5dSTimm Baeder   char isfpclass_nzero_3  [!__builtin_isfpclass(-0.0, 0x0003) ? 1 : -1]; // fcNan
201a07aba5dSTimm Baeder   char isfpclass_ndenorm_0[__builtin_isfpclass(-1.0e-40f, 0x0010) ? 1 : -1]; // fcNegSubnormal
202a07aba5dSTimm Baeder   char isfpclass_ndenorm_2[!__builtin_isfpclass(-1.0e-40f, 0x03C0) ? 1 : -1]; // fcPositive
203a07aba5dSTimm Baeder #ifndef __AVR__
204a07aba5dSTimm Baeder   char isfpclass_ndenorm_1[__builtin_isfpclass(-1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite
205a07aba5dSTimm Baeder   char isfpclass_ndenorm_3[!__builtin_isfpclass(-1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite
206a07aba5dSTimm Baeder #endif
207a07aba5dSTimm Baeder   char isfpclass_neg_0    [__builtin_isfpclass(-1.0, 0x0008) ? 1 : -1]; // fcNegNormal
208a07aba5dSTimm Baeder   char isfpclass_neg_1    [!__builtin_isfpclass(-1.0f, 0x00100) ? 1 : -1]; // fcPosNormal
209a07aba5dSTimm Baeder   char isfpclass_neg_2    [__builtin_isfpclass(-1.0L, 0x01F8) ? 1 : -1]; // fcFinite
210a07aba5dSTimm Baeder   char isfpclass_neg_3    [!__builtin_isfpclass(-1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan
211a07aba5dSTimm Baeder   char isfpclass_inf_neg_0[__builtin_isfpclass(-__builtin_inf(), 0x0004) ? 1 : -1]; // fcNegInf
212a07aba5dSTimm Baeder   char isfpclass_inf_neg_1[!__builtin_isfpclass(-__builtin_inff(), 0x0200) ? 1 : -1]; // fcPosInf
213a07aba5dSTimm Baeder   char isfpclass_inf_neg_2[__builtin_isfpclass(-__builtin_infl(), 0x0207) ? 1 : -1]; // ~fcFinite
214a07aba5dSTimm Baeder   char isfpclass_inf_neg_3[!__builtin_isfpclass(-__builtin_inf(), 0x03C0) ? 1 : -1]; // fcPositive
215a07aba5dSTimm Baeder   char isfpclass_qnan_0   [__builtin_isfpclass(__builtin_nan(""), 0x0002) ? 1 : -1]; // fcQNan
216a07aba5dSTimm Baeder   char isfpclass_qnan_1   [!__builtin_isfpclass(__builtin_nanf(""), 0x0001) ? 1 : -1]; // fcSNan
217a07aba5dSTimm Baeder   char isfpclass_qnan_2   [__builtin_isfpclass(__builtin_nanl(""), 0x0207) ? 1 : -1]; // ~fcFinite
218a07aba5dSTimm Baeder   char isfpclass_qnan_3   [!__builtin_isfpclass(__builtin_nan(""), 0x01F8) ? 1 : -1]; // fcFinite
219a07aba5dSTimm Baeder   char isfpclass_snan_0   [__builtin_isfpclass(__builtin_nansf(""), 0x0001) ? 1 : -1]; // fcSNan
220a07aba5dSTimm Baeder   char isfpclass_snan_1   [!__builtin_isfpclass(__builtin_nans(""), 0x0002) ? 1 : -1]; // fcQNan
221a07aba5dSTimm Baeder   char isfpclass_snan_2   [__builtin_isfpclass(__builtin_nansl(""), 0x0207) ? 1 : -1]; // ~fcFinite
222a07aba5dSTimm Baeder   char isfpclass_snan_3   [!__builtin_isfpclass(__builtin_nans(""), 0x01F8) ? 1 : -1]; // fcFinite
223a07aba5dSTimm Baeder }
224a07aba5dSTimm Baeder 
225f1b64277SMital Ashok namespace signbit {
226f1b64277SMital Ashok   static_assert(
227f1b64277SMital Ashok     !__builtin_signbit(1.0) && __builtin_signbit(-1.0) && !__builtin_signbit(0.0) && __builtin_signbit(-0.0) &&
228f1b64277SMital Ashok     !__builtin_signbitf(1.0f) && __builtin_signbitf(-1.0f) && !__builtin_signbitf(0.0f) && __builtin_signbitf(-0.0f) &&
229f1b64277SMital Ashok     !__builtin_signbitl(1.0L) && __builtin_signbitf(-1.0L) && !__builtin_signbitf(0.0L) && __builtin_signbitf(-0.0L) &&
230f1b64277SMital Ashok     !__builtin_signbit(1.0f) && __builtin_signbit(-1.0f) && !__builtin_signbit(0.0f) && __builtin_signbit(-0.0f) &&
231f1b64277SMital Ashok     !__builtin_signbit(1.0L) && __builtin_signbit(-1.0L) && !__builtin_signbit(0.0L) && __builtin_signbit(-0.0L) &&
232f1b64277SMital Ashok     true, ""
233f1b64277SMital Ashok   );
234f1b64277SMital Ashok }
235f1b64277SMital Ashok 
236f1b64277SMital Ashok namespace floating_comparison {
237f1b64277SMital Ashok #define LESS(X, Y) \
238f1b64277SMital Ashok   !__builtin_isgreater(X, Y) && __builtin_isgreater(Y, X) &&             \
239f1b64277SMital Ashok   !__builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) &&   \
240f1b64277SMital Ashok   __builtin_isless(X, Y) && !__builtin_isless(Y, X) &&                   \
241f1b64277SMital Ashok   __builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) &&         \
242f1b64277SMital Ashok   __builtin_islessgreater(X, Y) && __builtin_islessgreater(Y, X) &&      \
243f1b64277SMital Ashok   !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
244f1b64277SMital Ashok #define EQUAL(X, Y) \
245f1b64277SMital Ashok   !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) &&            \
246f1b64277SMital Ashok   __builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) &&    \
247f1b64277SMital Ashok   !__builtin_isless(X, Y) && !__builtin_isless(Y, X) &&                  \
248f1b64277SMital Ashok   __builtin_islessequal(X, Y) && __builtin_islessequal(Y, X) &&          \
249f1b64277SMital Ashok   !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) &&    \
250f1b64277SMital Ashok   !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
251f1b64277SMital Ashok #define UNORDERED(X, Y) \
252f1b64277SMital Ashok   !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) &&            \
253f1b64277SMital Ashok   !__builtin_isgreaterequal(X, Y) && !__builtin_isgreaterequal(Y, X) &&  \
254f1b64277SMital Ashok   !__builtin_isless(X, Y) && !__builtin_isless(Y, X) &&                  \
255f1b64277SMital Ashok   !__builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) &&        \
256f1b64277SMital Ashok   !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) &&    \
257f1b64277SMital Ashok   __builtin_isunordered(X, Y) && __builtin_isunordered(Y, X)
258f1b64277SMital Ashok 
2599626e84fSTimm Baeder   static_assert(LESS(0.0, 1.0));
2609626e84fSTimm Baeder   static_assert(LESS(0.0, __builtin_inf()));
2619626e84fSTimm Baeder   static_assert(LESS(0.0f, 1.0f));
2629626e84fSTimm Baeder   static_assert(LESS(0.0f, __builtin_inff()));
2639626e84fSTimm Baeder   static_assert(LESS(0.0L, 1.0L));
2649626e84fSTimm Baeder   static_assert(LESS(0.0L, __builtin_infl()));
2659626e84fSTimm Baeder 
2669626e84fSTimm Baeder   static_assert(EQUAL(1.0, 1.0));
2679626e84fSTimm Baeder   static_assert(EQUAL(0.0, -0.0));
2689626e84fSTimm Baeder   static_assert(EQUAL(1.0f, 1.0f));
2699626e84fSTimm Baeder   static_assert(EQUAL(0.0f, -0.0f));
2709626e84fSTimm Baeder   static_assert(EQUAL(1.0L, 1.0L));
2719626e84fSTimm Baeder   static_assert(EQUAL(0.0L, -0.0L));
2729626e84fSTimm Baeder 
2739626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nan(""), 1.0));
2749626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nan(""), __builtin_inf()));
2759626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nanf(""), 1.0f));
2769626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nanf(""), __builtin_inff()));
2779626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nanl(""), 1.0L));
2789626e84fSTimm Baeder   static_assert(UNORDERED(__builtin_nanl(""), __builtin_infl()));
279f1b64277SMital Ashok }
280f1b64277SMital Ashok 
281a07aba5dSTimm Baeder namespace fpclassify {
282a07aba5dSTimm Baeder   char classify_nan     [__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nan(""))];
283a07aba5dSTimm Baeder   char classify_snan    [__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nans(""))];
284a07aba5dSTimm Baeder   char classify_inf     [__builtin_fpclassify(-1, +1, -1, -1, -1, __builtin_inf())];
285a07aba5dSTimm Baeder   char classify_neg_inf [__builtin_fpclassify(-1, +1, -1, -1, -1, -__builtin_inf())];
286a07aba5dSTimm Baeder   char classify_normal  [__builtin_fpclassify(-1, -1, +1, -1, -1, 1.539)];
287a07aba5dSTimm Baeder #ifndef __AVR__
288a07aba5dSTimm Baeder   char classify_normal2 [__builtin_fpclassify(-1, -1, +1, -1, -1, 1e-307)];
289a07aba5dSTimm Baeder   char classify_denorm  [__builtin_fpclassify(-1, -1, -1, +1, -1, 1e-308)];
290a07aba5dSTimm Baeder   char classify_denorm2 [__builtin_fpclassify(-1, -1, -1, +1, -1, -1e-308)];
291a07aba5dSTimm Baeder #endif
292a07aba5dSTimm Baeder   char classify_zero    [__builtin_fpclassify(-1, -1, -1, -1, +1, 0.0)];
293a07aba5dSTimm Baeder   char classify_neg_zero[__builtin_fpclassify(-1, -1, -1, -1, +1, -0.0)];
294a07aba5dSTimm Baeder   char classify_subnorm [__builtin_fpclassify(-1, -1, -1, +1, -1, 1.0e-38f)];
295a07aba5dSTimm Baeder }
296a07aba5dSTimm Baeder 
297332ac18eSc8ef namespace abs {
298332ac18eSc8ef   static_assert(__builtin_abs(14) == 14, "");
299332ac18eSc8ef   static_assert(__builtin_labs(14L) == 14L, "");
300332ac18eSc8ef   static_assert(__builtin_llabs(14LL) == 14LL, "");
301332ac18eSc8ef   static_assert(__builtin_abs(-14) == 14, "");
302332ac18eSc8ef   static_assert(__builtin_labs(-0x14L) == 0x14L, "");
303332ac18eSc8ef   static_assert(__builtin_llabs(-0x141414141414LL) == 0x141414141414LL, "");
304332ac18eSc8ef #define BITSIZE(x) (sizeof(x) * 8)
305332ac18eSc8ef   constexpr int abs4 = __builtin_abs(1 << (BITSIZE(int) - 1)); // both-error {{must be initialized by a constant expression}}
306332ac18eSc8ef   constexpr long abs6 = __builtin_labs(1L << (BITSIZE(long) - 1)); // both-error {{must be initialized by a constant expression}}
307332ac18eSc8ef   constexpr long long abs8 = __builtin_llabs(1LL << (BITSIZE(long long) - 1)); // both-error {{must be initialized by a constant expression}}
308332ac18eSc8ef #undef BITSIZE
309332ac18eSc8ef } // namespace abs
310332ac18eSc8ef 
311a07aba5dSTimm Baeder namespace fabs {
312a07aba5dSTimm Baeder   static_assert(__builtin_fabs(-14.0) == 14.0, "");
313a07aba5dSTimm Baeder }
314a07aba5dSTimm Baeder 
315a07aba5dSTimm Baeder namespace std {
316a07aba5dSTimm Baeder struct source_location {
317a07aba5dSTimm Baeder   struct __impl {
318a07aba5dSTimm Baeder     unsigned int _M_line;
319a07aba5dSTimm Baeder     const char *_M_file_name;
320a07aba5dSTimm Baeder     signed char _M_column;
321a07aba5dSTimm Baeder     const char *_M_function_name;
322a07aba5dSTimm Baeder   };
323a07aba5dSTimm Baeder   using BuiltinT = decltype(__builtin_source_location()); // OK.
324a07aba5dSTimm Baeder };
325a07aba5dSTimm Baeder }
326a07aba5dSTimm Baeder 
327a07aba5dSTimm Baeder namespace SourceLocation {
328a07aba5dSTimm Baeder   constexpr auto A = __builtin_source_location();
329a07aba5dSTimm Baeder   static_assert(A->_M_line == __LINE__ -1, "");
330a07aba5dSTimm Baeder   static_assert(A->_M_column == 22, "");
331a07aba5dSTimm Baeder   static_assert(__builtin_strcmp(A->_M_function_name, "") == 0, "");
332a07aba5dSTimm Baeder   static_assert(__builtin_strcmp(A->_M_file_name, __FILE__) == 0, "");
333a07aba5dSTimm Baeder 
334a07aba5dSTimm Baeder   static_assert(__builtin_LINE() == __LINE__, "");
335a07aba5dSTimm Baeder 
336a07aba5dSTimm Baeder   struct Foo {
337a07aba5dSTimm Baeder     int a = __builtin_LINE();
338a07aba5dSTimm Baeder   };
339a07aba5dSTimm Baeder 
340a07aba5dSTimm Baeder   static_assert(Foo{}.a == __LINE__, "");
341a07aba5dSTimm Baeder 
342a07aba5dSTimm Baeder   struct AA {
343a07aba5dSTimm Baeder     int n = __builtin_LINE();
344a07aba5dSTimm Baeder   };
345a07aba5dSTimm Baeder   struct B {
346a07aba5dSTimm Baeder     AA a = {};
347a07aba5dSTimm Baeder   };
348a07aba5dSTimm Baeder   constexpr void f() {
349a07aba5dSTimm Baeder     constexpr B c = {};
350a07aba5dSTimm Baeder     static_assert(c.a.n == __LINE__ - 1, "");
351a07aba5dSTimm Baeder   }
352a07aba5dSTimm Baeder }
353a07aba5dSTimm Baeder 
354a07aba5dSTimm Baeder #define BITSIZE(x) (sizeof(x) * 8)
355a07aba5dSTimm Baeder namespace popcount {
356a07aba5dSTimm Baeder   static_assert(__builtin_popcount(~0u) == __CHAR_BIT__ * sizeof(unsigned int), "");
357a07aba5dSTimm Baeder   static_assert(__builtin_popcount(0) == 0, "");
358a07aba5dSTimm Baeder   static_assert(__builtin_popcountl(~0ul) == __CHAR_BIT__ * sizeof(unsigned long), "");
359a07aba5dSTimm Baeder   static_assert(__builtin_popcountl(0) == 0, "");
360a07aba5dSTimm Baeder   static_assert(__builtin_popcountll(~0ull) == __CHAR_BIT__ * sizeof(unsigned long long), "");
361a07aba5dSTimm Baeder   static_assert(__builtin_popcountll(0) == 0, "");
362a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned char)~0) == __CHAR_BIT__ * sizeof(unsigned char), "");
363a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned char)0) == 0, "");
364a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned short)~0) == __CHAR_BIT__ * sizeof(unsigned short), "");
365a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned short)0) == 0, "");
366a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(~0u) == __CHAR_BIT__ * sizeof(unsigned int), "");
367a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(0u) == 0, "");
368a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(~0ul) == __CHAR_BIT__ * sizeof(unsigned long), "");
369a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(0ul) == 0, "");
370a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(~0ull) == __CHAR_BIT__ * sizeof(unsigned long long), "");
371a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(0ull) == 0, "");
372a07aba5dSTimm Baeder #ifdef __SIZEOF_INT128__
373a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(~(unsigned __int128)0) == __CHAR_BIT__ * sizeof(unsigned __int128), "");
374a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned __int128)0) == 0, "");
375a07aba5dSTimm Baeder #endif
376a07aba5dSTimm Baeder #ifndef __AVR__
377a07aba5dSTimm Baeder   static_assert(__builtin_popcountg(~(unsigned _BitInt(128))0) == __CHAR_BIT__ * sizeof(unsigned _BitInt(128)), "");
378a07aba5dSTimm Baeder   static_assert(__builtin_popcountg((unsigned _BitInt(128))0) == 0, "");
379a07aba5dSTimm Baeder #endif
380a07aba5dSTimm Baeder 
381a07aba5dSTimm Baeder   /// From test/Sema/constant-builtins-2.c
382a07aba5dSTimm Baeder   char popcount1[__builtin_popcount(0) == 0 ? 1 : -1];
383a07aba5dSTimm Baeder   char popcount2[__builtin_popcount(0xF0F0) == 8 ? 1 : -1];
384a07aba5dSTimm Baeder   char popcount3[__builtin_popcount(~0) == BITSIZE(int) ? 1 : -1];
385a07aba5dSTimm Baeder   char popcount4[__builtin_popcount(~0L) == BITSIZE(int) ? 1 : -1];
386a07aba5dSTimm Baeder   char popcount5[__builtin_popcountl(0L) == 0 ? 1 : -1];
387a07aba5dSTimm Baeder   char popcount6[__builtin_popcountl(0xF0F0L) == 8 ? 1 : -1];
388a07aba5dSTimm Baeder   char popcount7[__builtin_popcountl(~0L) == BITSIZE(long) ? 1 : -1];
389a07aba5dSTimm Baeder   char popcount8[__builtin_popcountll(0LL) == 0 ? 1 : -1];
390a07aba5dSTimm Baeder   char popcount9[__builtin_popcountll(0xF0F0LL) == 8 ? 1 : -1];
391a07aba5dSTimm Baeder   char popcount10[__builtin_popcountll(~0LL) == BITSIZE(long long) ? 1 : -1];
392a07aba5dSTimm Baeder   char popcount11[__builtin_popcountg(0U) == 0 ? 1 : -1];
393a07aba5dSTimm Baeder   char popcount12[__builtin_popcountg(0xF0F0U) == 8 ? 1 : -1];
394a07aba5dSTimm Baeder   char popcount13[__builtin_popcountg(~0U) == BITSIZE(int) ? 1 : -1];
395a07aba5dSTimm Baeder   char popcount14[__builtin_popcountg(~0UL) == BITSIZE(long) ? 1 : -1];
396a07aba5dSTimm Baeder   char popcount15[__builtin_popcountg(~0ULL) == BITSIZE(long long) ? 1 : -1];
397a07aba5dSTimm Baeder #ifdef __SIZEOF_INT128__
398a07aba5dSTimm Baeder   char popcount16[__builtin_popcountg(~(unsigned __int128)0) == BITSIZE(__int128) ? 1 : -1];
399a07aba5dSTimm Baeder #endif
400a07aba5dSTimm Baeder #ifndef __AVR__
401a07aba5dSTimm Baeder   char popcount17[__builtin_popcountg(~(unsigned _BitInt(128))0) == BITSIZE(_BitInt(128)) ? 1 : -1];
402a07aba5dSTimm Baeder #endif
403a07aba5dSTimm Baeder }
404a07aba5dSTimm Baeder 
405a07aba5dSTimm Baeder namespace parity {
406a07aba5dSTimm Baeder   /// From test/Sema/constant-builtins-2.c
407a07aba5dSTimm Baeder   char parity1[__builtin_parity(0) == 0 ? 1 : -1];
408a07aba5dSTimm Baeder   char parity2[__builtin_parity(0xb821) == 0 ? 1 : -1];
409a07aba5dSTimm Baeder   char parity3[__builtin_parity(0xb822) == 0 ? 1 : -1];
410a07aba5dSTimm Baeder   char parity4[__builtin_parity(0xb823) == 1 ? 1 : -1];
411a07aba5dSTimm Baeder   char parity5[__builtin_parity(0xb824) == 0 ? 1 : -1];
412a07aba5dSTimm Baeder   char parity6[__builtin_parity(0xb825) == 1 ? 1 : -1];
413a07aba5dSTimm Baeder   char parity7[__builtin_parity(0xb826) == 1 ? 1 : -1];
414a07aba5dSTimm Baeder   char parity8[__builtin_parity(~0) == 0 ? 1 : -1];
415a07aba5dSTimm Baeder   char parity9[__builtin_parityl(1L << (BITSIZE(long) - 1)) == 1 ? 1 : -1];
416a07aba5dSTimm Baeder   char parity10[__builtin_parityll(1LL << (BITSIZE(long long) - 1)) == 1 ? 1 : -1];
417a07aba5dSTimm Baeder }
418a07aba5dSTimm Baeder 
419a07aba5dSTimm Baeder namespace clrsb {
420a07aba5dSTimm Baeder   char clrsb1[__builtin_clrsb(0) == BITSIZE(int) - 1 ? 1 : -1];
421a07aba5dSTimm Baeder   char clrsb2[__builtin_clrsbl(0L) == BITSIZE(long) - 1 ? 1 : -1];
422a07aba5dSTimm Baeder   char clrsb3[__builtin_clrsbll(0LL) == BITSIZE(long long) - 1 ? 1 : -1];
423a07aba5dSTimm Baeder   char clrsb4[__builtin_clrsb(~0) == BITSIZE(int) - 1 ? 1 : -1];
424a07aba5dSTimm Baeder   char clrsb5[__builtin_clrsbl(~0L) == BITSIZE(long) - 1 ? 1 : -1];
425a07aba5dSTimm Baeder   char clrsb6[__builtin_clrsbll(~0LL) == BITSIZE(long long) - 1 ? 1 : -1];
426a07aba5dSTimm Baeder   char clrsb7[__builtin_clrsb(1) == BITSIZE(int) - 2 ? 1 : -1];
427a07aba5dSTimm Baeder   char clrsb8[__builtin_clrsb(~1) == BITSIZE(int) - 2 ? 1 : -1];
428a07aba5dSTimm Baeder   char clrsb9[__builtin_clrsb(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
429a07aba5dSTimm Baeder   char clrsb10[__builtin_clrsb(~(1 << (BITSIZE(int) - 1))) == 0 ? 1 : -1];
430a07aba5dSTimm Baeder   char clrsb11[__builtin_clrsb(0xf) == BITSIZE(int) - 5 ? 1 : -1];
431a07aba5dSTimm Baeder   char clrsb12[__builtin_clrsb(~0x1f) == BITSIZE(int) - 6 ? 1 : -1];
432a07aba5dSTimm Baeder }
433a07aba5dSTimm Baeder 
434a07aba5dSTimm Baeder namespace bitreverse {
435a07aba5dSTimm Baeder   char bitreverse1[__builtin_bitreverse8(0x01) == 0x80 ? 1 : -1];
436a07aba5dSTimm Baeder   char bitreverse2[__builtin_bitreverse16(0x3C48) == 0x123C ? 1 : -1];
437a07aba5dSTimm Baeder   char bitreverse3[__builtin_bitreverse32(0x12345678) == 0x1E6A2C48 ? 1 : -1];
438a07aba5dSTimm Baeder   char bitreverse4[__builtin_bitreverse64(0x0123456789ABCDEFULL) == 0xF7B3D591E6A2C480 ? 1 : -1];
439a07aba5dSTimm Baeder }
440a07aba5dSTimm Baeder 
441a07aba5dSTimm Baeder namespace expect {
442a07aba5dSTimm Baeder   constexpr int a() {
443a07aba5dSTimm Baeder     return 12;
444a07aba5dSTimm Baeder   }
445a07aba5dSTimm Baeder   static_assert(__builtin_expect(a(),1) == 12, "");
446a07aba5dSTimm Baeder   static_assert(__builtin_expect_with_probability(a(), 1, 1.0) == 12, "");
447a07aba5dSTimm Baeder }
448a07aba5dSTimm Baeder 
449a07aba5dSTimm Baeder namespace rotateleft {
450a07aba5dSTimm Baeder   char rotateleft1[__builtin_rotateleft8(0x01, 5) == 0x20 ? 1 : -1];
451a07aba5dSTimm Baeder   char rotateleft2[__builtin_rotateleft16(0x3210, 11) == 0x8190 ? 1 : -1];
452a07aba5dSTimm Baeder   char rotateleft3[__builtin_rotateleft32(0x76543210, 22) == 0x841D950C ? 1 : -1];
453a07aba5dSTimm Baeder   char rotateleft4[__builtin_rotateleft64(0xFEDCBA9876543210ULL, 55) == 0x87F6E5D4C3B2A19ULL ? 1 : -1];
454a07aba5dSTimm Baeder }
455a07aba5dSTimm Baeder 
456a07aba5dSTimm Baeder namespace rotateright {
457a07aba5dSTimm Baeder   char rotateright1[__builtin_rotateright8(0x01, 5) == 0x08 ? 1 : -1];
458a07aba5dSTimm Baeder   char rotateright2[__builtin_rotateright16(0x3210, 11) == 0x4206 ? 1 : -1];
459a07aba5dSTimm Baeder   char rotateright3[__builtin_rotateright32(0x76543210, 22) == 0x50C841D9 ? 1 : -1];
460a07aba5dSTimm Baeder   char rotateright4[__builtin_rotateright64(0xFEDCBA9876543210ULL, 55) == 0xB97530ECA86421FDULL ? 1 : -1];
461a07aba5dSTimm Baeder }
462a07aba5dSTimm Baeder 
463a07aba5dSTimm Baeder namespace ffs {
464a07aba5dSTimm Baeder   char ffs1[__builtin_ffs(0) == 0 ? 1 : -1];
465a07aba5dSTimm Baeder   char ffs2[__builtin_ffs(1) == 1 ? 1 : -1];
466a07aba5dSTimm Baeder   char ffs3[__builtin_ffs(0xfbe71) == 1 ? 1 : -1];
467a07aba5dSTimm Baeder   char ffs4[__builtin_ffs(0xfbe70) == 5 ? 1 : -1];
468a07aba5dSTimm Baeder   char ffs5[__builtin_ffs(1U << (BITSIZE(int) - 1)) == BITSIZE(int) ? 1 : -1];
469a07aba5dSTimm Baeder   char ffs6[__builtin_ffsl(0x10L) == 5 ? 1 : -1];
470a07aba5dSTimm Baeder   char ffs7[__builtin_ffsll(0x100LL) == 9 ? 1 : -1];
471a07aba5dSTimm Baeder }
472a07aba5dSTimm Baeder 
473a07aba5dSTimm Baeder namespace EhReturnDataRegno {
474a07aba5dSTimm Baeder   void test11(int X) {
475a07aba5dSTimm Baeder     switch (X) {
476a07aba5dSTimm Baeder       case __builtin_eh_return_data_regno(0):  // constant foldable.
477a07aba5dSTimm Baeder       break;
478a07aba5dSTimm Baeder     }
479a07aba5dSTimm Baeder     __builtin_eh_return_data_regno(X);  // both-error {{argument to '__builtin_eh_return_data_regno' must be a constant integer}}
480a07aba5dSTimm Baeder   }
481a07aba5dSTimm Baeder }
482a07aba5dSTimm Baeder 
483a07aba5dSTimm Baeder /// From test/SemaCXX/builtins.cpp
484a07aba5dSTimm Baeder namespace test_launder {
485a07aba5dSTimm Baeder #define TEST_TYPE(Ptr, Type) \
486a07aba5dSTimm Baeder   static_assert(__is_same(decltype(__builtin_launder(Ptr)), Type), "expected same type")
487a07aba5dSTimm Baeder 
488a07aba5dSTimm Baeder struct Dummy {};
489a07aba5dSTimm Baeder 
490a07aba5dSTimm Baeder using FnType = int(char);
491a07aba5dSTimm Baeder using MemFnType = int (Dummy::*)(char);
492a07aba5dSTimm Baeder using ConstMemFnType = int (Dummy::*)() const;
493a07aba5dSTimm Baeder 
494a07aba5dSTimm Baeder void foo() {}
495a07aba5dSTimm Baeder 
496a07aba5dSTimm Baeder void test_builtin_launder_diags(void *vp, const void *cvp, FnType *fnp,
497a07aba5dSTimm Baeder                                 MemFnType mfp, ConstMemFnType cmfp, int (&Arr)[5]) {
498a07aba5dSTimm Baeder   __builtin_launder(vp);   // both-error {{void pointer argument to '__builtin_launder' is not allowed}}
499a07aba5dSTimm Baeder   __builtin_launder(cvp);  // both-error {{void pointer argument to '__builtin_launder' is not allowed}}
500a07aba5dSTimm Baeder   __builtin_launder(fnp);  // both-error {{function pointer argument to '__builtin_launder' is not allowed}}
501a07aba5dSTimm Baeder   __builtin_launder(mfp);  // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
502a07aba5dSTimm Baeder   __builtin_launder(cmfp); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
503a07aba5dSTimm Baeder   (void)__builtin_launder(&fnp);
504a07aba5dSTimm Baeder   __builtin_launder(42);      // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
505a07aba5dSTimm Baeder   __builtin_launder(nullptr); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
506a07aba5dSTimm Baeder   __builtin_launder(foo);     // both-error {{function pointer argument to '__builtin_launder' is not allowed}}
507a07aba5dSTimm Baeder   (void)__builtin_launder(Arr);
508a07aba5dSTimm Baeder }
509a07aba5dSTimm Baeder 
510a07aba5dSTimm Baeder void test_builtin_launder(char *p, const volatile int *ip, const float *&fp,
511a07aba5dSTimm Baeder                           double *__restrict dp) {
512a07aba5dSTimm Baeder   int x;
513a07aba5dSTimm Baeder   __builtin_launder(x); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}
514a07aba5dSTimm Baeder 
515a07aba5dSTimm Baeder   TEST_TYPE(p, char*);
516a07aba5dSTimm Baeder   TEST_TYPE(ip, const volatile int*);
517a07aba5dSTimm Baeder   TEST_TYPE(fp, const float*);
518a07aba5dSTimm Baeder   TEST_TYPE(dp, double *__restrict);
519a07aba5dSTimm Baeder 
520a07aba5dSTimm Baeder   char *d = __builtin_launder(p);
521a07aba5dSTimm Baeder   const volatile int *id = __builtin_launder(ip);
522a07aba5dSTimm Baeder   int *id2 = __builtin_launder(ip); // both-error {{cannot initialize a variable of type 'int *' with an rvalue of type 'const volatile int *'}}
523a07aba5dSTimm Baeder   const float* fd = __builtin_launder(fp);
524a07aba5dSTimm Baeder }
525a07aba5dSTimm Baeder 
526a07aba5dSTimm Baeder void test_launder_return_type(const int (&ArrayRef)[101], int (&MArrRef)[42][13],
527a07aba5dSTimm Baeder                               void (**&FuncPtrRef)()) {
528a07aba5dSTimm Baeder   TEST_TYPE(ArrayRef, const int *);
529a07aba5dSTimm Baeder   TEST_TYPE(MArrRef, int(*)[13]);
530a07aba5dSTimm Baeder   TEST_TYPE(FuncPtrRef, void (**)());
531a07aba5dSTimm Baeder }
532a07aba5dSTimm Baeder 
533a07aba5dSTimm Baeder template <class Tp>
534a07aba5dSTimm Baeder constexpr Tp *test_constexpr_launder(Tp *tp) {
535a07aba5dSTimm Baeder   return __builtin_launder(tp);
536a07aba5dSTimm Baeder }
537a07aba5dSTimm Baeder constexpr int const_int = 42;
538a07aba5dSTimm Baeder constexpr int const_int2 = 101;
539a07aba5dSTimm Baeder constexpr const int *const_ptr = test_constexpr_launder(&const_int);
540a07aba5dSTimm Baeder static_assert(&const_int == const_ptr, "");
541a07aba5dSTimm Baeder static_assert(const_ptr != test_constexpr_launder(&const_int2), "");
542a07aba5dSTimm Baeder 
543a07aba5dSTimm Baeder void test_non_constexpr() {
544a07aba5dSTimm Baeder   constexpr int i = 42;                            // both-note {{address of non-static constexpr variable 'i' may differ on each invocation}}
545a07aba5dSTimm Baeder   constexpr const int *ip = __builtin_launder(&i); // both-error {{constexpr variable 'ip' must be initialized by a constant expression}}
546a07aba5dSTimm Baeder   // both-note@-1 {{pointer to 'i' is not a constant expression}}
547a07aba5dSTimm Baeder }
548a07aba5dSTimm Baeder 
549a07aba5dSTimm Baeder constexpr bool test_in_constexpr(const int &i) {
550a07aba5dSTimm Baeder   return (__builtin_launder(&i) == &i);
551a07aba5dSTimm Baeder }
552a07aba5dSTimm Baeder 
553a07aba5dSTimm Baeder static_assert(test_in_constexpr(const_int), "");
554a07aba5dSTimm Baeder void f() {
555a07aba5dSTimm Baeder   constexpr int i = 42;
556a07aba5dSTimm Baeder   static_assert(test_in_constexpr(i), "");
557a07aba5dSTimm Baeder }
558a07aba5dSTimm Baeder 
559a07aba5dSTimm Baeder struct Incomplete; // both-note {{forward declaration}}
560a07aba5dSTimm Baeder struct IncompleteMember {
561a07aba5dSTimm Baeder   Incomplete &i;
562a07aba5dSTimm Baeder };
563a07aba5dSTimm Baeder void test_incomplete(Incomplete *i, IncompleteMember *im) {
564a07aba5dSTimm Baeder   // both-error@+1 {{incomplete type 'Incomplete' where a complete type is required}}
565a07aba5dSTimm Baeder   __builtin_launder(i);
566a07aba5dSTimm Baeder   __builtin_launder(&i); // OK
567a07aba5dSTimm Baeder   __builtin_launder(im); // OK
568a07aba5dSTimm Baeder }
569a07aba5dSTimm Baeder 
570a07aba5dSTimm Baeder void test_noexcept(int *i) {
571a07aba5dSTimm Baeder   static_assert(noexcept(__builtin_launder(i)), "");
572a07aba5dSTimm Baeder }
573a07aba5dSTimm Baeder #undef TEST_TYPE
574a07aba5dSTimm Baeder } // end namespace test_launder
575a07aba5dSTimm Baeder 
576a07aba5dSTimm Baeder 
577a07aba5dSTimm Baeder /// FIXME: The commented out tests here use a IntAP value and fail.
578a07aba5dSTimm Baeder /// This currently means we will leak the IntAP value since nothing cleans it up.
579a07aba5dSTimm Baeder namespace clz {
580a07aba5dSTimm Baeder   char clz1[__builtin_clz(1) == BITSIZE(int) - 1 ? 1 : -1];
581a07aba5dSTimm Baeder   char clz2[__builtin_clz(7) == BITSIZE(int) - 3 ? 1 : -1];
582a07aba5dSTimm Baeder   char clz3[__builtin_clz(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
583a07aba5dSTimm Baeder   int clz4 = __builtin_clz(0);
584a07aba5dSTimm Baeder   char clz5[__builtin_clzl(0xFL) == BITSIZE(long) - 4 ? 1 : -1];
585a07aba5dSTimm Baeder   char clz6[__builtin_clzll(0xFFLL) == BITSIZE(long long) - 8 ? 1 : -1];
586a07aba5dSTimm Baeder   char clz7[__builtin_clzs(0x1) == BITSIZE(short) - 1 ? 1 : -1];
587a07aba5dSTimm Baeder   char clz8[__builtin_clzs(0xf) == BITSIZE(short) - 4 ? 1 : -1];
588a07aba5dSTimm Baeder   char clz9[__builtin_clzs(0xfff) == BITSIZE(short) - 12 ? 1 : -1];
589a07aba5dSTimm Baeder 
590a07aba5dSTimm Baeder   int clz10 = __builtin_clzg((unsigned char)0);
591a07aba5dSTimm Baeder   char clz11[__builtin_clzg((unsigned char)0, 42) == 42 ? 1 : -1];
592a07aba5dSTimm Baeder   char clz12[__builtin_clzg((unsigned char)0x1) == BITSIZE(char) - 1 ? 1 : -1];
593a07aba5dSTimm Baeder   char clz13[__builtin_clzg((unsigned char)0x1, 42) == BITSIZE(char) - 1 ? 1 : -1];
594a07aba5dSTimm Baeder   char clz14[__builtin_clzg((unsigned char)0xf) == BITSIZE(char) - 4 ? 1 : -1];
595a07aba5dSTimm Baeder   char clz15[__builtin_clzg((unsigned char)0xf, 42) == BITSIZE(char) - 4 ? 1 : -1];
596a07aba5dSTimm Baeder   char clz16[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1))) == 0 ? 1 : -1];
597a07aba5dSTimm Baeder   char clz17[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == 0 ? 1 : -1];
598a07aba5dSTimm Baeder   int clz18 = __builtin_clzg((unsigned short)0);
599a07aba5dSTimm Baeder   char clz19[__builtin_clzg((unsigned short)0, 42) == 42 ? 1 : -1];
600a07aba5dSTimm Baeder   char clz20[__builtin_clzg((unsigned short)0x1) == BITSIZE(short) - 1 ? 1 : -1];
601a07aba5dSTimm Baeder   char clz21[__builtin_clzg((unsigned short)0x1, 42) == BITSIZE(short) - 1 ? 1 : -1];
602a07aba5dSTimm Baeder   char clz22[__builtin_clzg((unsigned short)0xf) == BITSIZE(short) - 4 ? 1 : -1];
603a07aba5dSTimm Baeder   char clz23[__builtin_clzg((unsigned short)0xf, 42) == BITSIZE(short) - 4 ? 1 : -1];
604a07aba5dSTimm Baeder   char clz24[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1))) == 0 ? 1 : -1];
605a07aba5dSTimm Baeder   char clz25[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == 0 ? 1 : -1];
606a07aba5dSTimm Baeder   int clz26 = __builtin_clzg(0U);
607a07aba5dSTimm Baeder   char clz27[__builtin_clzg(0U, 42) == 42 ? 1 : -1];
608a07aba5dSTimm Baeder   char clz28[__builtin_clzg(0x1U) == BITSIZE(int) - 1 ? 1 : -1];
609a07aba5dSTimm Baeder   char clz29[__builtin_clzg(0x1U, 42) == BITSIZE(int) - 1 ? 1 : -1];
610a07aba5dSTimm Baeder   char clz30[__builtin_clzg(0xfU) == BITSIZE(int) - 4 ? 1 : -1];
611a07aba5dSTimm Baeder   char clz31[__builtin_clzg(0xfU, 42) == BITSIZE(int) - 4 ? 1 : -1];
612a07aba5dSTimm Baeder   char clz32[__builtin_clzg(1U << (BITSIZE(int) - 1)) == 0 ? 1 : -1];
613a07aba5dSTimm Baeder   char clz33[__builtin_clzg(1U << (BITSIZE(int) - 1), 42) == 0 ? 1 : -1];
614a07aba5dSTimm Baeder   int clz34 = __builtin_clzg(0UL);
615a07aba5dSTimm Baeder   char clz35[__builtin_clzg(0UL, 42) == 42 ? 1 : -1];
616a07aba5dSTimm Baeder   char clz36[__builtin_clzg(0x1UL) == BITSIZE(long) - 1 ? 1 : -1];
617a07aba5dSTimm Baeder   char clz37[__builtin_clzg(0x1UL, 42) == BITSIZE(long) - 1 ? 1 : -1];
618a07aba5dSTimm Baeder   char clz38[__builtin_clzg(0xfUL) == BITSIZE(long) - 4 ? 1 : -1];
619a07aba5dSTimm Baeder   char clz39[__builtin_clzg(0xfUL, 42) == BITSIZE(long) - 4 ? 1 : -1];
620a07aba5dSTimm Baeder   char clz40[__builtin_clzg(1UL << (BITSIZE(long) - 1)) == 0 ? 1 : -1];
621a07aba5dSTimm Baeder   char clz41[__builtin_clzg(1UL << (BITSIZE(long) - 1), 42) == 0 ? 1 : -1];
622a07aba5dSTimm Baeder   int clz42 = __builtin_clzg(0ULL);
623a07aba5dSTimm Baeder   char clz43[__builtin_clzg(0ULL, 42) == 42 ? 1 : -1];
624a07aba5dSTimm Baeder   char clz44[__builtin_clzg(0x1ULL) == BITSIZE(long long) - 1 ? 1 : -1];
625a07aba5dSTimm Baeder   char clz45[__builtin_clzg(0x1ULL, 42) == BITSIZE(long long) - 1 ? 1 : -1];
626a07aba5dSTimm Baeder   char clz46[__builtin_clzg(0xfULL) == BITSIZE(long long) - 4 ? 1 : -1];
627a07aba5dSTimm Baeder   char clz47[__builtin_clzg(0xfULL, 42) == BITSIZE(long long) - 4 ? 1 : -1];
628a07aba5dSTimm Baeder   char clz48[__builtin_clzg(1ULL << (BITSIZE(long long) - 1)) == 0 ? 1 : -1];
629a07aba5dSTimm Baeder   char clz49[__builtin_clzg(1ULL << (BITSIZE(long long) - 1), 42) == 0 ? 1 : -1];
630a07aba5dSTimm Baeder #ifdef __SIZEOF_INT128__
631a07aba5dSTimm Baeder   // int clz50 = __builtin_clzg((unsigned __int128)0);
632a07aba5dSTimm Baeder   char clz51[__builtin_clzg((unsigned __int128)0, 42) == 42 ? 1 : -1];
633a07aba5dSTimm Baeder   char clz52[__builtin_clzg((unsigned __int128)0x1) == BITSIZE(__int128) - 1 ? 1 : -1];
634a07aba5dSTimm Baeder   char clz53[__builtin_clzg((unsigned __int128)0x1, 42) == BITSIZE(__int128) - 1 ? 1 : -1];
635a07aba5dSTimm Baeder   char clz54[__builtin_clzg((unsigned __int128)0xf) == BITSIZE(__int128) - 4 ? 1 : -1];
636a07aba5dSTimm Baeder   char clz55[__builtin_clzg((unsigned __int128)0xf, 42) == BITSIZE(__int128) - 4 ? 1 : -1];
637a07aba5dSTimm Baeder #endif
638a07aba5dSTimm Baeder #ifndef __AVR__
639a07aba5dSTimm Baeder   // int clz58 = __builtin_clzg((unsigned _BitInt(128))0);
640a07aba5dSTimm Baeder   char clz59[__builtin_clzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];
641a07aba5dSTimm Baeder   char clz60[__builtin_clzg((unsigned _BitInt(128))0x1) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
642a07aba5dSTimm Baeder   char clz61[__builtin_clzg((unsigned _BitInt(128))0x1, 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
643a07aba5dSTimm Baeder   char clz62[__builtin_clzg((unsigned _BitInt(128))0xf) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];
644a07aba5dSTimm Baeder   char clz63[__builtin_clzg((unsigned _BitInt(128))0xf, 42) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];
645a07aba5dSTimm Baeder #endif
646a07aba5dSTimm Baeder }
647a07aba5dSTimm Baeder 
648a07aba5dSTimm Baeder namespace ctz {
649a07aba5dSTimm Baeder   char ctz1[__builtin_ctz(1) == 0 ? 1 : -1];
650a07aba5dSTimm Baeder   char ctz2[__builtin_ctz(8) == 3 ? 1 : -1];
651a07aba5dSTimm Baeder   char ctz3[__builtin_ctz(1 << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];
652a07aba5dSTimm Baeder   int ctz4 = __builtin_ctz(0);
653a07aba5dSTimm Baeder   char ctz5[__builtin_ctzl(0x10L) == 4 ? 1 : -1];
654a07aba5dSTimm Baeder   char ctz6[__builtin_ctzll(0x100LL) == 8 ? 1 : -1];
655a07aba5dSTimm Baeder   char ctz7[__builtin_ctzs(1 << (BITSIZE(short) - 1)) == BITSIZE(short) - 1 ? 1 : -1];
656a07aba5dSTimm Baeder   int ctz8 = __builtin_ctzg((unsigned char)0);
657a07aba5dSTimm Baeder   char ctz9[__builtin_ctzg((unsigned char)0, 42) == 42 ? 1 : -1];
658a07aba5dSTimm Baeder   char ctz10[__builtin_ctzg((unsigned char)0x1) == 0 ? 1 : -1];
659a07aba5dSTimm Baeder   char ctz11[__builtin_ctzg((unsigned char)0x1, 42) == 0 ? 1 : -1];
660a07aba5dSTimm Baeder   char ctz12[__builtin_ctzg((unsigned char)0x10) == 4 ? 1 : -1];
661a07aba5dSTimm Baeder   char ctz13[__builtin_ctzg((unsigned char)0x10, 42) == 4 ? 1 : -1];
662a07aba5dSTimm Baeder   char ctz14[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1))) == BITSIZE(char) - 1 ? 1 : -1];
663a07aba5dSTimm Baeder   char ctz15[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == BITSIZE(char) - 1 ? 1 : -1];
664a07aba5dSTimm Baeder   int ctz16 = __builtin_ctzg((unsigned short)0);
665a07aba5dSTimm Baeder   char ctz17[__builtin_ctzg((unsigned short)0, 42) == 42 ? 1 : -1];
666a07aba5dSTimm Baeder   char ctz18[__builtin_ctzg((unsigned short)0x1) == 0 ? 1 : -1];
667a07aba5dSTimm Baeder   char ctz19[__builtin_ctzg((unsigned short)0x1, 42) == 0 ? 1 : -1];
668a07aba5dSTimm Baeder   char ctz20[__builtin_ctzg((unsigned short)0x10) == 4 ? 1 : -1];
669a07aba5dSTimm Baeder   char ctz21[__builtin_ctzg((unsigned short)0x10, 42) == 4 ? 1 : -1];
670a07aba5dSTimm Baeder   char ctz22[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1))) == BITSIZE(short) - 1 ? 1 : -1];
671a07aba5dSTimm Baeder   char ctz23[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == BITSIZE(short) - 1 ? 1 : -1];
672a07aba5dSTimm Baeder   int ctz24 = __builtin_ctzg(0U);
673a07aba5dSTimm Baeder   char ctz25[__builtin_ctzg(0U, 42) == 42 ? 1 : -1];
674a07aba5dSTimm Baeder   char ctz26[__builtin_ctzg(0x1U) == 0 ? 1 : -1];
675a07aba5dSTimm Baeder   char ctz27[__builtin_ctzg(0x1U, 42) == 0 ? 1 : -1];
676a07aba5dSTimm Baeder   char ctz28[__builtin_ctzg(0x10U) == 4 ? 1 : -1];
677a07aba5dSTimm Baeder   char ctz29[__builtin_ctzg(0x10U, 42) == 4 ? 1 : -1];
678a07aba5dSTimm Baeder   char ctz30[__builtin_ctzg(1U << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];
679a07aba5dSTimm Baeder   char ctz31[__builtin_ctzg(1U << (BITSIZE(int) - 1), 42) == BITSIZE(int) - 1 ? 1 : -1];
680a07aba5dSTimm Baeder   int ctz32 = __builtin_ctzg(0UL);
681a07aba5dSTimm Baeder   char ctz33[__builtin_ctzg(0UL, 42) == 42 ? 1 : -1];
682a07aba5dSTimm Baeder   char ctz34[__builtin_ctzg(0x1UL) == 0 ? 1 : -1];
683a07aba5dSTimm Baeder   char ctz35[__builtin_ctzg(0x1UL, 42) == 0 ? 1 : -1];
684a07aba5dSTimm Baeder   char ctz36[__builtin_ctzg(0x10UL) == 4 ? 1 : -1];
685a07aba5dSTimm Baeder   char ctz37[__builtin_ctzg(0x10UL, 42) == 4 ? 1 : -1];
686a07aba5dSTimm Baeder   char ctz38[__builtin_ctzg(1UL << (BITSIZE(long) - 1)) == BITSIZE(long) - 1 ? 1 : -1];
687a07aba5dSTimm Baeder   char ctz39[__builtin_ctzg(1UL << (BITSIZE(long) - 1), 42) == BITSIZE(long) - 1 ? 1 : -1];
688a07aba5dSTimm Baeder   int ctz40 = __builtin_ctzg(0ULL);
689a07aba5dSTimm Baeder   char ctz41[__builtin_ctzg(0ULL, 42) == 42 ? 1 : -1];
690a07aba5dSTimm Baeder   char ctz42[__builtin_ctzg(0x1ULL) == 0 ? 1 : -1];
691a07aba5dSTimm Baeder   char ctz43[__builtin_ctzg(0x1ULL, 42) == 0 ? 1 : -1];
692a07aba5dSTimm Baeder   char ctz44[__builtin_ctzg(0x10ULL) == 4 ? 1 : -1];
693a07aba5dSTimm Baeder   char ctz45[__builtin_ctzg(0x10ULL, 42) == 4 ? 1 : -1];
694a07aba5dSTimm Baeder   char ctz46[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1)) == BITSIZE(long long) - 1 ? 1 : -1];
695a07aba5dSTimm Baeder   char ctz47[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1), 42) == BITSIZE(long long) - 1 ? 1 : -1];
696a07aba5dSTimm Baeder #ifdef __SIZEOF_INT128__
697a07aba5dSTimm Baeder   // int ctz48 = __builtin_ctzg((unsigned __int128)0);
698a07aba5dSTimm Baeder   char ctz49[__builtin_ctzg((unsigned __int128)0, 42) == 42 ? 1 : -1];
699a07aba5dSTimm Baeder   char ctz50[__builtin_ctzg((unsigned __int128)0x1) == 0 ? 1 : -1];
700a07aba5dSTimm Baeder   char ctz51[__builtin_ctzg((unsigned __int128)0x1, 42) == 0 ? 1 : -1];
701a07aba5dSTimm Baeder   char ctz52[__builtin_ctzg((unsigned __int128)0x10) == 4 ? 1 : -1];
702a07aba5dSTimm Baeder   char ctz53[__builtin_ctzg((unsigned __int128)0x10, 42) == 4 ? 1 : -1];
703a07aba5dSTimm Baeder   char ctz54[__builtin_ctzg((unsigned __int128)1 << (BITSIZE(__int128) - 1)) == BITSIZE(__int128) - 1 ? 1 : -1];
704a07aba5dSTimm Baeder   char ctz55[__builtin_ctzg((unsigned __int128)1 << (BITSIZE(__int128) - 1), 42) == BITSIZE(__int128) - 1 ? 1 : -1];
705a07aba5dSTimm Baeder #endif
706a07aba5dSTimm Baeder #ifndef __AVR__
707a07aba5dSTimm Baeder   // int ctz56 = __builtin_ctzg((unsigned _BitInt(128))0);
708a07aba5dSTimm Baeder   char ctz57[__builtin_ctzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];
709a07aba5dSTimm Baeder   char ctz58[__builtin_ctzg((unsigned _BitInt(128))0x1) == 0 ? 1 : -1];
710a07aba5dSTimm Baeder   char ctz59[__builtin_ctzg((unsigned _BitInt(128))0x1, 42) == 0 ? 1 : -1];
711a07aba5dSTimm Baeder   char ctz60[__builtin_ctzg((unsigned _BitInt(128))0x10) == 4 ? 1 : -1];
712a07aba5dSTimm Baeder   char ctz61[__builtin_ctzg((unsigned _BitInt(128))0x10, 42) == 4 ? 1 : -1];
713a07aba5dSTimm Baeder   char ctz62[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1)) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
714a07aba5dSTimm Baeder   char ctz63[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1), 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];
715a07aba5dSTimm Baeder #endif
716a07aba5dSTimm Baeder }
717a07aba5dSTimm Baeder 
718a07aba5dSTimm Baeder namespace bswap {
719a07aba5dSTimm Baeder   extern int f(void);
720a07aba5dSTimm Baeder   int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f();
721a07aba5dSTimm Baeder   int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f();
722a07aba5dSTimm Baeder   int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f();
723a07aba5dSTimm Baeder }
724a07aba5dSTimm Baeder 
725a07aba5dSTimm Baeder #define CFSTR __builtin___CFStringMakeConstantString
726a07aba5dSTimm Baeder void test7(void) {
727a07aba5dSTimm Baeder   const void *X;
728a07aba5dSTimm Baeder #if !defined(_AIX)
729a07aba5dSTimm Baeder   X = CFSTR("\242"); // both-warning {{input conversion stopped}}
730a07aba5dSTimm Baeder   X = CFSTR("\0"); // no-warning
731a07aba5dSTimm Baeder   X = CFSTR(242); // both-error {{cannot initialize a parameter of type 'const char *' with an rvalue of type 'int'}}
732a07aba5dSTimm Baeder   X = CFSTR("foo", "bar"); // both-error {{too many arguments to function call}}
733a07aba5dSTimm Baeder #endif
734a07aba5dSTimm Baeder }
735a07aba5dSTimm Baeder 
736a07aba5dSTimm Baeder /// The actual value on my machine is 22, but I have a feeling this will be different
737a07aba5dSTimm Baeder /// on other targets, so just checking for != 0 here. Light testing is fine since
738a07aba5dSTimm Baeder /// the actual implementation uses analyze_os_log::computeOSLogBufferLayout(), which
739a07aba5dSTimm Baeder /// is tested elsewhere.
740a07aba5dSTimm Baeder static_assert(__builtin_os_log_format_buffer_size("%{mask.xyz}s", "abc") != 0, "");
741a07aba5dSTimm Baeder 
742a07aba5dSTimm Baeder /// Copied from test/Sema/constant_builtins_vector.cpp.
743a07aba5dSTimm Baeder /// Some tests are missing since we run this for multiple targets,
744a07aba5dSTimm Baeder /// some of which do not support _BitInt.
745a07aba5dSTimm Baeder #ifndef __AVR__
746a07aba5dSTimm Baeder typedef _BitInt(128) BitInt128;
747a07aba5dSTimm Baeder typedef double vector4double __attribute__((__vector_size__(32)));
748a07aba5dSTimm Baeder typedef float vector4float __attribute__((__vector_size__(16)));
749a07aba5dSTimm Baeder typedef long long vector4long __attribute__((__vector_size__(32)));
750a07aba5dSTimm Baeder typedef int vector4int __attribute__((__vector_size__(16)));
751a07aba5dSTimm Baeder typedef short vector4short __attribute__((__vector_size__(8)));
752a07aba5dSTimm Baeder typedef char vector4char __attribute__((__vector_size__(4)));
753a07aba5dSTimm Baeder typedef BitInt128 vector4BitInt128 __attribute__((__vector_size__(64)));
754a07aba5dSTimm Baeder typedef double vector8double __attribute__((__vector_size__(64)));
755a07aba5dSTimm Baeder typedef float vector8float __attribute__((__vector_size__(32)));
756a07aba5dSTimm Baeder typedef long long vector8long __attribute__((__vector_size__(64)));
757a07aba5dSTimm Baeder typedef int vector8int __attribute__((__vector_size__(32)));
758a07aba5dSTimm Baeder typedef short vector8short __attribute__((__vector_size__(16)));
759a07aba5dSTimm Baeder typedef char vector8char __attribute__((__vector_size__(8)));
760a07aba5dSTimm Baeder typedef BitInt128 vector8BitInt128 __attribute__((__vector_size__(128)));
761a07aba5dSTimm Baeder 
762a07aba5dSTimm Baeder namespace convertvector {
763a07aba5dSTimm Baeder   constexpr vector4double from_vector4double_to_vector4double_var =
764a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4double);
765a07aba5dSTimm Baeder   constexpr vector4float from_vector4double_to_vector4float_var =
766a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4float);
767a07aba5dSTimm Baeder   constexpr vector4long from_vector4double_to_vector4long_var =
768a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4long);
769a07aba5dSTimm Baeder   constexpr vector4int from_vector4double_to_vector4int_var =
770a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4int);
771a07aba5dSTimm Baeder   constexpr vector4short from_vector4double_to_vector4short_var =
772a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4short);
773a07aba5dSTimm Baeder   constexpr vector4char from_vector4double_to_vector4char_var =
774a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4char);
775a07aba5dSTimm Baeder   constexpr vector4BitInt128 from_vector4double_to_vector4BitInt128_var =
776a07aba5dSTimm Baeder       __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4BitInt128);
777a07aba5dSTimm Baeder   constexpr vector4double from_vector4float_to_vector4double_var =
778a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4double);
779a07aba5dSTimm Baeder   constexpr vector4float from_vector4float_to_vector4float_var =
780a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4float);
781a07aba5dSTimm Baeder   constexpr vector4long from_vector4float_to_vector4long_var =
782a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4long);
783a07aba5dSTimm Baeder   constexpr vector4int from_vector4float_to_vector4int_var =
784a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4int);
785a07aba5dSTimm Baeder   constexpr vector4short from_vector4float_to_vector4short_var =
786a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4short);
787a07aba5dSTimm Baeder   constexpr vector4char from_vector4float_to_vector4char_var =
788a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4char);
789a07aba5dSTimm Baeder   constexpr vector4BitInt128 from_vector4float_to_vector4BitInt128_var =
790a07aba5dSTimm Baeder       __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4BitInt128);
791a07aba5dSTimm Baeder   constexpr vector4double from_vector4long_to_vector4double_var =
792a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4double);
793a07aba5dSTimm Baeder   constexpr vector4float from_vector4long_to_vector4float_var =
794a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4float);
795a07aba5dSTimm Baeder   constexpr vector4long from_vector4long_to_vector4long_var =
796a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4long);
797a07aba5dSTimm Baeder   constexpr vector4int from_vector4long_to_vector4int_var =
798a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4int);
799a07aba5dSTimm Baeder   constexpr vector4short from_vector4long_to_vector4short_var =
800a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4short);
801a07aba5dSTimm Baeder   constexpr vector4char from_vector4long_to_vector4char_var =
802a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4char);
803a07aba5dSTimm Baeder   constexpr vector4BitInt128 from_vector4long_to_vector4BitInt128_var =
804a07aba5dSTimm Baeder       __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4BitInt128);
805a07aba5dSTimm Baeder   constexpr vector4double from_vector4int_to_vector4double_var =
806a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4double);
807a07aba5dSTimm Baeder   constexpr vector4float from_vector4int_to_vector4float_var =
808a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4float);
809a07aba5dSTimm Baeder   constexpr vector4long from_vector4int_to_vector4long_var =
810a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4long);
811a07aba5dSTimm Baeder   constexpr vector4int from_vector4int_to_vector4int_var =
812a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4int);
813a07aba5dSTimm Baeder   constexpr vector4short from_vector4int_to_vector4short_var =
814a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4short);
815a07aba5dSTimm Baeder   constexpr vector4char from_vector4int_to_vector4char_var =
816a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4char);
817a07aba5dSTimm Baeder   constexpr vector4BitInt128 from_vector4int_to_vector4BitInt128_var =
818a07aba5dSTimm Baeder       __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4BitInt128);
819a07aba5dSTimm Baeder   constexpr vector4double from_vector4short_to_vector4double_var =
820a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4double);
821a07aba5dSTimm Baeder   constexpr vector4float from_vector4short_to_vector4float_var =
822a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4float);
823a07aba5dSTimm Baeder   constexpr vector4long from_vector4short_to_vector4long_var =
824a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4long);
825a07aba5dSTimm Baeder   constexpr vector4int from_vector4short_to_vector4int_var =
826a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4int);
827a07aba5dSTimm Baeder   constexpr vector4short from_vector4short_to_vector4short_var =
828a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4short);
829a07aba5dSTimm Baeder   constexpr vector4char from_vector4short_to_vector4char_var =
830a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4char);
831a07aba5dSTimm Baeder   constexpr vector4BitInt128 from_vector4short_to_vector4BitInt128_var =
832a07aba5dSTimm Baeder       __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4BitInt128);
833a07aba5dSTimm Baeder   constexpr vector4double from_vector4char_to_vector4double_var =
834a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4double);
835a07aba5dSTimm Baeder   constexpr vector4float from_vector4char_to_vector4float_var =
836a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4float);
837a07aba5dSTimm Baeder   constexpr vector4long from_vector4char_to_vector4long_var =
838a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4long);
839a07aba5dSTimm Baeder   constexpr vector4int from_vector4char_to_vector4int_var =
840a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4int);
841a07aba5dSTimm Baeder   constexpr vector4short from_vector4char_to_vector4short_var =
842a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4short);
843a07aba5dSTimm Baeder   constexpr vector4char from_vector4char_to_vector4char_var =
844a07aba5dSTimm Baeder       __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4char);
845a07aba5dSTimm Baeder   constexpr vector8double from_vector8double_to_vector8double_var =
846a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
847a07aba5dSTimm Baeder                               vector8double);
848a07aba5dSTimm Baeder   constexpr vector8float from_vector8double_to_vector8float_var =
849a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
850a07aba5dSTimm Baeder                               vector8float);
851a07aba5dSTimm Baeder   constexpr vector8long from_vector8double_to_vector8long_var =
852a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
853a07aba5dSTimm Baeder                               vector8long);
854a07aba5dSTimm Baeder   constexpr vector8int from_vector8double_to_vector8int_var =
855a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
856a07aba5dSTimm Baeder                               vector8int);
857a07aba5dSTimm Baeder   constexpr vector8short from_vector8double_to_vector8short_var =
858a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
859a07aba5dSTimm Baeder                               vector8short);
860a07aba5dSTimm Baeder   constexpr vector8char from_vector8double_to_vector8char_var =
861a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
862a07aba5dSTimm Baeder                               vector8char);
863a07aba5dSTimm Baeder   constexpr vector8BitInt128 from_vector8double_to_vector8BitInt128_var =
864a07aba5dSTimm Baeder       __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},
865a07aba5dSTimm Baeder                               vector8BitInt128);
866a07aba5dSTimm Baeder   constexpr vector8double from_vector8float_to_vector8double_var =
867a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
868a07aba5dSTimm Baeder                               vector8double);
869a07aba5dSTimm Baeder   constexpr vector8float from_vector8float_to_vector8float_var =
870a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
871a07aba5dSTimm Baeder                               vector8float);
872a07aba5dSTimm Baeder   constexpr vector8long from_vector8float_to_vector8long_var =
873a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
874a07aba5dSTimm Baeder                               vector8long);
875a07aba5dSTimm Baeder   constexpr vector8int from_vector8float_to_vector8int_var =
876a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
877a07aba5dSTimm Baeder   constexpr vector8short from_vector8float_to_vector8short_var =
878a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
879a07aba5dSTimm Baeder                               vector8short);
880a07aba5dSTimm Baeder   constexpr vector8char from_vector8float_to_vector8char_var =
881a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
882a07aba5dSTimm Baeder                               vector8char);
883a07aba5dSTimm Baeder   constexpr vector8BitInt128 from_vector8float_to_vector8BitInt128_var =
884a07aba5dSTimm Baeder       __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},
885a07aba5dSTimm Baeder                               vector8BitInt128);
886a07aba5dSTimm Baeder   constexpr vector8double from_vector8long_to_vector8double_var =
887a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
888a07aba5dSTimm Baeder                               vector8double);
889a07aba5dSTimm Baeder   constexpr vector8float from_vector8long_to_vector8float_var =
890a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
891a07aba5dSTimm Baeder                               vector8float);
892a07aba5dSTimm Baeder   constexpr vector8long from_vector8long_to_vector8long_var =
893a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
894a07aba5dSTimm Baeder   constexpr vector8int from_vector8long_to_vector8int_var =
895a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
896a07aba5dSTimm Baeder   constexpr vector8short from_vector8long_to_vector8short_var =
897a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},
898a07aba5dSTimm Baeder                               vector8short);
899a07aba5dSTimm Baeder   constexpr vector8char from_vector8long_to_vector8char_var =
900a07aba5dSTimm Baeder       __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
901a07aba5dSTimm Baeder   constexpr vector8double from_vector8int_to_vector8double_var =
902a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7},
903a07aba5dSTimm Baeder                               vector8double);
904a07aba5dSTimm Baeder   constexpr vector8float from_vector8int_to_vector8float_var =
905a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8float);
906a07aba5dSTimm Baeder   constexpr vector8long from_vector8int_to_vector8long_var =
907a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
908a07aba5dSTimm Baeder   constexpr vector8int from_vector8int_to_vector8int_var =
909a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
910a07aba5dSTimm Baeder   constexpr vector8short from_vector8int_to_vector8short_var =
911a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8short);
912a07aba5dSTimm Baeder   constexpr vector8char from_vector8int_to_vector8char_var =
913a07aba5dSTimm Baeder       __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
914a07aba5dSTimm Baeder   constexpr vector8double from_vector8short_to_vector8double_var =
915a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
916a07aba5dSTimm Baeder                               vector8double);
917a07aba5dSTimm Baeder   constexpr vector8float from_vector8short_to_vector8float_var =
918a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
919a07aba5dSTimm Baeder                               vector8float);
920a07aba5dSTimm Baeder   constexpr vector8long from_vector8short_to_vector8long_var =
921a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
922a07aba5dSTimm Baeder                               vector8long);
923a07aba5dSTimm Baeder   constexpr vector8int from_vector8short_to_vector8int_var =
924a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
925a07aba5dSTimm Baeder   constexpr vector8short from_vector8short_to_vector8short_var =
926a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
927a07aba5dSTimm Baeder                               vector8short);
928a07aba5dSTimm Baeder   constexpr vector8char from_vector8short_to_vector8char_var =
929a07aba5dSTimm Baeder       __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},
930a07aba5dSTimm Baeder                               vector8char);
931a07aba5dSTimm Baeder 
932a07aba5dSTimm Baeder   constexpr vector8double from_vector8char_to_vector8double_var =
933a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
934a07aba5dSTimm Baeder                               vector8double);
935a07aba5dSTimm Baeder   constexpr vector8float from_vector8char_to_vector8float_var =
936a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
937a07aba5dSTimm Baeder                               vector8float);
938a07aba5dSTimm Baeder   constexpr vector8long from_vector8char_to_vector8long_var =
939a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);
940a07aba5dSTimm Baeder   constexpr vector8int from_vector8char_to_vector8int_var =
941a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);
942a07aba5dSTimm Baeder   constexpr vector8short from_vector8char_to_vector8short_var =
943a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},
944a07aba5dSTimm Baeder                               vector8short);
945a07aba5dSTimm Baeder   constexpr vector8char from_vector8char_to_vector8char_var =
946a07aba5dSTimm Baeder       __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);
947a07aba5dSTimm Baeder   constexpr vector8double from_vector8BitInt128_to_vector8double_var =
948a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
949a07aba5dSTimm Baeder                               vector8double);
950a07aba5dSTimm Baeder   constexpr vector8float from_vector8BitInt128_to_vector8float_var =
951a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
952a07aba5dSTimm Baeder                               vector8float);
953a07aba5dSTimm Baeder   constexpr vector8long from_vector8BitInt128_to_vector8long_var =
954a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
955a07aba5dSTimm Baeder                               vector8long);
956a07aba5dSTimm Baeder   constexpr vector8int from_vector8BitInt128_to_vector8int_var =
957a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
958a07aba5dSTimm Baeder                               vector8int);
959a07aba5dSTimm Baeder   constexpr vector8short from_vector8BitInt128_to_vector8short_var =
960a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
961a07aba5dSTimm Baeder                               vector8short);
962a07aba5dSTimm Baeder   constexpr vector8char from_vector8BitInt128_to_vector8char_var =
963a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
964a07aba5dSTimm Baeder                               vector8char);
965a07aba5dSTimm Baeder   constexpr vector8BitInt128 from_vector8BitInt128_to_vector8BitInt128_var =
966a07aba5dSTimm Baeder       __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},
967a07aba5dSTimm Baeder                               vector8BitInt128);
968a07aba5dSTimm Baeder   static_assert(from_vector8BitInt128_to_vector8BitInt128_var[0] == 0, "");
969a07aba5dSTimm Baeder   static_assert(from_vector8BitInt128_to_vector8BitInt128_var[1] == 1, "");
970a07aba5dSTimm Baeder   static_assert(from_vector8BitInt128_to_vector8BitInt128_var[2] == 2, "");
971a07aba5dSTimm Baeder   static_assert(from_vector8BitInt128_to_vector8BitInt128_var[3] == 3, "");
972a07aba5dSTimm Baeder   static_assert(from_vector8BitInt128_to_vector8BitInt128_var[4] == 4, "");
973a07aba5dSTimm Baeder }
974a07aba5dSTimm Baeder 
975a07aba5dSTimm Baeder namespace shufflevector {
976a07aba5dSTimm Baeder   constexpr vector4char vector4charConst1 = {0, 1, 2, 3};
977a07aba5dSTimm Baeder   constexpr vector4char vector4charConst2 = {4, 5, 6, 7};
978a07aba5dSTimm Baeder   constexpr vector8char vector8intConst = {8, 9, 10, 11, 12, 13, 14, 15};
979a07aba5dSTimm Baeder   constexpr vector4char vectorShuffle1 =
980a07aba5dSTimm Baeder       __builtin_shufflevector(vector4charConst1, vector4charConst2, 0, 1, 2, 3);
981a07aba5dSTimm Baeder   constexpr vector4char vectorShuffle2 =
982a07aba5dSTimm Baeder       __builtin_shufflevector(vector4charConst1, vector4charConst2, 4, 5, 6, 7);
983a07aba5dSTimm Baeder   constexpr vector4char vectorShuffle3 =
984a07aba5dSTimm Baeder       __builtin_shufflevector(vector4charConst1, vector4charConst2, 0, 2, 4, 6);
985a07aba5dSTimm Baeder   constexpr vector8char vectorShuffle4 = __builtin_shufflevector(
986a07aba5dSTimm Baeder       vector8intConst, vector8intConst, 0, 2, 4, 6, 8, 10, 12, 14);
987a07aba5dSTimm Baeder   constexpr vector4char vectorShuffle5 =
988a07aba5dSTimm Baeder       __builtin_shufflevector(vector8intConst, vector8intConst, 0, 2, 4, 6);
989a07aba5dSTimm Baeder   constexpr vector8char vectorShuffle6 = __builtin_shufflevector(
990a07aba5dSTimm Baeder       vector4charConst1, vector4charConst2, 0, 2, 4, 6, 1, 3, 5, 7);
991a07aba5dSTimm Baeder 
992a07aba5dSTimm Baeder   static_assert(vectorShuffle6[0] == 0, "");
993a07aba5dSTimm Baeder   static_assert(vectorShuffle6[1] == 2, "");
994a07aba5dSTimm Baeder   static_assert(vectorShuffle6[2] == 4, "");
995a07aba5dSTimm Baeder   static_assert(vectorShuffle6[3] == 6, "");
996a07aba5dSTimm Baeder   static_assert(vectorShuffle6[4] == 1, "");
997a07aba5dSTimm Baeder   static_assert(vectorShuffle6[5] == 3, "");
998a07aba5dSTimm Baeder   static_assert(vectorShuffle6[6] == 5, "");
999a07aba5dSTimm Baeder   static_assert(vectorShuffle6[7] == 7, "");
1000a07aba5dSTimm Baeder 
1001a07aba5dSTimm Baeder   constexpr vector4char  vectorShuffleFail1 = __builtin_shufflevector( // both-error {{must be initialized by a constant expression}}\
1002fed8695bSTimm Baeder                                                                        // 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}}
1003a07aba5dSTimm Baeder           vector4charConst1,
1004a07aba5dSTimm Baeder           vector4charConst2, -1, -1, -1, -1);
1005a07aba5dSTimm Baeder }
1006a07aba5dSTimm Baeder 
1007a07aba5dSTimm Baeder #endif
1008360e4abfSTimm Baeder 
1009360e4abfSTimm Baeder namespace FunctionStart {
1010360e4abfSTimm Baeder   void a(void) {}
1011360e4abfSTimm Baeder   static_assert(__builtin_function_start(a) == a, ""); // both-error {{not an integral constant expression}} \
1012d8a28159SRichard Smith                                                        // ref-note {{comparison against opaque constant address '&__builtin_function_start(a)'}} \
1013*fd6baa47STimm Baeder                                                        // expected-note {{comparison of addresses of potentially overlapping literals has unspecified value}}
1014360e4abfSTimm Baeder }
1015d03822d8STimm Baeder 
1016d03822d8STimm Baeder namespace BuiltinInImplicitCtor {
1017d03822d8STimm Baeder   constexpr struct {
1018d03822d8STimm Baeder     int a = __builtin_isnan(1.0);
1019d03822d8STimm Baeder   } Foo;
1020d03822d8STimm Baeder   static_assert(Foo.a == 0, "");
1021d03822d8STimm Baeder }
102231bde711STimm Baeder 
102331bde711STimm Baeder typedef double vector4double __attribute__((__vector_size__(32)));
102431bde711STimm Baeder typedef float vector4float __attribute__((__vector_size__(16)));
102531bde711STimm Baeder typedef long long vector4long __attribute__((__vector_size__(32)));
102631bde711STimm Baeder typedef int vector4int __attribute__((__vector_size__(16)));
102731bde711STimm Baeder typedef unsigned long long vector4ulong __attribute__((__vector_size__(32)));
102831bde711STimm Baeder typedef unsigned int vector4uint __attribute__((__vector_size__(16)));
102931bde711STimm Baeder typedef short vector4short __attribute__((__vector_size__(8)));
103031bde711STimm Baeder typedef char vector4char __attribute__((__vector_size__(4)));
103131bde711STimm Baeder typedef double vector8double __attribute__((__vector_size__(64)));
103231bde711STimm Baeder typedef float vector8float __attribute__((__vector_size__(32)));
103331bde711STimm Baeder typedef long long vector8long __attribute__((__vector_size__(64)));
103431bde711STimm Baeder typedef int vector8int __attribute__((__vector_size__(32)));
103531bde711STimm Baeder typedef short vector8short __attribute__((__vector_size__(16)));
103631bde711STimm Baeder typedef char vector8char __attribute__((__vector_size__(8)));
103731bde711STimm Baeder 
103831bde711STimm Baeder namespace RecuceAdd {
103931bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4char){}) == 0);
104031bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4char){1, 2, 3, 4}) == 10);
104131bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4short){10, 20, 30, 40}) == 100);
104231bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4int){100, 200, 300, 400}) == 1000);
104331bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4long){1000, 2000, 3000, 4000}) == 10000);
104431bde711STimm Baeder   constexpr int reduceAddInt1 = __builtin_reduce_add((vector4int){~(1 << (sizeof(int) * 8 - 1)), 0, 0, 1});
104531bde711STimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
104631bde711STimm Baeder   // both-note@-1 {{outside the range of representable values of type 'int'}}
104731bde711STimm Baeder   constexpr long long reduceAddLong1 = __builtin_reduce_add((vector4long){~(1LL << (sizeof(long long) * 8 - 1)), 0, 0, 1});
104831bde711STimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
104931bde711STimm Baeder   // both-note@-1 {{outside the range of representable values of type 'long long'}}
105031bde711STimm Baeder   constexpr int reduceAddInt2 = __builtin_reduce_add((vector4int){(1 << (sizeof(int) * 8 - 1)), 0, 0, -1});
105131bde711STimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
105231bde711STimm Baeder   // both-note@-1 {{outside the range of representable values of type 'int'}}
105331bde711STimm Baeder   constexpr long long reduceAddLong2 = __builtin_reduce_add((vector4long){(1LL << (sizeof(long long) * 8 - 1)), 0, 0, -1});
105431bde711STimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
105531bde711STimm Baeder   // both-note@-1 {{outside the range of representable values of type 'long long'}}
105631bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4uint){~0U, 0, 0, 1}) == 0);
105731bde711STimm Baeder   static_assert(__builtin_reduce_add((vector4ulong){~0ULL, 0, 0, 1}) == 0);
105831bde711STimm Baeder 
105931bde711STimm Baeder 
106031bde711STimm Baeder #ifdef __SIZEOF_INT128__
106131bde711STimm Baeder   typedef __int128 v4i128 __attribute__((__vector_size__(128 * 2)));
106231bde711STimm Baeder   constexpr __int128 reduceAddInt3 = __builtin_reduce_add((v4i128){});
106331bde711STimm Baeder   static_assert(reduceAddInt3 == 0);
106431bde711STimm Baeder #endif
106531bde711STimm Baeder }
10660611fdd3STimm Baeder 
1067c1dcf75aSTimm Baeder namespace ReduceMul {
1068c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4char){}) == 0);
1069c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4char){1, 2, 3, 4}) == 24);
1070c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4short){1, 2, 30, 40}) == 2400);
1071c1dcf75aSTimm Baeder #ifndef __AVR__
1072c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4int){10, 20, 300, 400}) == 24'000'000);
1073c1dcf75aSTimm Baeder #endif
1074c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4long){1000L, 2000L, 3000L, 4000L}) == 24'000'000'000'000L);
1075c1dcf75aSTimm Baeder   constexpr int reduceMulInt1 = __builtin_reduce_mul((vector4int){~(1 << (sizeof(int) * 8 - 1)), 1, 1, 2});
1076c1dcf75aSTimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
1077c1dcf75aSTimm Baeder   // both-note@-1 {{outside the range of representable values of type 'int'}}
1078c1dcf75aSTimm Baeder   constexpr long long reduceMulLong1 = __builtin_reduce_mul((vector4long){~(1LL << (sizeof(long long) * 8 - 1)), 1, 1, 2});
1079c1dcf75aSTimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
1080c1dcf75aSTimm Baeder   // both-note@-1 {{outside the range of representable values of type 'long long'}}
1081c1dcf75aSTimm Baeder   constexpr int reduceMulInt2 = __builtin_reduce_mul((vector4int){(1 << (sizeof(int) * 8 - 1)), 1, 1, 2});
1082c1dcf75aSTimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
1083c1dcf75aSTimm Baeder   // both-note@-1 {{outside the range of representable values of type 'int'}}
1084c1dcf75aSTimm Baeder   constexpr long long reduceMulLong2 = __builtin_reduce_mul((vector4long){(1LL << (sizeof(long long) * 8 - 1)), 1, 1, 2});
1085c1dcf75aSTimm Baeder   // both-error@-1 {{must be initialized by a constant expression}} \
1086c1dcf75aSTimm Baeder   // both-note@-1 {{outside the range of representable values of type 'long long'}}
1087c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4uint){~0U, 1, 1, 2}) ==
1088c1dcf75aSTimm Baeder #ifdef __AVR__
1089c1dcf75aSTimm Baeder       0);
1090c1dcf75aSTimm Baeder #else
1091c1dcf75aSTimm Baeder       (~0U - 1));
1092c1dcf75aSTimm Baeder #endif
1093c1dcf75aSTimm Baeder   static_assert(__builtin_reduce_mul((vector4ulong){~0ULL, 1, 1, 2}) == ~0ULL - 1);
1094c1dcf75aSTimm Baeder }
1095c1dcf75aSTimm Baeder 
1096ccc471feSTimm Baeder namespace ReduceAnd {
1097ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4char){}) == 0);
1098ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == 0);
1099ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == 0);
1100ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == 0);
1101ccc471feSTimm Baeder #if __INT_WIDTH__ == 32
1102ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == 0L);
1103ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4char){(char)-1, (char)~0x22, (char)~0x44, (char)~0x88}) == 0x11);
1104ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4short){(short)~0x1111, (short)-1, (short)~0x4444, (short)~0x8888}) == 0x2222);
1105ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4int){(int)~0x11111111, (int)~0x22222222, (int)-1, (int)~0x88888888}) == 0x44444444);
1106ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4long){(long long)~0x1111111111111111L, (long long)~0x2222222222222222L, (long long)~0x4444444444444444L, (long long)-1}) == 0x8888888888888888L);
1107ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0U);
1108ccc471feSTimm Baeder   static_assert(__builtin_reduce_and((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0L);
1109ccc471feSTimm Baeder #endif
1110ccc471feSTimm Baeder }
1111ccc471feSTimm Baeder 
11121288f6d4STimm Baeder namespace ReduceOr {
11131288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4char){}) == 0);
11141288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
11151288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
11161288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
11171288f6d4STimm Baeder #if __INT_WIDTH__ == 32
11181288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
11191288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4char){(char)0, (char)0x22, (char)0x44, (char)0x88}) == ~0x11);
11201288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0, (short)0x4444, (short)0x8888}) == ~0x2222);
11211288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0, (int)0x88888888}) == ~0x44444444);
11221288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0}) == ~0x8888888888888888L);
11231288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
11241288f6d4STimm Baeder   static_assert(__builtin_reduce_or((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFL);
11251288f6d4STimm Baeder #endif
11261288f6d4STimm Baeder }
11271288f6d4STimm Baeder 
1128b587b910STimm Baeder namespace ReduceXor {
1129b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4char){}) == 0);
1130b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);
1131b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);
1132b587b910STimm Baeder #if __INT_WIDTH__ == 32
1133b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);
1134b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);
1135b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);
1136b587b910STimm Baeder   static_assert(__builtin_reduce_xor((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFUL);
1137b587b910STimm Baeder #endif
1138b587b910STimm Baeder }
1139b587b910STimm Baeder 
1140637a1ae8STimm Baeder namespace ElementwisePopcount {
1141637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4int){1, 2, 3, 4})) == 5);
1142637a1ae8STimm Baeder #if __INT_WIDTH__ == 32
1143637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4int){0, 0xF0F0, ~0, ~0xF0F0})) == 16 * sizeof(int));
1144637a1ae8STimm Baeder #endif
1145637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4long){1L, 2L, 3L, 4L})) == 5L);
1146637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4long){0L, 0xF0F0L, ~0L, ~0xF0F0L})) == 16 * sizeof(long long));
1147637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4uint){1U, 2U, 3U, 4U})) == 5U);
1148637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4uint){0U, 0xF0F0U, ~0U, ~0xF0F0U})) == 16 * sizeof(int));
1149637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4ulong){1UL, 2UL, 3UL, 4UL})) == 5UL);
1150637a1ae8STimm Baeder   static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4ulong){0ULL, 0xF0F0ULL, ~0ULL, ~0xF0F0ULL})) == 16 * sizeof(unsigned long long));
1151637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0) == 0);
1152637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0xF0F0) == 8);
1153637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(~0) == 8 * sizeof(int));
1154637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0U) == 0);
1155637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0xF0F0U) == 8);
1156637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(~0U) == 8 * sizeof(int));
1157637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0L) == 0);
1158637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(0xF0F0L) == 8);
1159637a1ae8STimm Baeder   static_assert(__builtin_elementwise_popcount(~0LL) == 8 * sizeof(long long));
11600f4dc427STimm Baeder 
11610f4dc427STimm Baeder #if __INT_WIDTH__ == 32
11620f4dc427STimm Baeder   static_assert(__builtin_bit_cast(unsigned, __builtin_elementwise_popcount((vector4char){1, 2, 3, 4})) == (LITTLE_END ? 0x01020101 : 0x01010201));
11630f4dc427STimm Baeder #endif
1164637a1ae8STimm Baeder }
1165637a1ae8STimm Baeder 
11660611fdd3STimm Baeder namespace BuiltinMemcpy {
11670611fdd3STimm Baeder   constexpr int simple() {
11680611fdd3STimm Baeder     int a = 12;
11690611fdd3STimm Baeder     int b = 0;
11700611fdd3STimm Baeder     __builtin_memcpy(&b, &a, sizeof(a));
11710611fdd3STimm Baeder     return b;
11720611fdd3STimm Baeder   }
11730611fdd3STimm Baeder   static_assert(simple() == 12);
1174fc9052eeSTimm Baeder 
1175abc27039STimm Baeder   constexpr bool arrayMemcpy() {
1176abc27039STimm Baeder     char src[] = "abc";
1177abc27039STimm Baeder     char dst[4] = {};
1178abc27039STimm Baeder     __builtin_memcpy(dst, src, 4);
1179abc27039STimm Baeder     return dst[0] == 'a' && dst[1] == 'b' && dst[2] == 'c' && dst[3] == '\0';
1180abc27039STimm Baeder   }
1181abc27039STimm Baeder   static_assert(arrayMemcpy());
1182fc9052eeSTimm Baeder 
1183fc9052eeSTimm Baeder   extern struct Incomplete incomplete;
1184fc9052eeSTimm Baeder   constexpr struct Incomplete *null_incomplete = 0;
1185fc9052eeSTimm Baeder   static_assert(__builtin_memcpy(null_incomplete, null_incomplete, sizeof(wchar_t))); // both-error {{not an integral constant expression}} \
1186fc9052eeSTimm Baeder                                                                                       // both-note {{source of 'memcpy' is nullptr}}
1187fc9052eeSTimm Baeder 
11883f39c5dfSTimm Baeder   wchar_t global;
11893f39c5dfSTimm Baeder   constexpr wchar_t *null = 0;
11903f39c5dfSTimm Baeder   static_assert(__builtin_memcpy(&global, null, sizeof(wchar_t))); // both-error {{not an integral constant expression}} \
11913f39c5dfSTimm Baeder                                                                    // both-note {{source of 'memcpy' is nullptr}}
1192fc9052eeSTimm Baeder 
119378955136STimm Baeder   constexpr int simpleMove() {
119478955136STimm Baeder     int a = 12;
119578955136STimm Baeder     int b = 0;
119678955136STimm Baeder     __builtin_memmove(&b, &a, sizeof(a));
119778955136STimm Baeder     return b;
119878955136STimm Baeder   }
119978955136STimm Baeder   static_assert(simpleMove() == 12);
12006168739fSTimm Baeder 
1201ce158734STimm Baeder   constexpr int memcpyTypeRem() { // both-error {{never produces a constant expression}}
12026168739fSTimm Baeder     int a = 12;
12036168739fSTimm Baeder     int b = 0;
12046168739fSTimm Baeder     __builtin_memmove(&b, &a, 1); // both-note {{'memmove' not supported: size to copy (1) is not a multiple of size of element type 'int'}} \
1205ce158734STimm Baeder                                   // both-note {{not supported}}
12066168739fSTimm Baeder     return b;
12076168739fSTimm Baeder   }
12086168739fSTimm Baeder   static_assert(memcpyTypeRem() == 12); // both-error {{not an integral constant expression}} \
12096168739fSTimm Baeder                                         // both-note {{in call to}}
12104dde52d7STimm Baeder 
12114dde52d7STimm Baeder   template<typename T>
12124dde52d7STimm Baeder   constexpr T result(T (&arr)[4]) {
12134dde52d7STimm Baeder     return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
12144dde52d7STimm Baeder   }
12154dde52d7STimm Baeder 
12164dde52d7STimm Baeder   constexpr int test_memcpy(int a, int b, int n) {
12174dde52d7STimm Baeder     int arr[4] = {1, 2, 3, 4};
12184dde52d7STimm Baeder     __builtin_memcpy(arr + a, arr + b, n); // both-note {{overlapping memory regions}}
12194dde52d7STimm Baeder     return result(arr);
12204dde52d7STimm Baeder   }
12214dde52d7STimm Baeder 
12224dde52d7STimm Baeder   static_assert(test_memcpy(1, 2, sizeof(int)) == 1334);
12234dde52d7STimm Baeder   static_assert(test_memcpy(0, 1, sizeof(int) * 2) == 2334); // both-error {{not an integral constant expression}} \
12244dde52d7STimm Baeder                                                              // both-note {{in call}}
12251f2d9345STimm Baeder 
12261f2d9345STimm Baeder   /// Both memcpy and memmove must support pointers.
12271f2d9345STimm Baeder   constexpr bool moveptr() {
12281f2d9345STimm Baeder     int a = 0;
12291f2d9345STimm Baeder     void *x = &a;
12301f2d9345STimm Baeder     void *z = nullptr;
12311f2d9345STimm Baeder 
12321f2d9345STimm Baeder     __builtin_memmove(&z, &x, sizeof(void*));
12331f2d9345STimm Baeder     return z == x;
12341f2d9345STimm Baeder   }
12351f2d9345STimm Baeder   static_assert(moveptr());
12361f2d9345STimm Baeder 
12371f2d9345STimm Baeder   constexpr bool cpyptr() {
12381f2d9345STimm Baeder     int a = 0;
12391f2d9345STimm Baeder     void *x = &a;
12401f2d9345STimm Baeder     void *z = nullptr;
12411f2d9345STimm Baeder 
12421f2d9345STimm Baeder     __builtin_memcpy(&z, &x, sizeof(void*));
12431f2d9345STimm Baeder     return z == x;
12441f2d9345STimm Baeder   }
12451f2d9345STimm Baeder   static_assert(cpyptr());
12461f2d9345STimm Baeder 
1247f0d60170STimm Baeder #ifndef __AVR__
1248f0d60170STimm Baeder   constexpr int test_memmove(int a, int b, int n) {
1249f0d60170STimm Baeder     int arr[4] = {1, 2, 3, 4};
1250f0d60170STimm Baeder     __builtin_memmove(arr + a, arr + b, n); // both-note {{destination is not a contiguous array of at least 3 elements of type 'int'}}
1251f0d60170STimm Baeder     return result(arr);
1252f0d60170STimm Baeder   }
1253f0d60170STimm Baeder   static_assert(test_memmove(2, 0, 12) == 4234); // both-error {{constant}} \
1254f0d60170STimm Baeder                                                  // both-note {{in call}}
1255f0d60170STimm Baeder #endif
1256d5c8af49STimm Baeder 
1257d5c8af49STimm Baeder   struct Trivial { char k; short s; constexpr bool ok() { return k == 3 && s == 4; } };
1258d5c8af49STimm Baeder   constexpr bool test_trivial() {
1259d5c8af49STimm Baeder     Trivial arr[3] = {{1, 2}, {3, 4}, {5, 6}};
1260d5c8af49STimm Baeder     __builtin_memcpy(arr, arr+1, sizeof(Trivial));
1261d5c8af49STimm Baeder     __builtin_memmove(arr+1, arr, 2 * sizeof(Trivial));
1262d5c8af49STimm Baeder 
1263d5c8af49STimm Baeder     return arr[0].ok() && arr[1].ok() && arr[2].ok();
1264d5c8af49STimm Baeder   }
1265d5c8af49STimm Baeder   static_assert(test_trivial());
126634097c07STimm Baeder 
126734097c07STimm Baeder   // Check that an incomplete array is rejected.
126834097c07STimm Baeder   constexpr int test_incomplete_array_type() { // both-error {{never produces a constant}}
126934097c07STimm Baeder     extern int arr[];
127034097c07STimm Baeder     __builtin_memmove(arr, arr, 4 * sizeof(arr[0]));
127134097c07STimm Baeder     // both-note@-1 2{{'memmove' not supported: source is not a contiguous array of at least 4 elements of type 'int'}}
127234097c07STimm Baeder     return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
127334097c07STimm Baeder   }
127434097c07STimm Baeder   static_assert(test_incomplete_array_type() == 1234); // both-error {{constant}} both-note {{in call}}
12750611fdd3STimm Baeder }
12768713914dSTimm Baeder 
12778713914dSTimm Baeder namespace Memcmp {
12788713914dSTimm Baeder   constexpr unsigned char ku00fe00[] = {0x00, 0xfe, 0x00};
12798713914dSTimm Baeder   constexpr unsigned char ku00feff[] = {0x00, 0xfe, 0xff};
12808713914dSTimm Baeder   constexpr signed char ks00fe00[] = {0, -2, 0};
12818713914dSTimm Baeder   constexpr signed char ks00feff[] = {0, -2, -1};
12828713914dSTimm Baeder   static_assert(__builtin_memcmp(ku00feff, ks00fe00, 2) == 0);
12838713914dSTimm Baeder   static_assert(__builtin_memcmp(ku00feff, ks00fe00, 99) == 1);
12848713914dSTimm Baeder   static_assert(__builtin_memcmp(ku00fe00, ks00feff, 99) == -1);
12858713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00feff, ku00fe00, 2) == 0);
12868713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00feff, ku00fe00, 99) == 1);
12878713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00fe00, ku00feff, 99) == -1);
12888713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00fe00, ks00feff, 2) == 0);
12898713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00feff, ks00fe00, 99) == 1);
12908713914dSTimm Baeder   static_assert(__builtin_memcmp(ks00fe00, ks00feff, 99) == -1);
12918713914dSTimm Baeder 
12928713914dSTimm Baeder   struct Bool3Tuple { bool bb[3]; };
12938713914dSTimm Baeder   constexpr Bool3Tuple kb000100 = {{false, true, false}};
12948713914dSTimm Baeder   static_assert(sizeof(bool) != 1u || __builtin_memcmp(ks00fe00, kb000100.bb, 1) == 0); // both-error {{constant}} \
12958713914dSTimm Baeder                                                                                         // both-note {{not supported}}
12968713914dSTimm Baeder 
12978713914dSTimm Baeder   constexpr char a = 'a';
12988713914dSTimm Baeder   constexpr char b = 'a';
12998713914dSTimm Baeder   static_assert(__builtin_memcmp(&a, &b, 1) == 0);
13008713914dSTimm Baeder 
13018713914dSTimm Baeder   extern struct Incomplete incomplete;
13028713914dSTimm Baeder   static_assert(__builtin_memcmp(&incomplete, "", 0u) == 0);
13038713914dSTimm Baeder   static_assert(__builtin_memcmp("", &incomplete, 0u) == 0);
13048713914dSTimm Baeder   static_assert(__builtin_memcmp(&incomplete, "", 1u) == 42); // both-error {{not an integral constant}} \
13058713914dSTimm Baeder                                                               // both-note {{not supported}}
13068713914dSTimm Baeder   static_assert(__builtin_memcmp("", &incomplete, 1u) == 42); // both-error {{not an integral constant}} \
13078713914dSTimm Baeder                                                               // both-note {{not supported}}
130898470c0bSTimm Baeder 
130998470c0bSTimm Baeder   static_assert(__builtin_memcmp(u8"abab\0banana", u8"abab\0banana", 100) == 0); // both-error {{not an integral constant}} \
131098470c0bSTimm Baeder                                                                                  // both-note {{dereferenced one-past-the-end}}
131198470c0bSTimm Baeder 
131298470c0bSTimm Baeder   static_assert(__builtin_bcmp("abaa", "abba", 3) != 0);
131398470c0bSTimm Baeder   static_assert(__builtin_bcmp("abaa", "abba", 2) == 0);
131498470c0bSTimm Baeder   static_assert(__builtin_bcmp("a\203", "a", 2) != 0);
131598470c0bSTimm Baeder   static_assert(__builtin_bcmp("a\203", "a\003", 2) != 0);
131698470c0bSTimm Baeder   static_assert(__builtin_bcmp(0, 0, 0) == 0);
131798470c0bSTimm Baeder   static_assert(__builtin_bcmp("abab\0banana", "abab\0banana", 100) == 0); // both-error {{not an integral constant}}\
131898470c0bSTimm Baeder                                                                            // both-note {{dereferenced one-past-the-end}}
131998470c0bSTimm Baeder   static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 100) != 0); // FIXME: Should we reject this?
132098470c0bSTimm Baeder   static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 7) != 0);
132198470c0bSTimm Baeder   static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 6) != 0);
132298470c0bSTimm Baeder   static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 5) == 0);
1323dd6f6a09STimm Baeder 
1324dd6f6a09STimm Baeder 
1325dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abaa", L"abba", 3) == -1);
1326dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abaa", L"abba", 2) == 0);
1327dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(0, 0, 0) == 0);
1328dd6f6a09STimm Baeder #if __WCHAR_WIDTH__ == 32
1329dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"a\x83838383", L"aa", 2) ==
1330dd6f6a09STimm Baeder                 (wchar_t)-1U >> 31);
1331dd6f6a09STimm Baeder #endif
1332dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0banana", 100) == 0); // both-error {{not an integral constant}} \
1333dd6f6a09STimm Baeder                                                                                 // both-note {{dereferenced one-past-the-end}}
1334dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 100) == -1); // FIXME: Should we reject this?
1335dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 7) == -1);
1336dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 6) == -1);
1337dd6f6a09STimm Baeder   static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 5) == 0);
13388713914dSTimm Baeder }
1339