1904 lines · cpp
1// RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple x86_64 %s -verify=expected,both2// RUN: %clang_cc1 -Wno-string-plus-int -triple x86_64 %s -verify=ref,both3//4// RUN: %clang_cc1 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both5// RUN: %clang_cc1 -Wno-string-plus-int -triple i686 %s -verify=ref,both6//7// RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple x86_64 %s -verify=expected,both8// RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -triple x86_64 %s -verify=ref,both9//10// RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter -triple i686 %s -verify=expected,both11// RUN: %clang_cc1 -std=c++20 -Wno-string-plus-int -triple i686 %s -verify=ref,both12//13// RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -fexperimental-new-constant-interpreter %s -verify=expected,both14// RUN: %clang_cc1 -triple avr -std=c++20 -Wno-string-plus-int -verify=ref,both %s15 16#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__17#define LITTLE_END 118#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__19#define LITTLE_END 020#else21#error "huh?"22#endif23 24 25inline constexpr void* operator new(__SIZE_TYPE__, void* p) noexcept { return p; }26namespace std {27 using size_t = decltype(sizeof(0));28 template<typename T> struct allocator {29 constexpr T *allocate(size_t N) {30 return (T*)__builtin_operator_new(sizeof(T) * N); // #alloc31 }32 constexpr void deallocate(void *p, __SIZE_TYPE__) {33 __builtin_operator_delete(p);34 }35 };36template<typename T, typename... Args>37constexpr T* construct_at(T* p, Args&&... args) { return ::new((void*)p) T(static_cast<Args&&>(args)...); }38 39 template<typename T>40 constexpr void destroy_at(T* p) {41 p->~T();42 }43}44 45extern "C" {46 typedef decltype(sizeof(int)) size_t;47 extern size_t wcslen(const wchar_t *p);48 extern void *memchr(const void *s, int c, size_t n);49 extern char *strchr(const char *s, int c);50 extern wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n);51 extern wchar_t *wcschr(const wchar_t *s, wchar_t c);52 extern int wcscmp(const wchar_t *s1, const wchar_t *s2);53 extern int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n);54 extern wchar_t *wmemcpy(wchar_t *d, const wchar_t *s, size_t n);55}56 57 58constexpr int test_address_of_incomplete_array_type() { // both-error {{never produces a constant expression}}59 extern int arr[];60 __builtin_memmove(&arr, &arr, 4 * sizeof(arr[0])); // both-note 2{{cannot constant evaluate 'memmove' between objects of incomplete type 'int[]'}}61 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];62}63static_assert(test_address_of_incomplete_array_type() == 1234, ""); // both-error {{constant}} \64 // both-note {{in call}}65 66namespace LocalExternRedecl {67 constexpr int externRedecl1() {68 extern int arr[];69 return 0;70 }71 constexpr int externRedecl2() { // both-error {{never produces a constant expression}}72 extern int arr[];73 __builtin_memmove(&arr, &arr, 4 * sizeof(arr[0])); // both-note 2{{incomplete type}}74 return 1234;75 }76 static_assert(externRedecl2() == 1234); // both-error {{not an integral constant expression}} \77 // both-note {{in call to}}78}79 80 struct NonTrivial {81 constexpr NonTrivial() : n(0) {}82 constexpr NonTrivial(const NonTrivial &) : n(1) {}83 int n;84 };85 constexpr bool test_nontrivial_memcpy() { // both-error {{never produces a constant}}86 NonTrivial arr[3] = {};87 __builtin_memcpy(arr, arr + 1, sizeof(NonTrivial)); // both-note {{non-trivially-copyable}} \88 // both-note {{non-trivially-copyable}}89 return true;90 }91 static_assert(test_nontrivial_memcpy()); // both-error {{constant}} \92 // both-note {{in call}}93 94namespace strcmp {95 constexpr char kFoobar[6] = {'f','o','o','b','a','r'};96 constexpr char kFoobazfoobar[12] = {'f','o','o','b','a','z','f','o','o','b','a','r'};97 98 static_assert(__builtin_strcmp("", "") == 0, "");99 static_assert(__builtin_strcmp("abab", "abab") == 0, "");100 static_assert(__builtin_strcmp("abab", "abba") == -1, "");101 static_assert(__builtin_strcmp("abab", "abaa") == 1, "");102 static_assert(__builtin_strcmp("ababa", "abab") == 1, "");103 static_assert(__builtin_strcmp("abab", "ababa") == -1, "");104 static_assert(__builtin_strcmp("a\203", "a") == 1, "");105 static_assert(__builtin_strcmp("a\203", "a\003") == 1, "");106 static_assert(__builtin_strcmp("abab\0banana", "abab") == 0, "");107 static_assert(__builtin_strcmp("abab", "abab\0banana") == 0, "");108 static_assert(__builtin_strcmp("abab\0banana", "abab\0canada") == 0, "");109 static_assert(__builtin_strcmp(0, "abab") == 0, ""); // both-error {{not an integral constant}} \110 // both-note {{dereferenced null}}111 static_assert(__builtin_strcmp("abab", 0) == 0, ""); // both-error {{not an integral constant}} \112 // both-note {{dereferenced null}}113 114 static_assert(__builtin_strcmp(kFoobar, kFoobazfoobar) == -1, "");115 static_assert(__builtin_strcmp(kFoobar, kFoobazfoobar + 6) == 0, ""); // both-error {{not an integral constant}} \116 // both-note {{dereferenced one-past-the-end}}117 118 /// Used to assert because we're passing a dummy pointer to119 /// __builtin_strcmp() when evaluating the return statement.120 constexpr bool char_memchr_mutable() {121 char buffer[] = "mutable";122 return __builtin_strcmp(buffer, "mutable") == 0;123 }124 static_assert(char_memchr_mutable(), "");125 126 static_assert(__builtin_strncmp("abaa", "abba", 5) == -1);127 static_assert(__builtin_strncmp("abaa", "abba", 4) == -1);128 static_assert(__builtin_strncmp("abaa", "abba", 3) == -1);129 static_assert(__builtin_strncmp("abaa", "abba", 2) == 0);130 static_assert(__builtin_strncmp("abaa", "abba", 1) == 0);131 static_assert(__builtin_strncmp("abaa", "abba", 0) == 0);132 static_assert(__builtin_strncmp(0, 0, 0) == 0);133 static_assert(__builtin_strncmp("abab\0banana", "abab\0canada", 100) == 0);134}135 136namespace WcsCmp {137 constexpr wchar_t kFoobar[6] = {L'f',L'o',L'o',L'b',L'a',L'r'};138 constexpr wchar_t kFoobazfoobar[12] = {L'f',L'o',L'o',L'b',L'a',L'z',L'f',L'o',L'o',L'b',L'a',L'r'};139 140 static_assert(__builtin_wcscmp(L"abab", L"abab") == 0);141 static_assert(__builtin_wcscmp(L"abab", L"abba") == -1);142 static_assert(__builtin_wcscmp(L"abab", L"abaa") == 1);143 static_assert(__builtin_wcscmp(L"ababa", L"abab") == 1);144 static_assert(__builtin_wcscmp(L"abab", L"ababa") == -1);145 static_assert(__builtin_wcscmp(L"abab\0banana", L"abab") == 0);146 static_assert(__builtin_wcscmp(L"abab", L"abab\0banana") == 0);147 static_assert(__builtin_wcscmp(L"abab\0banana", L"abab\0canada") == 0);148#if __WCHAR_WIDTH__ == 32149 static_assert(__builtin_wcscmp(L"a\x83838383", L"a") == (wchar_t)-1U >> 31);150#endif151 static_assert(__builtin_wcscmp(0, L"abab") == 0); // both-error {{not an integral constant}} \152 // both-note {{dereferenced null}}153 static_assert(__builtin_wcscmp(L"abab", 0) == 0); // both-error {{not an integral constant}} \154 // both-note {{dereferenced null}}155 156 static_assert(__builtin_wcscmp(kFoobar, kFoobazfoobar) == -1);157 static_assert(__builtin_wcscmp(kFoobar, kFoobazfoobar + 6) == 0); // both-error {{not an integral constant}} \158 // both-note {{dereferenced one-past-the-end}}159 160 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 5) == -1);161 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 4) == -1);162 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 3) == -1);163 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 2) == 0);164 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 1) == 0);165 static_assert(__builtin_wcsncmp(L"abaa", L"abba", 0) == 0);166 static_assert(__builtin_wcsncmp(0, 0, 0) == 0);167 static_assert(__builtin_wcsncmp(L"abab\0banana", L"abab\0canada", 100) == 0);168#if __WCHAR_WIDTH__ == 32169 static_assert(__builtin_wcsncmp(L"a\x83838383", L"aa", 2) ==170 (wchar_t)-1U >> 31);171#endif172 173 static_assert(__builtin_wcsncmp(kFoobar, kFoobazfoobar, 6) == -1);174 static_assert(__builtin_wcsncmp(kFoobar, kFoobazfoobar, 7) == -1);175 static_assert(__builtin_wcsncmp(kFoobar, kFoobazfoobar + 6, 6) == 0);176 static_assert(__builtin_wcsncmp(kFoobar, kFoobazfoobar + 6, 7) == 0); // both-error {{not an integral constant}} \177 // both-note {{dereferenced one-past-the-end}}178}179 180/// Copied from constant-expression-cxx11.cpp181namespace strlen {182constexpr const char *a = "foo\0quux";183 constexpr char b[] = "foo\0quux";184 constexpr int f() { return 'u'; }185 constexpr char c[] = { 'f', 'o', 'o', 0, 'q', f(), 'u', 'x', 0 };186 187 static_assert(__builtin_strlen("foo") == 3, "");188 static_assert(__builtin_strlen("foo\0quux") == 3, "");189 static_assert(__builtin_strlen("foo\0quux" + 4) == 4, "");190 191 constexpr bool check(const char *p) {192 return __builtin_strlen(p) == 3 &&193 __builtin_strlen(p + 1) == 2 &&194 __builtin_strlen(p + 2) == 1 &&195 __builtin_strlen(p + 3) == 0 &&196 __builtin_strlen(p + 4) == 4 &&197 __builtin_strlen(p + 5) == 3 &&198 __builtin_strlen(p + 6) == 2 &&199 __builtin_strlen(p + 7) == 1 &&200 __builtin_strlen(p + 8) == 0;201 }202 203 static_assert(check(a), "");204 static_assert(check(b), "");205 static_assert(check(c), "");206 207 constexpr int over1 = __builtin_strlen(a + 9); // both-error {{constant expression}} \208 // both-note {{one-past-the-end}}209 constexpr int over2 = __builtin_strlen(b + 9); // both-error {{constant expression}} \210 // both-note {{one-past-the-end}}211 constexpr int over3 = __builtin_strlen(c + 9); // both-error {{constant expression}} \212 // both-note {{one-past-the-end}}213 214 constexpr int under1 = __builtin_strlen(a - 1); // both-error {{constant expression}} \215 // both-note {{cannot refer to element -1}}216 constexpr int under2 = __builtin_strlen(b - 1); // both-error {{constant expression}} \217 // both-note {{cannot refer to element -1}}218 constexpr int under3 = __builtin_strlen(c - 1); // both-error {{constant expression}} \219 // both-note {{cannot refer to element -1}}220 221 constexpr char d[] = { 'f', 'o', 'o' }; // no nul terminator.222 constexpr int bad = __builtin_strlen(d); // both-error {{constant expression}} \223 // both-note {{one-past-the-end}}224 225 constexpr int wn = __builtin_wcslen(L"hello");226 static_assert(wn == 5);227 constexpr int wm = wcslen(L"hello"); // both-error {{constant expression}} \228 // both-note {{non-constexpr function 'wcslen' cannot be used in a constant expression}}229 230 int arr[3]; // both-note {{here}}231 int wk = arr[wcslen(L"hello")]; // both-warning {{array index 5}}232}233 234namespace nan {235 constexpr double NaN1 = __builtin_nan("");236 237 /// The current interpreter does not accept this, but it should.238 constexpr float NaN2 = __builtin_nans([](){return "0xAE98";}()); // ref-error {{must be initialized by a constant expression}}239#if __cplusplus < 201703L240 // expected-error@-2 {{must be initialized by a constant expression}}241#endif242 243 constexpr double NaN3 = __builtin_nan("foo"); // both-error {{must be initialized by a constant expression}}244 constexpr float NaN4 = __builtin_nanf("");245 constexpr long double NaN5 = __builtin_nanf128("");246 247 /// FIXME: This should be accepted by the current interpreter as well.248 constexpr char f[] = {'0', 'x', 'A', 'E', '\0'};249 constexpr double NaN6 = __builtin_nan(f); // ref-error {{must be initialized by a constant expression}}250 251 /// FIXME: Current interpreter misses diagnostics.252 constexpr char f2[] = {'0', 'x', 'A', 'E'}; /// No trailing 0 byte.253 constexpr double NaN7 = __builtin_nan(f2); // both-error {{must be initialized by a constant expression}} \254 // expected-note {{read of dereferenced one-past-the-end pointer}}255 static_assert(!__builtin_issignaling(__builtin_nan("")), "");256 static_assert(__builtin_issignaling(__builtin_nans("")), "");257}258 259namespace fmin {260 constexpr float f1 = __builtin_fmin(1.0, 2.0f);261 static_assert(f1 == 1.0f, "");262 263 constexpr float min = __builtin_fmin(__builtin_nan(""), 1);264 static_assert(min == 1, "");265 constexpr float min2 = __builtin_fmin(1, __builtin_nan(""));266 static_assert(min2 == 1, "");267 constexpr float min3 = __builtin_fmin(__builtin_inf(), __builtin_nan(""));268 static_assert(min3 == __builtin_inf(), "");269}270 271namespace inf {272 static_assert(__builtin_isinf(__builtin_inf()), "");273 static_assert(!__builtin_isinf(1.0), "");274 275 static_assert(__builtin_isfinite(1.0), "");276 static_assert(!__builtin_isfinite(__builtin_inf()), "");277 278 static_assert(__builtin_isnormal(1.0), "");279 static_assert(!__builtin_isnormal(__builtin_inf()), "");280 281#ifndef __AVR__282 static_assert(__builtin_issubnormal(0x1p-1070), "");283#endif284 static_assert(!__builtin_issubnormal(__builtin_inf()), "");285 286 static_assert(__builtin_iszero(0.0), "");287 static_assert(!__builtin_iszero(__builtin_inf()), "");288 289 static_assert(__builtin_issignaling(__builtin_nans("")), "");290 static_assert(!__builtin_issignaling(__builtin_inf()), "");291}292 293namespace isfpclass {294 char isfpclass_inf_pos_0[__builtin_isfpclass(__builtin_inf(), 0x0200) ? 1 : -1]; // fcPosInf295 char isfpclass_inf_pos_1[!__builtin_isfpclass(__builtin_inff(), 0x0004) ? 1 : -1]; // fcNegInf296 char isfpclass_inf_pos_2[__builtin_isfpclass(__builtin_infl(), 0x0207) ? 1 : -1]; // fcSNan|fcQNan|fcNegInf|fcPosInf297 char isfpclass_inf_pos_3[!__builtin_isfpclass(__builtin_inf(), 0x01F8) ? 1 : -1]; // fcFinite298 char isfpclass_pos_0 [__builtin_isfpclass(1.0, 0x0100) ? 1 : -1]; // fcPosNormal299 char isfpclass_pos_1 [!__builtin_isfpclass(1.0f, 0x0008) ? 1 : -1]; // fcNegNormal300 char isfpclass_pos_2 [__builtin_isfpclass(1.0L, 0x01F8) ? 1 : -1]; // fcFinite301 char isfpclass_pos_3 [!__builtin_isfpclass(1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan302#ifndef __AVR__303 char isfpclass_pdenorm_0[__builtin_isfpclass(1.0e-40f, 0x0080) ? 1 : -1]; // fcPosSubnormal304 char isfpclass_pdenorm_1[__builtin_isfpclass(1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite305 char isfpclass_pdenorm_2[!__builtin_isfpclass(1.0e-40f, 0x003C) ? 1 : -1]; // fcNegative306 char isfpclass_pdenorm_3[!__builtin_isfpclass(1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite307#endif308 char isfpclass_pzero_0 [__builtin_isfpclass(0.0f, 0x0060) ? 1 : -1]; // fcZero309 char isfpclass_pzero_1 [__builtin_isfpclass(0.0, 0x01F8) ? 1 : -1]; // fcFinite310 char isfpclass_pzero_2 [!__builtin_isfpclass(0.0L, 0x0020) ? 1 : -1]; // fcNegZero311 char isfpclass_pzero_3 [!__builtin_isfpclass(0.0, 0x0003) ? 1 : -1]; // fcNan312 char isfpclass_nzero_0 [__builtin_isfpclass(-0.0f, 0x0060) ? 1 : -1]; // fcZero313 char isfpclass_nzero_1 [__builtin_isfpclass(-0.0, 0x01F8) ? 1 : -1]; // fcFinite314 char isfpclass_nzero_2 [!__builtin_isfpclass(-0.0L, 0x0040) ? 1 : -1]; // fcPosZero315 char isfpclass_nzero_3 [!__builtin_isfpclass(-0.0, 0x0003) ? 1 : -1]; // fcNan316 char isfpclass_ndenorm_0[__builtin_isfpclass(-1.0e-40f, 0x0010) ? 1 : -1]; // fcNegSubnormal317 char isfpclass_ndenorm_2[!__builtin_isfpclass(-1.0e-40f, 0x03C0) ? 1 : -1]; // fcPositive318#ifndef __AVR__319 char isfpclass_ndenorm_1[__builtin_isfpclass(-1.0e-310, 0x01F8) ? 1 : -1]; // fcFinite320 char isfpclass_ndenorm_3[!__builtin_isfpclass(-1.0e-310, 0x0207) ? 1 : -1]; // ~fcFinite321#endif322 char isfpclass_neg_0 [__builtin_isfpclass(-1.0, 0x0008) ? 1 : -1]; // fcNegNormal323 char isfpclass_neg_1 [!__builtin_isfpclass(-1.0f, 0x00100) ? 1 : -1]; // fcPosNormal324 char isfpclass_neg_2 [__builtin_isfpclass(-1.0L, 0x01F8) ? 1 : -1]; // fcFinite325 char isfpclass_neg_3 [!__builtin_isfpclass(-1.0, 0x0003) ? 1 : -1]; // fcSNan|fcQNan326 char isfpclass_inf_neg_0[__builtin_isfpclass(-__builtin_inf(), 0x0004) ? 1 : -1]; // fcNegInf327 char isfpclass_inf_neg_1[!__builtin_isfpclass(-__builtin_inff(), 0x0200) ? 1 : -1]; // fcPosInf328 char isfpclass_inf_neg_2[__builtin_isfpclass(-__builtin_infl(), 0x0207) ? 1 : -1]; // ~fcFinite329 char isfpclass_inf_neg_3[!__builtin_isfpclass(-__builtin_inf(), 0x03C0) ? 1 : -1]; // fcPositive330 char isfpclass_qnan_0 [__builtin_isfpclass(__builtin_nan(""), 0x0002) ? 1 : -1]; // fcQNan331 char isfpclass_qnan_1 [!__builtin_isfpclass(__builtin_nanf(""), 0x0001) ? 1 : -1]; // fcSNan332 char isfpclass_qnan_2 [__builtin_isfpclass(__builtin_nanl(""), 0x0207) ? 1 : -1]; // ~fcFinite333 char isfpclass_qnan_3 [!__builtin_isfpclass(__builtin_nan(""), 0x01F8) ? 1 : -1]; // fcFinite334 char isfpclass_snan_0 [__builtin_isfpclass(__builtin_nansf(""), 0x0001) ? 1 : -1]; // fcSNan335 char isfpclass_snan_1 [!__builtin_isfpclass(__builtin_nans(""), 0x0002) ? 1 : -1]; // fcQNan336 char isfpclass_snan_2 [__builtin_isfpclass(__builtin_nansl(""), 0x0207) ? 1 : -1]; // ~fcFinite337 char isfpclass_snan_3 [!__builtin_isfpclass(__builtin_nans(""), 0x01F8) ? 1 : -1]; // fcFinite338}339 340namespace signbit {341 static_assert(342 !__builtin_signbit(1.0) && __builtin_signbit(-1.0) && !__builtin_signbit(0.0) && __builtin_signbit(-0.0) &&343 !__builtin_signbitf(1.0f) && __builtin_signbitf(-1.0f) && !__builtin_signbitf(0.0f) && __builtin_signbitf(-0.0f) &&344 !__builtin_signbitl(1.0L) && __builtin_signbitf(-1.0L) && !__builtin_signbitf(0.0L) && __builtin_signbitf(-0.0L) &&345 !__builtin_signbit(1.0f) && __builtin_signbit(-1.0f) && !__builtin_signbit(0.0f) && __builtin_signbit(-0.0f) &&346 !__builtin_signbit(1.0L) && __builtin_signbit(-1.0L) && !__builtin_signbit(0.0L) && __builtin_signbit(-0.0L) &&347 true, ""348 );349}350 351namespace floating_comparison {352#define LESS(X, Y) \353 !__builtin_isgreater(X, Y) && __builtin_isgreater(Y, X) && \354 !__builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) && \355 __builtin_isless(X, Y) && !__builtin_isless(Y, X) && \356 __builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) && \357 __builtin_islessgreater(X, Y) && __builtin_islessgreater(Y, X) && \358 !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)359#define EQUAL(X, Y) \360 !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \361 __builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) && \362 !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \363 __builtin_islessequal(X, Y) && __builtin_islessequal(Y, X) && \364 !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \365 !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)366#define UNORDERED(X, Y) \367 !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \368 !__builtin_isgreaterequal(X, Y) && !__builtin_isgreaterequal(Y, X) && \369 !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \370 !__builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) && \371 !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \372 __builtin_isunordered(X, Y) && __builtin_isunordered(Y, X)373 374 static_assert(LESS(0.0, 1.0));375 static_assert(LESS(0.0, __builtin_inf()));376 static_assert(LESS(0.0f, 1.0f));377 static_assert(LESS(0.0f, __builtin_inff()));378 static_assert(LESS(0.0L, 1.0L));379 static_assert(LESS(0.0L, __builtin_infl()));380 381 static_assert(EQUAL(1.0, 1.0));382 static_assert(EQUAL(0.0, -0.0));383 static_assert(EQUAL(1.0f, 1.0f));384 static_assert(EQUAL(0.0f, -0.0f));385 static_assert(EQUAL(1.0L, 1.0L));386 static_assert(EQUAL(0.0L, -0.0L));387 388 static_assert(UNORDERED(__builtin_nan(""), 1.0));389 static_assert(UNORDERED(__builtin_nan(""), __builtin_inf()));390 static_assert(UNORDERED(__builtin_nanf(""), 1.0f));391 static_assert(UNORDERED(__builtin_nanf(""), __builtin_inff()));392 static_assert(UNORDERED(__builtin_nanl(""), 1.0L));393 static_assert(UNORDERED(__builtin_nanl(""), __builtin_infl()));394}395 396namespace fpclassify {397 char classify_nan [__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nan(""))];398 char classify_snan [__builtin_fpclassify(+1, -1, -1, -1, -1, __builtin_nans(""))];399 char classify_inf [__builtin_fpclassify(-1, +1, -1, -1, -1, __builtin_inf())];400 char classify_neg_inf [__builtin_fpclassify(-1, +1, -1, -1, -1, -__builtin_inf())];401 char classify_normal [__builtin_fpclassify(-1, -1, +1, -1, -1, 1.539)];402#ifndef __AVR__403 char classify_normal2 [__builtin_fpclassify(-1, -1, +1, -1, -1, 1e-307)];404 char classify_denorm [__builtin_fpclassify(-1, -1, -1, +1, -1, 1e-308)];405 char classify_denorm2 [__builtin_fpclassify(-1, -1, -1, +1, -1, -1e-308)];406#endif407 char classify_zero [__builtin_fpclassify(-1, -1, -1, -1, +1, 0.0)];408 char classify_neg_zero[__builtin_fpclassify(-1, -1, -1, -1, +1, -0.0)];409 char classify_subnorm [__builtin_fpclassify(-1, -1, -1, +1, -1, 1.0e-38f)];410}411 412namespace abs {413 static_assert(__builtin_abs(14) == 14, "");414 static_assert(__builtin_labs(14L) == 14L, "");415 static_assert(__builtin_llabs(14LL) == 14LL, "");416 static_assert(__builtin_abs(-14) == 14, "");417 static_assert(__builtin_labs(-0x14L) == 0x14L, "");418 static_assert(__builtin_llabs(-0x141414141414LL) == 0x141414141414LL, "");419#define BITSIZE(x) (sizeof(x) * 8)420 constexpr int abs4 = __builtin_abs(1 << (BITSIZE(int) - 1)); // both-error {{must be initialized by a constant expression}}421 constexpr long abs6 = __builtin_labs(1L << (BITSIZE(long) - 1)); // both-error {{must be initialized by a constant expression}}422 constexpr long long abs8 = __builtin_llabs(1LL << (BITSIZE(long long) - 1)); // both-error {{must be initialized by a constant expression}}423#undef BITSIZE424} // namespace abs425 426namespace fabs {427 static_assert(__builtin_fabs(-14.0) == 14.0, "");428}429 430namespace std {431struct source_location {432 struct __impl {433 unsigned int _M_line;434 const char *_M_file_name;435 signed char _M_column;436 const char *_M_function_name;437 };438 using BuiltinT = decltype(__builtin_source_location()); // OK.439};440}441 442namespace SourceLocation {443 constexpr auto A = __builtin_source_location();444 static_assert(A->_M_line == __LINE__ -1, "");445 static_assert(A->_M_column == 22, "");446 static_assert(__builtin_strcmp(A->_M_function_name, "") == 0, "");447 static_assert(__builtin_strcmp(A->_M_file_name, __FILE__) == 0, "");448 449 static_assert(__builtin_LINE() == __LINE__, "");450 451 struct Foo {452 int a = __builtin_LINE();453 };454 455 static_assert(Foo{}.a == __LINE__, "");456 457 struct AA {458 int n = __builtin_LINE();459 };460 struct B {461 AA a = {};462 };463 constexpr void f() {464 constexpr B c = {};465 static_assert(c.a.n == __LINE__ - 1, "");466 }467}468 469#define BITSIZE(x) (sizeof(x) * 8)470constexpr bool __attribute__((ext_vector_type(4))) v4b{};471namespace popcount {472 static_assert(__builtin_popcount(~0u) == __CHAR_BIT__ * sizeof(unsigned int), "");473 static_assert(__builtin_popcount(0) == 0, "");474 static_assert(__builtin_popcountl(~0ul) == __CHAR_BIT__ * sizeof(unsigned long), "");475 static_assert(__builtin_popcountl(0) == 0, "");476 static_assert(__builtin_popcountll(~0ull) == __CHAR_BIT__ * sizeof(unsigned long long), "");477 static_assert(__builtin_popcountll(0) == 0, "");478 static_assert(__builtin_popcountg((unsigned char)~0) == __CHAR_BIT__ * sizeof(unsigned char), "");479 static_assert(__builtin_popcountg((unsigned char)0) == 0, "");480 static_assert(__builtin_popcountg((unsigned short)~0) == __CHAR_BIT__ * sizeof(unsigned short), "");481 static_assert(__builtin_popcountg((unsigned short)0) == 0, "");482 static_assert(__builtin_popcountg(~0u) == __CHAR_BIT__ * sizeof(unsigned int), "");483 static_assert(__builtin_popcountg(0u) == 0, "");484 static_assert(__builtin_popcountg(~0ul) == __CHAR_BIT__ * sizeof(unsigned long), "");485 static_assert(__builtin_popcountg(0ul) == 0, "");486 static_assert(__builtin_popcountg(~0ull) == __CHAR_BIT__ * sizeof(unsigned long long), "");487 static_assert(__builtin_popcountg(0ull) == 0, "");488 static_assert(__builtin_popcountg(v4b) == 0, "");489#ifdef __SIZEOF_INT128__490 static_assert(__builtin_popcountg(~(unsigned __int128)0) == __CHAR_BIT__ * sizeof(unsigned __int128), "");491 static_assert(__builtin_popcountg((unsigned __int128)0) == 0, "");492#endif493#ifndef __AVR__494 static_assert(__builtin_popcountg(~(unsigned _BitInt(128))0) == __CHAR_BIT__ * sizeof(unsigned _BitInt(128)), "");495 static_assert(__builtin_popcountg((unsigned _BitInt(128))0) == 0, "");496#endif497 498 /// From test/Sema/constant-builtins-2.c499 char popcount1[__builtin_popcount(0) == 0 ? 1 : -1];500 char popcount2[__builtin_popcount(0xF0F0) == 8 ? 1 : -1];501 char popcount3[__builtin_popcount(~0) == BITSIZE(int) ? 1 : -1];502 char popcount4[__builtin_popcount(~0L) == BITSIZE(int) ? 1 : -1];503 char popcount5[__builtin_popcountl(0L) == 0 ? 1 : -1];504 char popcount6[__builtin_popcountl(0xF0F0L) == 8 ? 1 : -1];505 char popcount7[__builtin_popcountl(~0L) == BITSIZE(long) ? 1 : -1];506 char popcount8[__builtin_popcountll(0LL) == 0 ? 1 : -1];507 char popcount9[__builtin_popcountll(0xF0F0LL) == 8 ? 1 : -1];508 char popcount10[__builtin_popcountll(~0LL) == BITSIZE(long long) ? 1 : -1];509 char popcount11[__builtin_popcountg(0U) == 0 ? 1 : -1];510 char popcount12[__builtin_popcountg(0xF0F0U) == 8 ? 1 : -1];511 char popcount13[__builtin_popcountg(~0U) == BITSIZE(int) ? 1 : -1];512 char popcount14[__builtin_popcountg(~0UL) == BITSIZE(long) ? 1 : -1];513 char popcount15[__builtin_popcountg(~0ULL) == BITSIZE(long long) ? 1 : -1];514#ifdef __SIZEOF_INT128__515 char popcount16[__builtin_popcountg(~(unsigned __int128)0) == BITSIZE(__int128) ? 1 : -1];516#endif517#ifndef __AVR__518 char popcount17[__builtin_popcountg(~(unsigned _BitInt(128))0) == BITSIZE(_BitInt(128)) ? 1 : -1];519#endif520}521 522namespace parity {523 /// From test/Sema/constant-builtins-2.c524 char parity1[__builtin_parity(0) == 0 ? 1 : -1];525 char parity2[__builtin_parity(0xb821) == 0 ? 1 : -1];526 char parity3[__builtin_parity(0xb822) == 0 ? 1 : -1];527 char parity4[__builtin_parity(0xb823) == 1 ? 1 : -1];528 char parity5[__builtin_parity(0xb824) == 0 ? 1 : -1];529 char parity6[__builtin_parity(0xb825) == 1 ? 1 : -1];530 char parity7[__builtin_parity(0xb826) == 1 ? 1 : -1];531 char parity8[__builtin_parity(~0) == 0 ? 1 : -1];532 char parity9[__builtin_parityl(1L << (BITSIZE(long) - 1)) == 1 ? 1 : -1];533 char parity10[__builtin_parityll(1LL << (BITSIZE(long long) - 1)) == 1 ? 1 : -1];534}535 536namespace clrsb {537 char clrsb1[__builtin_clrsb(0) == BITSIZE(int) - 1 ? 1 : -1];538 char clrsb2[__builtin_clrsbl(0L) == BITSIZE(long) - 1 ? 1 : -1];539 char clrsb3[__builtin_clrsbll(0LL) == BITSIZE(long long) - 1 ? 1 : -1];540 char clrsb4[__builtin_clrsb(~0) == BITSIZE(int) - 1 ? 1 : -1];541 char clrsb5[__builtin_clrsbl(~0L) == BITSIZE(long) - 1 ? 1 : -1];542 char clrsb6[__builtin_clrsbll(~0LL) == BITSIZE(long long) - 1 ? 1 : -1];543 char clrsb7[__builtin_clrsb(1) == BITSIZE(int) - 2 ? 1 : -1];544 char clrsb8[__builtin_clrsb(~1) == BITSIZE(int) - 2 ? 1 : -1];545 char clrsb9[__builtin_clrsb(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];546 char clrsb10[__builtin_clrsb(~(1 << (BITSIZE(int) - 1))) == 0 ? 1 : -1];547 char clrsb11[__builtin_clrsb(0xf) == BITSIZE(int) - 5 ? 1 : -1];548 char clrsb12[__builtin_clrsb(~0x1f) == BITSIZE(int) - 6 ? 1 : -1];549}550 551namespace bitreverse {552 char bitreverse1[__builtin_bitreverse8(0x01) == 0x80 ? 1 : -1];553 char bitreverse2[__builtin_bitreverse16(0x3C48) == 0x123C ? 1 : -1];554 char bitreverse3[__builtin_bitreverse32(0x12345678) == 0x1E6A2C48 ? 1 : -1];555 char bitreverse4[__builtin_bitreverse64(0x0123456789ABCDEFULL) == 0xF7B3D591E6A2C480 ? 1 : -1];556}557 558namespace expect {559 constexpr int a() {560 return 12;561 }562 static_assert(__builtin_expect(a(),1) == 12, "");563 static_assert(__builtin_expect_with_probability(a(), 1, 1.0) == 12, "");564}565 566namespace rotateleft {567 char rotateleft1[__builtin_rotateleft8(0x01, 5) == 0x20 ? 1 : -1];568 char rotateleft2[__builtin_rotateleft16(0x3210, 11) == 0x8190 ? 1 : -1];569 char rotateleft3[__builtin_rotateleft32(0x76543210, 22) == 0x841D950C ? 1 : -1];570 char rotateleft4[__builtin_rotateleft64(0xFEDCBA9876543210ULL, 55) == 0x87F6E5D4C3B2A19ULL ? 1 : -1];571}572 573namespace rotateright {574 char rotateright1[__builtin_rotateright8(0x01, 5) == 0x08 ? 1 : -1];575 char rotateright2[__builtin_rotateright16(0x3210, 11) == 0x4206 ? 1 : -1];576 char rotateright3[__builtin_rotateright32(0x76543210, 22) == 0x50C841D9 ? 1 : -1];577 char rotateright4[__builtin_rotateright64(0xFEDCBA9876543210ULL, 55) == 0xB97530ECA86421FDULL ? 1 : -1];578}579 580namespace ffs {581 char ffs1[__builtin_ffs(0) == 0 ? 1 : -1];582 char ffs2[__builtin_ffs(1) == 1 ? 1 : -1];583 char ffs3[__builtin_ffs(0xfbe71) == 1 ? 1 : -1];584 char ffs4[__builtin_ffs(0xfbe70) == 5 ? 1 : -1];585 char ffs5[__builtin_ffs(1U << (BITSIZE(int) - 1)) == BITSIZE(int) ? 1 : -1];586 char ffs6[__builtin_ffsl(0x10L) == 5 ? 1 : -1];587 char ffs7[__builtin_ffsll(0x100LL) == 9 ? 1 : -1];588}589 590namespace EhReturnDataRegno {591 void test11(int X) {592 switch (X) {593 case __builtin_eh_return_data_regno(0): // constant foldable.594 break;595 }596 __builtin_eh_return_data_regno(X); // both-error {{argument to '__builtin_eh_return_data_regno' must be a constant integer}}597 }598}599 600/// From test/SemaCXX/builtins.cpp601namespace test_launder {602#define TEST_TYPE(Ptr, Type) \603 static_assert(__is_same(decltype(__builtin_launder(Ptr)), Type), "expected same type")604 605struct Dummy {};606 607using FnType = int(char);608using MemFnType = int (Dummy::*)(char);609using ConstMemFnType = int (Dummy::*)() const;610 611void foo() {}612 613void test_builtin_launder_diags(void *vp, const void *cvp, FnType *fnp,614 MemFnType mfp, ConstMemFnType cmfp, int (&Arr)[5]) {615 __builtin_launder(vp); // both-error {{void pointer argument to '__builtin_launder' is not allowed}}616 __builtin_launder(cvp); // both-error {{void pointer argument to '__builtin_launder' is not allowed}}617 __builtin_launder(fnp); // both-error {{function pointer argument to '__builtin_launder' is not allowed}}618 __builtin_launder(mfp); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}619 __builtin_launder(cmfp); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}620 (void)__builtin_launder(&fnp);621 __builtin_launder(42); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}622 __builtin_launder(nullptr); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}623 __builtin_launder(foo); // both-error {{function pointer argument to '__builtin_launder' is not allowed}}624 (void)__builtin_launder(Arr);625}626 627void test_builtin_launder(char *p, const volatile int *ip, const float *&fp,628 double *__restrict dp) {629 int x;630 __builtin_launder(x); // both-error {{non-pointer argument to '__builtin_launder' is not allowed}}631 632 TEST_TYPE(p, char*);633 TEST_TYPE(ip, const volatile int*);634 TEST_TYPE(fp, const float*);635 TEST_TYPE(dp, double *__restrict);636 637 char *d = __builtin_launder(p);638 const volatile int *id = __builtin_launder(ip);639 int *id2 = __builtin_launder(ip); // both-error {{cannot initialize a variable of type 'int *' with an rvalue of type 'const volatile int *'}}640 const float* fd = __builtin_launder(fp);641}642 643void test_launder_return_type(const int (&ArrayRef)[101], int (&MArrRef)[42][13],644 void (**&FuncPtrRef)()) {645 TEST_TYPE(ArrayRef, const int *);646 TEST_TYPE(MArrRef, int(*)[13]);647 TEST_TYPE(FuncPtrRef, void (**)());648}649 650template <class Tp>651constexpr Tp *test_constexpr_launder(Tp *tp) {652 return __builtin_launder(tp);653}654constexpr int const_int = 42;655constexpr int const_int2 = 101;656constexpr const int *const_ptr = test_constexpr_launder(&const_int);657static_assert(&const_int == const_ptr, "");658static_assert(const_ptr != test_constexpr_launder(&const_int2), "");659 660void test_non_constexpr() {661 constexpr int i = 42; // both-note {{address of non-static constexpr variable 'i' may differ on each invocation}}662 constexpr const int *ip = __builtin_launder(&i); // both-error {{constexpr variable 'ip' must be initialized by a constant expression}}663 // both-note@-1 {{pointer to 'i' is not a constant expression}}664}665 666constexpr bool test_in_constexpr(const int &i) {667 return (__builtin_launder(&i) == &i);668}669 670static_assert(test_in_constexpr(const_int), "");671void f() {672 constexpr int i = 42;673 static_assert(test_in_constexpr(i), "");674}675 676struct Incomplete; // both-note {{forward declaration}}677struct IncompleteMember {678 Incomplete &i;679};680void test_incomplete(Incomplete *i, IncompleteMember *im) {681 // both-error@+1 {{incomplete type 'Incomplete' where a complete type is required}}682 __builtin_launder(i);683 __builtin_launder(&i); // OK684 __builtin_launder(im); // OK685}686 687void test_noexcept(int *i) {688 static_assert(noexcept(__builtin_launder(i)), "");689}690#undef TEST_TYPE691} // end namespace test_launder692 693 694namespace clz {695 char clz1[__builtin_clz(1) == BITSIZE(int) - 1 ? 1 : -1];696 char clz2[__builtin_clz(7) == BITSIZE(int) - 3 ? 1 : -1];697 char clz3[__builtin_clz(1 << (BITSIZE(int) - 1)) == 0 ? 1 : -1];698 int clz4 = __builtin_clz(0);699 char clz5[__builtin_clzl(0xFL) == BITSIZE(long) - 4 ? 1 : -1];700 char clz6[__builtin_clzll(0xFFLL) == BITSIZE(long long) - 8 ? 1 : -1];701 char clz7[__builtin_clzs(0x1) == BITSIZE(short) - 1 ? 1 : -1];702 char clz8[__builtin_clzs(0xf) == BITSIZE(short) - 4 ? 1 : -1];703 char clz9[__builtin_clzs(0xfff) == BITSIZE(short) - 12 ? 1 : -1];704 705 int clz10 = __builtin_clzg((unsigned char)0);706 char clz11[__builtin_clzg((unsigned char)0, 42) == 42 ? 1 : -1];707 char clz12[__builtin_clzg((unsigned char)0x1) == BITSIZE(char) - 1 ? 1 : -1];708 char clz13[__builtin_clzg((unsigned char)0x1, 42) == BITSIZE(char) - 1 ? 1 : -1];709 char clz14[__builtin_clzg((unsigned char)0xf) == BITSIZE(char) - 4 ? 1 : -1];710 char clz15[__builtin_clzg((unsigned char)0xf, 42) == BITSIZE(char) - 4 ? 1 : -1];711 char clz16[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1))) == 0 ? 1 : -1];712 char clz17[__builtin_clzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == 0 ? 1 : -1];713 int clz18 = __builtin_clzg((unsigned short)0);714 char clz19[__builtin_clzg((unsigned short)0, 42) == 42 ? 1 : -1];715 char clz20[__builtin_clzg((unsigned short)0x1) == BITSIZE(short) - 1 ? 1 : -1];716 char clz21[__builtin_clzg((unsigned short)0x1, 42) == BITSIZE(short) - 1 ? 1 : -1];717 char clz22[__builtin_clzg((unsigned short)0xf) == BITSIZE(short) - 4 ? 1 : -1];718 char clz23[__builtin_clzg((unsigned short)0xf, 42) == BITSIZE(short) - 4 ? 1 : -1];719 char clz24[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1))) == 0 ? 1 : -1];720 char clz25[__builtin_clzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == 0 ? 1 : -1];721 int clz26 = __builtin_clzg(0U);722 char clz27[__builtin_clzg(0U, 42) == 42 ? 1 : -1];723 char clz28[__builtin_clzg(0x1U) == BITSIZE(int) - 1 ? 1 : -1];724 char clz29[__builtin_clzg(0x1U, 42) == BITSIZE(int) - 1 ? 1 : -1];725 char clz30[__builtin_clzg(0xfU) == BITSIZE(int) - 4 ? 1 : -1];726 char clz31[__builtin_clzg(0xfU, 42) == BITSIZE(int) - 4 ? 1 : -1];727 char clz32[__builtin_clzg(1U << (BITSIZE(int) - 1)) == 0 ? 1 : -1];728 char clz33[__builtin_clzg(1U << (BITSIZE(int) - 1), 42) == 0 ? 1 : -1];729 int clz34 = __builtin_clzg(0UL);730 char clz35[__builtin_clzg(0UL, 42) == 42 ? 1 : -1];731 char clz36[__builtin_clzg(0x1UL) == BITSIZE(long) - 1 ? 1 : -1];732 char clz37[__builtin_clzg(0x1UL, 42) == BITSIZE(long) - 1 ? 1 : -1];733 char clz38[__builtin_clzg(0xfUL) == BITSIZE(long) - 4 ? 1 : -1];734 char clz39[__builtin_clzg(0xfUL, 42) == BITSIZE(long) - 4 ? 1 : -1];735 char clz40[__builtin_clzg(1UL << (BITSIZE(long) - 1)) == 0 ? 1 : -1];736 char clz41[__builtin_clzg(1UL << (BITSIZE(long) - 1), 42) == 0 ? 1 : -1];737 int clz42 = __builtin_clzg(0ULL);738 char clz43[__builtin_clzg(0ULL, 42) == 42 ? 1 : -1];739 char clz44[__builtin_clzg(0x1ULL) == BITSIZE(long long) - 1 ? 1 : -1];740 char clz45[__builtin_clzg(0x1ULL, 42) == BITSIZE(long long) - 1 ? 1 : -1];741 char clz46[__builtin_clzg(0xfULL) == BITSIZE(long long) - 4 ? 1 : -1];742 char clz47[__builtin_clzg(0xfULL, 42) == BITSIZE(long long) - 4 ? 1 : -1];743 char clz48[__builtin_clzg(1ULL << (BITSIZE(long long) - 1)) == 0 ? 1 : -1];744 char clz49[__builtin_clzg(1ULL << (BITSIZE(long long) - 1), 42) == 0 ? 1 : -1];745#ifdef __SIZEOF_INT128__746 int clz50 = __builtin_clzg((unsigned __int128)0);747 char clz51[__builtin_clzg((unsigned __int128)0, 42) == 42 ? 1 : -1];748 char clz52[__builtin_clzg((unsigned __int128)0x1) == BITSIZE(__int128) - 1 ? 1 : -1];749 char clz53[__builtin_clzg((unsigned __int128)0x1, 42) == BITSIZE(__int128) - 1 ? 1 : -1];750 char clz54[__builtin_clzg((unsigned __int128)0xf) == BITSIZE(__int128) - 4 ? 1 : -1];751 char clz55[__builtin_clzg((unsigned __int128)0xf, 42) == BITSIZE(__int128) - 4 ? 1 : -1];752#endif753#ifndef __AVR__754 int clz58 = __builtin_clzg((unsigned _BitInt(128))0);755 char clz59[__builtin_clzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];756 char clz60[__builtin_clzg((unsigned _BitInt(128))0x1) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];757 char clz61[__builtin_clzg((unsigned _BitInt(128))0x1, 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];758 char clz62[__builtin_clzg((unsigned _BitInt(128))0xf) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];759 char clz63[__builtin_clzg((unsigned _BitInt(128))0xf, 42) == BITSIZE(_BitInt(128)) - 4 ? 1 : -1];760#endif761 char clz64[__builtin_clzg(v4b, 0) == 0 ? 1 : -1];762}763 764namespace ctz {765 char ctz1[__builtin_ctz(1) == 0 ? 1 : -1];766 char ctz2[__builtin_ctz(8) == 3 ? 1 : -1];767 char ctz3[__builtin_ctz(1 << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];768 int ctz4 = __builtin_ctz(0);769 char ctz5[__builtin_ctzl(0x10L) == 4 ? 1 : -1];770 char ctz6[__builtin_ctzll(0x100LL) == 8 ? 1 : -1];771 char ctz7[__builtin_ctzs(1 << (BITSIZE(short) - 1)) == BITSIZE(short) - 1 ? 1 : -1];772 int ctz8 = __builtin_ctzg((unsigned char)0);773 char ctz9[__builtin_ctzg((unsigned char)0, 42) == 42 ? 1 : -1];774 char ctz10[__builtin_ctzg((unsigned char)0x1) == 0 ? 1 : -1];775 char ctz11[__builtin_ctzg((unsigned char)0x1, 42) == 0 ? 1 : -1];776 char ctz12[__builtin_ctzg((unsigned char)0x10) == 4 ? 1 : -1];777 char ctz13[__builtin_ctzg((unsigned char)0x10, 42) == 4 ? 1 : -1];778 char ctz14[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1))) == BITSIZE(char) - 1 ? 1 : -1];779 char ctz15[__builtin_ctzg((unsigned char)(1 << (BITSIZE(char) - 1)), 42) == BITSIZE(char) - 1 ? 1 : -1];780 int ctz16 = __builtin_ctzg((unsigned short)0);781 char ctz17[__builtin_ctzg((unsigned short)0, 42) == 42 ? 1 : -1];782 char ctz18[__builtin_ctzg((unsigned short)0x1) == 0 ? 1 : -1];783 char ctz19[__builtin_ctzg((unsigned short)0x1, 42) == 0 ? 1 : -1];784 char ctz20[__builtin_ctzg((unsigned short)0x10) == 4 ? 1 : -1];785 char ctz21[__builtin_ctzg((unsigned short)0x10, 42) == 4 ? 1 : -1];786 char ctz22[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1))) == BITSIZE(short) - 1 ? 1 : -1];787 char ctz23[__builtin_ctzg((unsigned short)(1 << (BITSIZE(short) - 1)), 42) == BITSIZE(short) - 1 ? 1 : -1];788 int ctz24 = __builtin_ctzg(0U);789 char ctz25[__builtin_ctzg(0U, 42) == 42 ? 1 : -1];790 char ctz26[__builtin_ctzg(0x1U) == 0 ? 1 : -1];791 char ctz27[__builtin_ctzg(0x1U, 42) == 0 ? 1 : -1];792 char ctz28[__builtin_ctzg(0x10U) == 4 ? 1 : -1];793 char ctz29[__builtin_ctzg(0x10U, 42) == 4 ? 1 : -1];794 char ctz30[__builtin_ctzg(1U << (BITSIZE(int) - 1)) == BITSIZE(int) - 1 ? 1 : -1];795 char ctz31[__builtin_ctzg(1U << (BITSIZE(int) - 1), 42) == BITSIZE(int) - 1 ? 1 : -1];796 int ctz32 = __builtin_ctzg(0UL);797 char ctz33[__builtin_ctzg(0UL, 42) == 42 ? 1 : -1];798 char ctz34[__builtin_ctzg(0x1UL) == 0 ? 1 : -1];799 char ctz35[__builtin_ctzg(0x1UL, 42) == 0 ? 1 : -1];800 char ctz36[__builtin_ctzg(0x10UL) == 4 ? 1 : -1];801 char ctz37[__builtin_ctzg(0x10UL, 42) == 4 ? 1 : -1];802 char ctz38[__builtin_ctzg(1UL << (BITSIZE(long) - 1)) == BITSIZE(long) - 1 ? 1 : -1];803 char ctz39[__builtin_ctzg(1UL << (BITSIZE(long) - 1), 42) == BITSIZE(long) - 1 ? 1 : -1];804 int ctz40 = __builtin_ctzg(0ULL);805 char ctz41[__builtin_ctzg(0ULL, 42) == 42 ? 1 : -1];806 char ctz42[__builtin_ctzg(0x1ULL) == 0 ? 1 : -1];807 char ctz43[__builtin_ctzg(0x1ULL, 42) == 0 ? 1 : -1];808 char ctz44[__builtin_ctzg(0x10ULL) == 4 ? 1 : -1];809 char ctz45[__builtin_ctzg(0x10ULL, 42) == 4 ? 1 : -1];810 char ctz46[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1)) == BITSIZE(long long) - 1 ? 1 : -1];811 char ctz47[__builtin_ctzg(1ULL << (BITSIZE(long long) - 1), 42) == BITSIZE(long long) - 1 ? 1 : -1];812#ifdef __SIZEOF_INT128__813 int ctz48 = __builtin_ctzg((unsigned __int128)0);814 char ctz49[__builtin_ctzg((unsigned __int128)0, 42) == 42 ? 1 : -1];815 char ctz50[__builtin_ctzg((unsigned __int128)0x1) == 0 ? 1 : -1];816 char ctz51[__builtin_ctzg((unsigned __int128)0x1, 42) == 0 ? 1 : -1];817 char ctz52[__builtin_ctzg((unsigned __int128)0x10) == 4 ? 1 : -1];818 char ctz53[__builtin_ctzg((unsigned __int128)0x10, 42) == 4 ? 1 : -1];819 char ctz54[__builtin_ctzg((unsigned __int128)1 << (BITSIZE(__int128) - 1)) == BITSIZE(__int128) - 1 ? 1 : -1];820 char ctz55[__builtin_ctzg((unsigned __int128)1 << (BITSIZE(__int128) - 1), 42) == BITSIZE(__int128) - 1 ? 1 : -1];821#endif822#ifndef __AVR__823 int ctz56 = __builtin_ctzg((unsigned _BitInt(128))0);824 char ctz57[__builtin_ctzg((unsigned _BitInt(128))0, 42) == 42 ? 1 : -1];825 char ctz58[__builtin_ctzg((unsigned _BitInt(128))0x1) == 0 ? 1 : -1];826 char ctz59[__builtin_ctzg((unsigned _BitInt(128))0x1, 42) == 0 ? 1 : -1];827 char ctz60[__builtin_ctzg((unsigned _BitInt(128))0x10) == 4 ? 1 : -1];828 char ctz61[__builtin_ctzg((unsigned _BitInt(128))0x10, 42) == 4 ? 1 : -1];829 char ctz62[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1)) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];830 char ctz63[__builtin_ctzg((unsigned _BitInt(128))1 << (BITSIZE(_BitInt(128)) - 1), 42) == BITSIZE(_BitInt(128)) - 1 ? 1 : -1];831#endif832 char clz64[__builtin_ctzg(v4b, 0) == 0 ? 1 : -1];833}834 835namespace bswap {836 extern int f(void);837 int h3 = __builtin_bswap16(0x1234) == 0x3412 ? 1 : f();838 int h4 = __builtin_bswap32(0x1234) == 0x34120000 ? 1 : f();839 int h5 = __builtin_bswap64(0x1234) == 0x3412000000000000 ? 1 : f();840 int h6 = __builtin_bswapg(0x12) == 0x12 ? 1 : f();841 int h7 = __builtin_bswapg(0x1234) == 0x3412 ? 1 : f();842 int h8 = __builtin_bswapg(0x00001234) == 0x34120000 ? 1 : f();843 int h9 = __builtin_bswapg(0x0000000000001234) == 0x3412000000000000 ? 1 : f();844#ifndef __AVR__845 int h10 = __builtin_bswapg((_BitInt(8))0x12) == (_BitInt(8))0x12 ? 1 : f();846 int h11 = __builtin_bswapg((_BitInt(16))0x1234) == (_BitInt(16))0x3412 ? 1 : f();847 int h12 = __builtin_bswapg((_BitInt(32))0x00001234) == (_BitInt(32))0x34120000 ? 1 : f();848 int h13 = __builtin_bswapg((_BitInt(64))0x0000000000001234) == (_BitInt(64))0x3412000000000000 ? 1 : f();849 int h14 = __builtin_bswapg(~(_BitInt(128))0) == (~(_BitInt(128))0) ? 1 : f();850 int h15 = __builtin_bswapg((_BitInt(24))0x1234) == (_BitInt(24))0x3412 ? 1 : f();851 // expected-error@-1 {{_BitInt type '_BitInt(24)' (24 bits) must be a multiple of 16 bits for byte swapping}}852 // ref-error@-2 {{_BitInt type '_BitInt(24)' (24 bits) must be a multiple of 16 bits for byte swapping}}853#endif854 855 constexpr const int const_expr = 0x1234;856 857 void test_constexpr_reference() {858 const int expr = 0x1234; 859 const int& ref = expr; // #declare860 861 constexpr const int& const_ref = const_expr;862 863 constexpr auto result2 = __builtin_bswapg(ref); 864 //expected-error@-1 {{constexpr variable 'result2' must be initialized by a constant expression}}865 //expected-note@-2 {{initializer of 'ref' is not a constant expression}}866 //expected-note@#declare {{declared here}}867 //ref-error@-4 {{constexpr variable 'result2' must be initialized by a constant expression}}868 //ref-note@-5 {{initializer of 'ref' is not a constant expression}}869 //ref-note@#declare {{declared here}}870 871 constexpr auto result3 = __builtin_bswapg(const_ref);872 }873}874 875#define CFSTR __builtin___CFStringMakeConstantString876void test7(void) {877 const void *X;878#if !defined(_AIX)879 X = CFSTR("\242"); // both-warning {{input conversion stopped}}880 X = CFSTR("\0"); // no-warning881 X = CFSTR(242); // both-error {{cannot initialize a parameter of type 'const char *' with an rvalue of type 'int'}}882 X = CFSTR("foo", "bar"); // both-error {{too many arguments to function call}}883#endif884}885 886/// The actual value on my machine is 22, but I have a feeling this will be different887/// on other targets, so just checking for != 0 here. Light testing is fine since888/// the actual implementation uses analyze_os_log::computeOSLogBufferLayout(), which889/// is tested elsewhere.890static_assert(__builtin_os_log_format_buffer_size("%{mask.xyz}s", "abc") != 0, "");891 892/// Copied from test/Sema/constant_builtins_vector.cpp.893/// Some tests are missing since we run this for multiple targets,894/// some of which do not support _BitInt.895#ifndef __AVR__896typedef _BitInt(128) BitInt128;897typedef double vector4double __attribute__((__vector_size__(32)));898typedef float vector4float __attribute__((__vector_size__(16)));899typedef long long vector4long __attribute__((__vector_size__(32)));900typedef int vector4int __attribute__((__vector_size__(16)));901typedef short vector4short __attribute__((__vector_size__(8)));902typedef char vector4char __attribute__((__vector_size__(4)));903typedef BitInt128 vector4BitInt128 __attribute__((__vector_size__(64)));904typedef double vector8double __attribute__((__vector_size__(64)));905typedef float vector8float __attribute__((__vector_size__(32)));906typedef long long vector8long __attribute__((__vector_size__(64)));907typedef int vector8int __attribute__((__vector_size__(32)));908typedef short vector8short __attribute__((__vector_size__(16)));909typedef char vector8char __attribute__((__vector_size__(8)));910typedef BitInt128 vector8BitInt128 __attribute__((__vector_size__(128)));911 912namespace convertvector {913 constexpr vector4double from_vector4double_to_vector4double_var =914 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4double);915 constexpr vector4float from_vector4double_to_vector4float_var =916 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4float);917 constexpr vector4long from_vector4double_to_vector4long_var =918 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4long);919 constexpr vector4int from_vector4double_to_vector4int_var =920 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4int);921 constexpr vector4short from_vector4double_to_vector4short_var =922 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4short);923 constexpr vector4char from_vector4double_to_vector4char_var =924 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4char);925 constexpr vector4BitInt128 from_vector4double_to_vector4BitInt128_var =926 __builtin_convertvector((vector4double){0, 1, 2, 3}, vector4BitInt128);927 constexpr vector4double from_vector4float_to_vector4double_var =928 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4double);929 constexpr vector4float from_vector4float_to_vector4float_var =930 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4float);931 constexpr vector4long from_vector4float_to_vector4long_var =932 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4long);933 constexpr vector4int from_vector4float_to_vector4int_var =934 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4int);935 constexpr vector4short from_vector4float_to_vector4short_var =936 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4short);937 constexpr vector4char from_vector4float_to_vector4char_var =938 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4char);939 constexpr vector4BitInt128 from_vector4float_to_vector4BitInt128_var =940 __builtin_convertvector((vector4float){0, 1, 2, 3}, vector4BitInt128);941 constexpr vector4double from_vector4long_to_vector4double_var =942 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4double);943 constexpr vector4float from_vector4long_to_vector4float_var =944 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4float);945 constexpr vector4long from_vector4long_to_vector4long_var =946 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4long);947 constexpr vector4int from_vector4long_to_vector4int_var =948 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4int);949 constexpr vector4short from_vector4long_to_vector4short_var =950 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4short);951 constexpr vector4char from_vector4long_to_vector4char_var =952 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4char);953 constexpr vector4BitInt128 from_vector4long_to_vector4BitInt128_var =954 __builtin_convertvector((vector4long){0, 1, 2, 3}, vector4BitInt128);955 constexpr vector4double from_vector4int_to_vector4double_var =956 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4double);957 constexpr vector4float from_vector4int_to_vector4float_var =958 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4float);959 constexpr vector4long from_vector4int_to_vector4long_var =960 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4long);961 constexpr vector4int from_vector4int_to_vector4int_var =962 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4int);963 constexpr vector4short from_vector4int_to_vector4short_var =964 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4short);965 constexpr vector4char from_vector4int_to_vector4char_var =966 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4char);967 constexpr vector4BitInt128 from_vector4int_to_vector4BitInt128_var =968 __builtin_convertvector((vector4int){0, 1, 2, 3}, vector4BitInt128);969 constexpr vector4double from_vector4short_to_vector4double_var =970 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4double);971 constexpr vector4float from_vector4short_to_vector4float_var =972 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4float);973 constexpr vector4long from_vector4short_to_vector4long_var =974 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4long);975 constexpr vector4int from_vector4short_to_vector4int_var =976 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4int);977 constexpr vector4short from_vector4short_to_vector4short_var =978 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4short);979 constexpr vector4char from_vector4short_to_vector4char_var =980 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4char);981 constexpr vector4BitInt128 from_vector4short_to_vector4BitInt128_var =982 __builtin_convertvector((vector4short){0, 1, 2, 3}, vector4BitInt128);983 constexpr vector4double from_vector4char_to_vector4double_var =984 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4double);985 constexpr vector4float from_vector4char_to_vector4float_var =986 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4float);987 constexpr vector4long from_vector4char_to_vector4long_var =988 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4long);989 constexpr vector4int from_vector4char_to_vector4int_var =990 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4int);991 constexpr vector4short from_vector4char_to_vector4short_var =992 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4short);993 constexpr vector4char from_vector4char_to_vector4char_var =994 __builtin_convertvector((vector4char){0, 1, 2, 3}, vector4char);995 constexpr vector8double from_vector8double_to_vector8double_var =996 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},997 vector8double);998 constexpr vector8float from_vector8double_to_vector8float_var =999 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1000 vector8float);1001 constexpr vector8long from_vector8double_to_vector8long_var =1002 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1003 vector8long);1004 constexpr vector8int from_vector8double_to_vector8int_var =1005 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1006 vector8int);1007 constexpr vector8short from_vector8double_to_vector8short_var =1008 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1009 vector8short);1010 constexpr vector8char from_vector8double_to_vector8char_var =1011 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1012 vector8char);1013 constexpr vector8BitInt128 from_vector8double_to_vector8BitInt128_var =1014 __builtin_convertvector((vector8double){0, 1, 2, 3, 4, 5, 6, 7},1015 vector8BitInt128);1016 constexpr vector8double from_vector8float_to_vector8double_var =1017 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1018 vector8double);1019 constexpr vector8float from_vector8float_to_vector8float_var =1020 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1021 vector8float);1022 constexpr vector8long from_vector8float_to_vector8long_var =1023 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1024 vector8long);1025 constexpr vector8int from_vector8float_to_vector8int_var =1026 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);1027 constexpr vector8short from_vector8float_to_vector8short_var =1028 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1029 vector8short);1030 constexpr vector8char from_vector8float_to_vector8char_var =1031 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1032 vector8char);1033 constexpr vector8BitInt128 from_vector8float_to_vector8BitInt128_var =1034 __builtin_convertvector((vector8float){0, 1, 2, 3, 4, 5, 6, 7},1035 vector8BitInt128);1036 constexpr vector8double from_vector8long_to_vector8double_var =1037 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},1038 vector8double);1039 constexpr vector8float from_vector8long_to_vector8float_var =1040 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},1041 vector8float);1042 constexpr vector8long from_vector8long_to_vector8long_var =1043 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);1044 constexpr vector8int from_vector8long_to_vector8int_var =1045 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);1046 constexpr vector8short from_vector8long_to_vector8short_var =1047 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7},1048 vector8short);1049 constexpr vector8char from_vector8long_to_vector8char_var =1050 __builtin_convertvector((vector8long){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);1051 constexpr vector8double from_vector8int_to_vector8double_var =1052 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7},1053 vector8double);1054 constexpr vector8float from_vector8int_to_vector8float_var =1055 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8float);1056 constexpr vector8long from_vector8int_to_vector8long_var =1057 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);1058 constexpr vector8int from_vector8int_to_vector8int_var =1059 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);1060 constexpr vector8short from_vector8int_to_vector8short_var =1061 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8short);1062 constexpr vector8char from_vector8int_to_vector8char_var =1063 __builtin_convertvector((vector8int){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);1064 constexpr vector8double from_vector8short_to_vector8double_var =1065 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},1066 vector8double);1067 constexpr vector8float from_vector8short_to_vector8float_var =1068 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},1069 vector8float);1070 constexpr vector8long from_vector8short_to_vector8long_var =1071 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},1072 vector8long);1073 constexpr vector8int from_vector8short_to_vector8int_var =1074 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);1075 constexpr vector8short from_vector8short_to_vector8short_var =1076 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},1077 vector8short);1078 constexpr vector8char from_vector8short_to_vector8char_var =1079 __builtin_convertvector((vector8short){0, 1, 2, 3, 4, 5, 6, 7},1080 vector8char);1081 1082 constexpr vector8double from_vector8char_to_vector8double_var =1083 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},1084 vector8double);1085 constexpr vector8float from_vector8char_to_vector8float_var =1086 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},1087 vector8float);1088 constexpr vector8long from_vector8char_to_vector8long_var =1089 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8long);1090 constexpr vector8int from_vector8char_to_vector8int_var =1091 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8int);1092 constexpr vector8short from_vector8char_to_vector8short_var =1093 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7},1094 vector8short);1095 constexpr vector8char from_vector8char_to_vector8char_var =1096 __builtin_convertvector((vector8char){0, 1, 2, 3, 4, 5, 6, 7}, vector8char);1097 constexpr vector8double from_vector8BitInt128_to_vector8double_var =1098 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1099 vector8double);1100 constexpr vector8float from_vector8BitInt128_to_vector8float_var =1101 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1102 vector8float);1103 constexpr vector8long from_vector8BitInt128_to_vector8long_var =1104 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1105 vector8long);1106 constexpr vector8int from_vector8BitInt128_to_vector8int_var =1107 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1108 vector8int);1109 constexpr vector8short from_vector8BitInt128_to_vector8short_var =1110 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1111 vector8short);1112 constexpr vector8char from_vector8BitInt128_to_vector8char_var =1113 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1114 vector8char);1115 constexpr vector8BitInt128 from_vector8BitInt128_to_vector8BitInt128_var =1116 __builtin_convertvector((vector8BitInt128){0, 1, 2, 3, 4, 5, 6, 7},1117 vector8BitInt128);1118 static_assert(from_vector8BitInt128_to_vector8BitInt128_var[0] == 0, ""); 1119 static_assert(from_vector8BitInt128_to_vector8BitInt128_var[1] == 1, ""); 1120 static_assert(from_vector8BitInt128_to_vector8BitInt128_var[2] == 2, ""); 1121 static_assert(from_vector8BitInt128_to_vector8BitInt128_var[3] == 3, ""); 1122 static_assert(from_vector8BitInt128_to_vector8BitInt128_var[4] == 4, "");1123}1124 1125namespace shufflevector {1126 constexpr vector4char vector4charConst1 = {0, 1, 2, 3};1127 constexpr vector4char vector4charConst2 = {4, 5, 6, 7};1128 constexpr vector8char vector8intConst = {8, 9, 10, 11, 12, 13, 14, 15};1129 constexpr vector4char vectorShuffle1 =1130 __builtin_shufflevector(vector4charConst1, vector4charConst2, 0, 1, 2, 3);1131 constexpr vector4char vectorShuffle2 =1132 __builtin_shufflevector(vector4charConst1, vector4charConst2, 4, 5, 6, 7);1133 constexpr vector4char vectorShuffle3 =1134 __builtin_shufflevector(vector4charConst1, vector4charConst2, 0, 2, 4, 6);1135 constexpr vector8char vectorShuffle4 = __builtin_shufflevector(1136 vector8intConst, vector8intConst, 0, 2, 4, 6, 8, 10, 12, 14);1137 constexpr vector4char vectorShuffle5 =1138 __builtin_shufflevector(vector8intConst, vector8intConst, 0, 2, 4, 6);1139 constexpr vector8char vectorShuffle6 = __builtin_shufflevector(1140 vector4charConst1, vector4charConst2, 0, 2, 4, 6, 1, 3, 5, 7);1141 1142 static_assert(vectorShuffle6[0] == 0, "");1143 static_assert(vectorShuffle6[1] == 2, "");1144 static_assert(vectorShuffle6[2] == 4, "");1145 static_assert(vectorShuffle6[3] == 6, "");1146 static_assert(vectorShuffle6[4] == 1, "");1147 static_assert(vectorShuffle6[5] == 3, "");1148 static_assert(vectorShuffle6[6] == 5, "");1149 static_assert(vectorShuffle6[7] == 7, "");1150 1151 constexpr vector4char vectorShuffleFail1 = __builtin_shufflevector( // both-error {{must be initialized by a constant expression}}\1152 // 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}}1153 vector4charConst1,1154 vector4charConst2, -1, -1, -1, -1);1155}1156 1157#endif1158 1159namespace FunctionStart {1160 void a(void) {}1161 static_assert(__builtin_function_start(a) == a, ""); // both-error {{not an integral constant expression}} \1162 // both-note {{comparison against opaque constant address '&__builtin_function_start(a)'}}1163}1164 1165namespace BuiltinInImplicitCtor {1166 constexpr struct {1167 int a = __builtin_isnan(1.0);1168 } Foo;1169 static_assert(Foo.a == 0, "");1170}1171 1172typedef double vector4double __attribute__((__vector_size__(32)));1173typedef float vector4float __attribute__((__vector_size__(16)));1174typedef long long vector4long __attribute__((__vector_size__(32)));1175typedef int vector4int __attribute__((__vector_size__(16)));1176typedef unsigned long long vector4ulong __attribute__((__vector_size__(32)));1177typedef unsigned int vector4uint __attribute__((__vector_size__(16)));1178typedef short vector4short __attribute__((__vector_size__(8)));1179typedef char vector4char __attribute__((__vector_size__(4)));1180typedef double vector8double __attribute__((__vector_size__(64)));1181typedef float vector8float __attribute__((__vector_size__(32)));1182typedef long long vector8long __attribute__((__vector_size__(64)));1183typedef int vector8int __attribute__((__vector_size__(32)));1184typedef short vector8short __attribute__((__vector_size__(16)));1185typedef char vector8char __attribute__((__vector_size__(8)));1186 1187namespace RecuceAdd {1188 static_assert(__builtin_reduce_add((vector4char){}) == 0);1189 static_assert(__builtin_reduce_add((vector4char){1, 2, 3, 4}) == 10);1190 static_assert(__builtin_reduce_add((vector4short){10, 20, 30, 40}) == 100);1191 static_assert(__builtin_reduce_add((vector4int){100, 200, 300, 400}) == 1000);1192 static_assert(__builtin_reduce_add((vector4long){1000, 2000, 3000, 4000}) == 10000);1193 constexpr int reduceAddInt1 = __builtin_reduce_add((vector4int){~(1 << (sizeof(int) * 8 - 1)), 0, 0, 1});1194 // both-error@-1 {{must be initialized by a constant expression}} \1195 // both-note@-1 {{outside the range of representable values of type 'int'}}1196 constexpr long long reduceAddLong1 = __builtin_reduce_add((vector4long){~(1LL << (sizeof(long long) * 8 - 1)), 0, 0, 1});1197 // both-error@-1 {{must be initialized by a constant expression}} \1198 // both-note@-1 {{outside the range of representable values of type 'long long'}}1199 constexpr int reduceAddInt2 = __builtin_reduce_add((vector4int){(1 << (sizeof(int) * 8 - 1)), 0, 0, -1});1200 // both-error@-1 {{must be initialized by a constant expression}} \1201 // both-note@-1 {{outside the range of representable values of type 'int'}}1202 constexpr long long reduceAddLong2 = __builtin_reduce_add((vector4long){(1LL << (sizeof(long long) * 8 - 1)), 0, 0, -1});1203 // both-error@-1 {{must be initialized by a constant expression}} \1204 // both-note@-1 {{outside the range of representable values of type 'long long'}}1205 static_assert(__builtin_reduce_add((vector4uint){~0U, 0, 0, 1}) == 0);1206 static_assert(__builtin_reduce_add((vector4ulong){~0ULL, 0, 0, 1}) == 0);1207 1208 1209#ifdef __SIZEOF_INT128__1210 typedef __int128 v4i128 __attribute__((__vector_size__(128 * 2)));1211 constexpr __int128 reduceAddInt3 = __builtin_reduce_add((v4i128){});1212 static_assert(reduceAddInt3 == 0);1213#endif1214}1215 1216namespace ReduceMul {1217 static_assert(__builtin_reduce_mul((vector4char){}) == 0);1218 static_assert(__builtin_reduce_mul((vector4char){1, 2, 3, 4}) == 24);1219 static_assert(__builtin_reduce_mul((vector4short){1, 2, 30, 40}) == 2400);1220#ifndef __AVR__1221 static_assert(__builtin_reduce_mul((vector4int){10, 20, 300, 400}) == 24'000'000);1222#endif1223 static_assert(__builtin_reduce_mul((vector4long){1000L, 2000L, 3000L, 4000L}) == 24'000'000'000'000L);1224 constexpr int reduceMulInt1 = __builtin_reduce_mul((vector4int){~(1 << (sizeof(int) * 8 - 1)), 1, 1, 2});1225 // both-error@-1 {{must be initialized by a constant expression}} \1226 // both-note@-1 {{outside the range of representable values of type 'int'}}1227 constexpr long long reduceMulLong1 = __builtin_reduce_mul((vector4long){~(1LL << (sizeof(long long) * 8 - 1)), 1, 1, 2});1228 // both-error@-1 {{must be initialized by a constant expression}} \1229 // both-note@-1 {{outside the range of representable values of type 'long long'}}1230 constexpr int reduceMulInt2 = __builtin_reduce_mul((vector4int){(1 << (sizeof(int) * 8 - 1)), 1, 1, 2});1231 // both-error@-1 {{must be initialized by a constant expression}} \1232 // both-note@-1 {{outside the range of representable values of type 'int'}}1233 constexpr long long reduceMulLong2 = __builtin_reduce_mul((vector4long){(1LL << (sizeof(long long) * 8 - 1)), 1, 1, 2});1234 // both-error@-1 {{must be initialized by a constant expression}} \1235 // both-note@-1 {{outside the range of representable values of type 'long long'}}1236 static_assert(__builtin_reduce_mul((vector4uint){~0U, 1, 1, 2}) ==1237#ifdef __AVR__1238 0);1239#else1240 (~0U - 1));1241#endif1242 static_assert(__builtin_reduce_mul((vector4ulong){~0ULL, 1, 1, 2}) == ~0ULL - 1);1243}1244 1245namespace ReduceAnd {1246 static_assert(__builtin_reduce_and((vector4char){}) == 0);1247 static_assert(__builtin_reduce_and((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == 0);1248 static_assert(__builtin_reduce_and((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == 0);1249 static_assert(__builtin_reduce_and((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == 0);1250#if __INT_WIDTH__ == 321251 static_assert(__builtin_reduce_and((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == 0L);1252 static_assert(__builtin_reduce_and((vector4char){(char)-1, (char)~0x22, (char)~0x44, (char)~0x88}) == 0x11);1253 static_assert(__builtin_reduce_and((vector4short){(short)~0x1111, (short)-1, (short)~0x4444, (short)~0x8888}) == 0x2222);1254 static_assert(__builtin_reduce_and((vector4int){(int)~0x11111111, (int)~0x22222222, (int)-1, (int)~0x88888888}) == 0x44444444);1255 static_assert(__builtin_reduce_and((vector4long){(long long)~0x1111111111111111L, (long long)~0x2222222222222222L, (long long)~0x4444444444444444L, (long long)-1}) == 0x8888888888888888L);1256 static_assert(__builtin_reduce_and((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0U);1257 static_assert(__builtin_reduce_and((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0L);1258#endif1259}1260 1261namespace ReduceOr {1262 static_assert(__builtin_reduce_or((vector4char){}) == 0);1263 static_assert(__builtin_reduce_or((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);1264 static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);1265 static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);1266#if __INT_WIDTH__ == 321267 static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);1268 static_assert(__builtin_reduce_or((vector4char){(char)0, (char)0x22, (char)0x44, (char)0x88}) == ~0x11);1269 static_assert(__builtin_reduce_or((vector4short){(short)0x1111, (short)0, (short)0x4444, (short)0x8888}) == ~0x2222);1270 static_assert(__builtin_reduce_or((vector4int){(int)0x11111111, (int)0x22222222, (int)0, (int)0x88888888}) == ~0x44444444);1271 static_assert(__builtin_reduce_or((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0}) == ~0x8888888888888888L);1272 static_assert(__builtin_reduce_or((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);1273 static_assert(__builtin_reduce_or((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFL);1274#endif1275}1276 1277namespace ReduceXor {1278 static_assert(__builtin_reduce_xor((vector4char){}) == 0);1279 static_assert(__builtin_reduce_xor((vector4char){(char)0x11, (char)0x22, (char)0x44, (char)0x88}) == (char)0xFF);1280 static_assert(__builtin_reduce_xor((vector4short){(short)0x1111, (short)0x2222, (short)0x4444, (short)0x8888}) == (short)0xFFFF);1281#if __INT_WIDTH__ == 321282 static_assert(__builtin_reduce_xor((vector4int){(int)0x11111111, (int)0x22222222, (int)0x44444444, (int)0x88888888}) == (int)0xFFFFFFFF);1283 static_assert(__builtin_reduce_xor((vector4long){(long long)0x1111111111111111L, (long long)0x2222222222222222L, (long long)0x4444444444444444L, (long long)0x8888888888888888L}) == (long long)0xFFFFFFFFFFFFFFFFL);1284 static_assert(__builtin_reduce_xor((vector4uint){0x11111111U, 0x22222222U, 0x44444444U, 0x88888888U}) == 0xFFFFFFFFU);1285 static_assert(__builtin_reduce_xor((vector4ulong){0x1111111111111111UL, 0x2222222222222222UL, 0x4444444444444444UL, 0x8888888888888888UL}) == 0xFFFFFFFFFFFFFFFFUL);1286#endif1287}1288 1289namespace ElementwisePopcount {1290 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4int){1, 2, 3, 4})) == 5);1291#if __INT_WIDTH__ == 321292 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4int){0, 0xF0F0, ~0, ~0xF0F0})) == 16 * sizeof(int));1293#endif1294 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4long){1L, 2L, 3L, 4L})) == 5L);1295 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4long){0L, 0xF0F0L, ~0L, ~0xF0F0L})) == 16 * sizeof(long long));1296 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4uint){1U, 2U, 3U, 4U})) == 5U);1297 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4uint){0U, 0xF0F0U, ~0U, ~0xF0F0U})) == 16 * sizeof(int));1298 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4ulong){1UL, 2UL, 3UL, 4UL})) == 5UL);1299 static_assert(__builtin_reduce_add(__builtin_elementwise_popcount((vector4ulong){0ULL, 0xF0F0ULL, ~0ULL, ~0xF0F0ULL})) == 16 * sizeof(unsigned long long));1300 static_assert(__builtin_elementwise_popcount(0) == 0);1301 static_assert(__builtin_elementwise_popcount(0xF0F0) == 8);1302 static_assert(__builtin_elementwise_popcount(~0) == 8 * sizeof(int));1303 static_assert(__builtin_elementwise_popcount(0U) == 0);1304 static_assert(__builtin_elementwise_popcount(0xF0F0U) == 8);1305 static_assert(__builtin_elementwise_popcount(~0U) == 8 * sizeof(int));1306 static_assert(__builtin_elementwise_popcount(0L) == 0);1307 static_assert(__builtin_elementwise_popcount(0xF0F0L) == 8);1308 static_assert(__builtin_elementwise_popcount(~0LL) == 8 * sizeof(long long));1309 1310#if __INT_WIDTH__ == 321311 static_assert(__builtin_bit_cast(unsigned, __builtin_elementwise_popcount((vector4char){1, 2, 3, 4})) == (LITTLE_END ? 0x01020101 : 0x01010201));1312#endif1313}1314 1315namespace BuiltinMemcpy {1316 constexpr int simple() {1317 int a = 12;1318 int b = 0;1319 __builtin_memcpy(&b, &a, sizeof(a));1320 return b;1321 }1322 static_assert(simple() == 12);1323 1324 constexpr bool arrayMemcpy() {1325 char src[] = "abc";1326 char dst[4] = {};1327 __builtin_memcpy(dst, src, 4);1328 return dst[0] == 'a' && dst[1] == 'b' && dst[2] == 'c' && dst[3] == '\0';1329 }1330 static_assert(arrayMemcpy());1331 1332 extern struct Incomplete incomplete;1333 constexpr struct Incomplete *null_incomplete = 0;1334 static_assert(__builtin_memcpy(null_incomplete, null_incomplete, sizeof(wchar_t))); // both-error {{not an integral constant expression}} \1335 // both-note {{source of 'memcpy' is nullptr}}1336 1337 wchar_t global;1338 constexpr wchar_t *null = 0;1339 static_assert(__builtin_memcpy(&global, null, sizeof(wchar_t))); // both-error {{not an integral constant expression}} \1340 // both-note {{source of 'memcpy' is nullptr}}1341 1342 constexpr int simpleMove() {1343 int a = 12;1344 int b = 0;1345 __builtin_memmove(&b, &a, sizeof(a));1346 return b;1347 }1348 static_assert(simpleMove() == 12);1349 1350 constexpr int memcpyTypeRem() { // both-error {{never produces a constant expression}}1351 int a = 12;1352 int b = 0;1353 __builtin_memmove(&b, &a, 1); // both-note {{'memmove' not supported: size to copy (1) is not a multiple of size of element type 'int'}} \1354 // both-note {{not supported}}1355 return b;1356 }1357 static_assert(memcpyTypeRem() == 12); // both-error {{not an integral constant expression}} \1358 // both-note {{in call to}}1359 1360 template<typename T>1361 constexpr T result(T (&arr)[4]) {1362 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];1363 }1364 1365 constexpr int test_memcpy(int a, int b, int n) {1366 int arr[4] = {1, 2, 3, 4};1367 __builtin_memcpy(arr + a, arr + b, n); // both-note {{overlapping memory regions}}1368 return result(arr);1369 }1370 1371 static_assert(test_memcpy(1, 2, sizeof(int)) == 1334);1372 static_assert(test_memcpy(0, 1, sizeof(int) * 2) == 2334); // both-error {{not an integral constant expression}} \1373 // both-note {{in call}}1374 1375 /// Both memcpy and memmove must support pointers.1376 constexpr bool moveptr() {1377 int a = 0;1378 void *x = &a;1379 void *z = nullptr;1380 1381 __builtin_memmove(&z, &x, sizeof(void*));1382 return z == x;1383 }1384 static_assert(moveptr());1385 1386 constexpr bool cpyptr() {1387 int a = 0;1388 void *x = &a;1389 void *z = nullptr;1390 1391 __builtin_memcpy(&z, &x, sizeof(void*));1392 return z == x;1393 }1394 static_assert(cpyptr());1395 1396#ifndef __AVR__1397 constexpr int test_memmove(int a, int b, int n) {1398 int arr[4] = {1, 2, 3, 4};1399 __builtin_memmove(arr + a, arr + b, n); // both-note {{destination is not a contiguous array of at least 3 elements of type 'int'}}1400 return result(arr);1401 }1402 static_assert(test_memmove(2, 0, 12) == 4234); // both-error {{constant}} \1403 // both-note {{in call}}1404#endif1405 1406 struct Trivial { char k; short s; constexpr bool ok() { return k == 3 && s == 4; } };1407 constexpr bool test_trivial() {1408 Trivial arr[3] = {{1, 2}, {3, 4}, {5, 6}};1409 __builtin_memcpy(arr, arr+1, sizeof(Trivial));1410 __builtin_memmove(arr+1, arr, 2 * sizeof(Trivial));1411 1412 return arr[0].ok() && arr[1].ok() && arr[2].ok();1413 }1414 static_assert(test_trivial());1415 1416 // Check that an incomplete array is rejected.1417 constexpr int test_incomplete_array_type() { // both-error {{never produces a constant}}1418 extern int arr[];1419 __builtin_memmove(arr, arr, 4 * sizeof(arr[0]));1420 // both-note@-1 2{{'memmove' not supported: source is not a contiguous array of at least 4 elements of type 'int'}}1421 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];1422 }1423 static_assert(test_incomplete_array_type() == 1234); // both-error {{constant}} both-note {{in call}}1424 1425 1426 constexpr bool memmoveOverlapping() {1427 char s1[] {1, 2, 3};1428 __builtin_memmove(s1, s1 + 1, 2 * sizeof(char));1429 // Now: 2, 3, 31430 bool Result1 = (s1[0] == 2 && s1[1] == 3 && s1[2]== 3);1431 1432 __builtin_memmove(s1 + 1, s1, 2 * sizeof(char));1433 // Now: 2, 2, 31434 bool Result2 = (s1[0] == 2 && s1[1] == 2 && s1[2]== 3);1435 1436 return Result1 && Result2;1437 }1438 static_assert(memmoveOverlapping());1439 1440#define fold(x) (__builtin_constant_p(0) ? (x) : (x))1441 static_assert(__builtin_memcpy(&global, fold((wchar_t*)123), sizeof(wchar_t))); // both-error {{not an integral constant expression}} \1442 // both-note {{source of 'memcpy' is (void *)123}}1443 static_assert(__builtin_memcpy(fold(reinterpret_cast<wchar_t*>(123)), &global, sizeof(wchar_t))); // both-error {{not an integral constant expression}} \1444 // both-note {{destination of 'memcpy' is (void *)123}}1445 1446 1447 constexpr float type_pun(const unsigned &n) {1448 float f = 0.0f;1449 __builtin_memcpy(&f, &n, 4); // both-note {{cannot constant evaluate 'memcpy' from object of type 'const unsigned int' to object of type 'float'}}1450 return f;1451 }1452 static_assert(type_pun(0x3f800000) == 1.0f); // both-error {{constant}} \1453 // both-note {{in call}}1454 1455 struct Base { int a; };1456 struct Derived : Base { int b; };1457 constexpr int test_derived_to_base(int n) {1458 Derived arr[2] = {1, 2, 3, 4};1459 Base *p = &arr[0];1460 Base *q = &arr[1];1461 __builtin_memcpy(p, q, sizeof(Base) * n); // both-note {{source is not a contiguous array of at least 2 elements of type 'BuiltinMemcpy::Base'}}1462 return arr[0].a * 1000 + arr[0].b * 100 + arr[1].a * 10 + arr[1].b;1463 }1464 static_assert(test_derived_to_base(0) == 1234);1465 static_assert(test_derived_to_base(1) == 3234);1466 static_assert(test_derived_to_base(2) == 3434); // both-error {{constant}} \1467 // both-note {{in call}}1468}1469 1470namespace Memcmp {1471 constexpr unsigned char ku00fe00[] = {0x00, 0xfe, 0x00};1472 constexpr unsigned char ku00feff[] = {0x00, 0xfe, 0xff};1473 constexpr signed char ks00fe00[] = {0, -2, 0};1474 constexpr signed char ks00feff[] = {0, -2, -1};1475 static_assert(__builtin_memcmp(ku00feff, ks00fe00, 2) == 0);1476 static_assert(__builtin_memcmp(ku00feff, ks00fe00, 99) == 1);1477 static_assert(__builtin_memcmp(ku00fe00, ks00feff, 99) == -1);1478 static_assert(__builtin_memcmp(ks00feff, ku00fe00, 2) == 0);1479 static_assert(__builtin_memcmp(ks00feff, ku00fe00, 99) == 1);1480 static_assert(__builtin_memcmp(ks00fe00, ku00feff, 99) == -1);1481 static_assert(__builtin_memcmp(ks00fe00, ks00feff, 2) == 0);1482 static_assert(__builtin_memcmp(ks00feff, ks00fe00, 99) == 1);1483 static_assert(__builtin_memcmp(ks00fe00, ks00feff, 99) == -1);1484 1485 struct Bool3Tuple { bool bb[3]; };1486 constexpr Bool3Tuple kb000100 = {{false, true, false}};1487 static_assert(sizeof(bool) != 1u || __builtin_memcmp(ks00fe00, kb000100.bb, 1) == 0); // both-error {{constant}} \1488 // both-note {{not supported}}1489 1490 constexpr char a = 'a';1491 constexpr char b = 'a';1492 static_assert(__builtin_memcmp(&a, &b, 1) == 0);1493 1494 extern struct Incomplete incomplete;1495 static_assert(__builtin_memcmp(&incomplete, "", 0u) == 0);1496 static_assert(__builtin_memcmp("", &incomplete, 0u) == 0);1497 static_assert(__builtin_memcmp(&incomplete, "", 1u) == 42); // both-error {{not an integral constant}} \1498 // both-note {{not supported}}1499 static_assert(__builtin_memcmp("", &incomplete, 1u) == 42); // both-error {{not an integral constant}} \1500 // both-note {{not supported}}1501 1502 static_assert(__builtin_memcmp(u8"abab\0banana", u8"abab\0banana", 100) == 0); // both-error {{not an integral constant}} \1503 // both-note {{dereferenced one-past-the-end}}1504 1505 static_assert(__builtin_bcmp("abaa", "abba", 3) != 0);1506 static_assert(__builtin_bcmp("abaa", "abba", 2) == 0);1507 static_assert(__builtin_bcmp("a\203", "a", 2) != 0);1508 static_assert(__builtin_bcmp("a\203", "a\003", 2) != 0);1509 static_assert(__builtin_bcmp(0, 0, 0) == 0);1510 static_assert(__builtin_bcmp("abab\0banana", "abab\0banana", 100) == 0); // both-error {{not an integral constant}}\1511 // both-note {{dereferenced one-past-the-end}}1512 static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 100) != 0); // FIXME: Should we reject this?1513 static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 7) != 0);1514 static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 6) != 0);1515 static_assert(__builtin_bcmp("abab\0banana", "abab\0canada", 5) == 0);1516 1517 1518 static_assert(__builtin_wmemcmp(L"abaa", L"abba", 3) == -1);1519 static_assert(__builtin_wmemcmp(L"abaa", L"abba", 2) == 0);1520 static_assert(__builtin_wmemcmp(0, 0, 0) == 0);1521#if __WCHAR_WIDTH__ == 321522 static_assert(__builtin_wmemcmp(L"a\x83838383", L"aa", 2) ==1523 (wchar_t)-1U >> 31);1524#endif1525 static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0banana", 100) == 0); // both-error {{not an integral constant}} \1526 // both-note {{dereferenced one-past-the-end}}1527 static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 100) == -1); // FIXME: Should we reject this?1528 static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 7) == -1);1529 static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 6) == -1);1530 static_assert(__builtin_wmemcmp(L"abab\0banana", L"abab\0canada", 5) == 0);1531 1532#if __cplusplus >= 202002L1533 constexpr bool f() {1534 char *c = new char[12];1535 c[0] = 'b';1536 1537 char n = 'a';1538 bool b = __builtin_memcmp(c, &n, 1) == 0;1539 1540 delete[] c;1541 return !b;1542 }1543 static_assert(f());1544#endif1545 1546 int unknown;1547 void foo(void) { unknown *= __builtin_memcmp(0, 0, 2); }1548 1549 constexpr int onepasttheend(char a) {1550 __builtin_memcmp(&a, &a + 1, 1); // both-note {{read of dereferenced one-past-the-end pointer}}1551 return 1;1552 }1553 static_assert(onepasttheend(10)); // both-error {{not an integral constant expression}} \1554 // both-note {{in call to}}1555}1556 1557namespace Memchr {1558 constexpr const char *kStr = "abca\xff\0d";1559 constexpr char kFoo[] = {'f', 'o', 'o'};1560 1561 static_assert(__builtin_memchr(kStr, 'a', 0) == nullptr);1562 static_assert(__builtin_memchr(kStr, 'a', 1) == kStr);1563 static_assert(__builtin_memchr(kStr, '\0', 5) == nullptr);1564 static_assert(__builtin_memchr(kStr, '\0', 6) == kStr + 5);1565 static_assert(__builtin_memchr(kStr, '\xff', 8) == kStr + 4);1566 static_assert(__builtin_memchr(kStr, '\xff' + 256, 8) == kStr + 4);1567 static_assert(__builtin_memchr(kStr, '\xff' - 256, 8) == kStr + 4);1568 static_assert(__builtin_memchr(kFoo, 'x', 3) == nullptr);1569 static_assert(__builtin_memchr(kFoo, 'x', 4) == nullptr); // both-error {{not an integral constant}} \1570 // both-note {{dereferenced one-past-the-end}}1571 static_assert(__builtin_memchr(nullptr, 'x', 3) == nullptr); // both-error {{not an integral constant}} \1572 // both-note {{dereferenced null}}1573 static_assert(__builtin_memchr(nullptr, 'x', 0) == nullptr);1574 1575 1576#if defined(CHAR8_T)1577 constexpr const char8_t *kU8Str = u8"abca\xff\0d";1578 constexpr char8_t kU8Foo[] = {u8'f', u8'o', u8'o'};1579 static_assert(__builtin_memchr(kU8Str, u8'a', 0) == nullptr);1580 static_assert(__builtin_memchr(kU8Str, u8'a', 1) == kU8Str);1581 static_assert(__builtin_memchr(kU8Str, u8'\0', 5) == nullptr);1582 static_assert(__builtin_memchr(kU8Str, u8'\0', 6) == kU8Str + 5);1583 static_assert(__builtin_memchr(kU8Str, u8'\xff', 8) == kU8Str + 4);1584 static_assert(__builtin_memchr(kU8Str, u8'\xff' + 256, 8) == kU8Str + 4);1585 static_assert(__builtin_memchr(kU8Str, u8'\xff' - 256, 8) == kU8Str + 4);1586 static_assert(__builtin_memchr(kU8Foo, u8'x', 3) == nullptr);1587 static_assert(__builtin_memchr(kU8Foo, u8'x', 4) == nullptr); // both-error {{not an integral constant}} \1588 // both-note {{dereferenced one-past-the-end}}1589 static_assert(__builtin_memchr(nullptr, u8'x', 3) == nullptr); // both-error {{not an integral constant}} \1590 // both-note {{dereferenced null}}1591 static_assert(__builtin_memchr(nullptr, u8'x', 0) == nullptr);1592#endif1593 1594 extern struct Incomplete incomplete;1595 static_assert(__builtin_memchr(&incomplete, 0, 0u) == nullptr);1596 static_assert(__builtin_memchr(&incomplete, 0, 1u) == nullptr); // both-error {{not an integral constant}} \1597 // both-note {{read of incomplete type 'struct Incomplete'}}1598 1599 const unsigned char &u1 = 0xf0;1600 auto &&i1 = (const signed char []){-128};1601 static_assert(__builtin_memchr(&u1, -(0x0f + 1), 1) == &u1);1602 static_assert(__builtin_memchr(i1, 0x80, 1) == i1);1603 1604 enum class E : unsigned char {};1605 struct EPair { E e, f; };1606 constexpr EPair ee{E{240}};1607 static_assert(__builtin_memchr(&ee.e, 240, 1) == &ee.e); // both-error {{constant}} \1608 // both-note {{not supported}}1609 1610 constexpr bool kBool[] = {false, true, false};1611 constexpr const bool *const kBoolPastTheEndPtr = kBool + 3;1612 static_assert(sizeof(bool) != 1u || __builtin_memchr(kBoolPastTheEndPtr - 3, 1, 99) == kBool + 1); // both-error {{constant}} \1613 // both-note {{not supported}}1614 static_assert(sizeof(bool) != 1u || __builtin_memchr(kBool + 1, 0, 99) == kBoolPastTheEndPtr - 1); // both-error {{constant}} \1615 // both-note {{not supported}}1616 static_assert(sizeof(bool) != 1u || __builtin_memchr(kBoolPastTheEndPtr - 3, -1, 3) == nullptr); // both-error {{constant}} \1617 // both-note {{not supported}}1618 static_assert(sizeof(bool) != 1u || __builtin_memchr(kBoolPastTheEndPtr, 0, 1) == nullptr); // both-error {{constant}} \1619 // both-note {{not supported}}1620 1621 static_assert(__builtin_char_memchr(kStr, 'a', 0) == nullptr);1622 static_assert(__builtin_char_memchr(kStr, 'a', 1) == kStr);1623 static_assert(__builtin_char_memchr(kStr, '\0', 5) == nullptr);1624 static_assert(__builtin_char_memchr(kStr, '\0', 6) == kStr + 5);1625 static_assert(__builtin_char_memchr(kStr, '\xff', 8) == kStr + 4);1626 static_assert(__builtin_char_memchr(kStr, '\xff' + 256, 8) == kStr + 4);1627 static_assert(__builtin_char_memchr(kStr, '\xff' - 256, 8) == kStr + 4);1628 static_assert(__builtin_char_memchr(kFoo, 'x', 3) == nullptr);1629 static_assert(__builtin_char_memchr(kFoo, 'x', 4) == nullptr); // both-error {{not an integral constant}} \1630 // both-note {{dereferenced one-past-the-end}}1631 static_assert(__builtin_char_memchr(nullptr, 'x', 3) == nullptr); // both-error {{not an integral constant}} \1632 // both-note {{dereferenced null}}1633 static_assert(__builtin_char_memchr(nullptr, 'x', 0) == nullptr);1634 1635 static_assert(*__builtin_char_memchr(kStr, '\xff', 8) == '\xff');1636 constexpr bool char_memchr_mutable() {1637 char buffer[] = "mutable";1638 *__builtin_char_memchr(buffer, 't', 8) = 'r';1639 *__builtin_char_memchr(buffer, 'm', 8) = 'd';1640 return __builtin_strcmp(buffer, "durable") == 0;1641 }1642 static_assert(char_memchr_mutable());1643 1644 constexpr bool b = !memchr("hello", 'h', 3); // both-error {{constant expression}} \1645 // both-note {{non-constexpr function 'memchr' cannot be used in a constant expression}}1646 1647 constexpr bool f() {1648 const char *c = "abcdef";1649 return __builtin_char_memchr(c + 1, 'f', 1) == nullptr;1650 }1651 static_assert(f());1652}1653 1654namespace Strchr {1655 constexpr const char *kStr = "abca\xff\0d";1656 constexpr char kFoo[] = {'f', 'o', 'o'};1657 static_assert(__builtin_strchr(kStr, 'a') == kStr);1658 static_assert(__builtin_strchr(kStr, 'b') == kStr + 1);1659 static_assert(__builtin_strchr(kStr, 'c') == kStr + 2);1660 static_assert(__builtin_strchr(kStr, 'd') == nullptr);1661 static_assert(__builtin_strchr(kStr, 'e') == nullptr);1662 static_assert(__builtin_strchr(kStr, '\0') == kStr + 5);1663 static_assert(__builtin_strchr(kStr, 'a' + 256) == nullptr);1664 static_assert(__builtin_strchr(kStr, 'a' - 256) == nullptr);1665 static_assert(__builtin_strchr(kStr, '\xff') == kStr + 4);1666 static_assert(__builtin_strchr(kStr, '\xff' + 256) == nullptr);1667 static_assert(__builtin_strchr(kStr, '\xff' - 256) == nullptr);1668 static_assert(__builtin_strchr(kFoo, 'o') == kFoo + 1);1669 static_assert(__builtin_strchr(kFoo, 'x') == nullptr); // both-error {{not an integral constant}} \1670 // both-note {{dereferenced one-past-the-end}}1671 static_assert(__builtin_strchr(nullptr, 'x') == nullptr); // both-error {{not an integral constant}} \1672 // both-note {{dereferenced null}}1673 1674 constexpr bool a = !strchr("hello", 'h'); // both-error {{constant expression}} \1675 // both-note {{non-constexpr function 'strchr' cannot be used in a constant expression}}1676}1677 1678namespace WMemChr {1679 constexpr const wchar_t *kStr = L"abca\xffff\0dL";1680 constexpr wchar_t kFoo[] = {L'f', L'o', L'o'};1681 1682 static_assert(__builtin_wmemchr(kStr, L'a', 0) == nullptr);1683 static_assert(__builtin_wmemchr(kStr, L'a', 1) == kStr);1684 static_assert(__builtin_wmemchr(kStr, L'\0', 5) == nullptr);1685 static_assert(__builtin_wmemchr(kStr, L'\0', 6) == kStr + 5);1686 static_assert(__builtin_wmemchr(kStr, L'\xffff', 8) == kStr + 4);1687 static_assert(__builtin_wmemchr(kFoo, L'x', 3) == nullptr);1688 static_assert(__builtin_wmemchr(kFoo, L'x', 4) == nullptr); // both-error {{not an integral constant}} \1689 // both-note {{dereferenced one-past-the-end}}1690 static_assert(__builtin_wmemchr(nullptr, L'x', 3) == nullptr); // both-error {{not an integral constant}} \1691 // both-note {{dereferenced null}}1692 static_assert(__builtin_wmemchr(nullptr, L'x', 0) == nullptr);1693 1694 constexpr bool b = !wmemchr(L"hello", L'h', 3); // both-error {{constant expression}} \1695 // both-note {{non-constexpr function 'wmemchr' cannot be used in a constant expression}}1696 1697 constexpr wchar_t kStr2[] = {L'f', L'o', L'\xffff', L'o'};1698 static_assert(__builtin_wmemchr(kStr2, L'\xffff', 4) == kStr2 + 2);1699 1700 1701 static_assert(__builtin_wcschr(kStr, L'a') == kStr);1702 static_assert(__builtin_wcschr(kStr, L'b') == kStr + 1);1703 static_assert(__builtin_wcschr(kStr, L'c') == kStr + 2);1704 static_assert(__builtin_wcschr(kStr, L'd') == nullptr);1705 static_assert(__builtin_wcschr(kStr, L'e') == nullptr);1706 static_assert(__builtin_wcschr(kStr, L'\0') == kStr + 5);1707 static_assert(__builtin_wcschr(kStr, L'a' + 256) == nullptr);1708 static_assert(__builtin_wcschr(kStr, L'a' - 256) == nullptr);1709 static_assert(__builtin_wcschr(kStr, L'\xffff') == kStr + 4);1710 static_assert(__builtin_wcschr(kFoo, L'o') == kFoo + 1);1711 static_assert(__builtin_wcschr(kFoo, L'x') == nullptr); // both-error {{not an integral constant}} \1712 // both-note {{dereferenced one-past-the-end}}1713 static_assert(__builtin_wcschr(nullptr, L'x') == nullptr); // both-error {{not an integral constant}} \1714 // both-note {{dereferenced null}}1715 1716 1717 constexpr bool c = !wcschr(L"hello", L'h'); // both-error {{constant expression}} \1718 // both-note {{non-constexpr function 'wcschr' cannot be used in a constant expression}}1719}1720 1721namespace WMemCpy {1722 template<typename T>1723 constexpr T result(T (&arr)[4]) {1724 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];1725 }1726 constexpr int test_wmemcpy(int a, int b, int n) {1727 wchar_t arr[4] = {1, 2, 3, 4};1728 __builtin_wmemcpy(arr + a, arr + b, n);1729 // both-note@-1 2{{overlapping memory regions}}1730 // both-note@-2 {{source is not a contiguous array of at least 2 elements of type 'wchar_t'}}1731 // both-note@-3 {{destination is not a contiguous array of at least 3 elements of type 'wchar_t'}}1732 return result(arr);1733 }1734 static_assert(test_wmemcpy(1, 2, 1) == 1334);1735 static_assert(test_wmemcpy(2, 1, 1) == 1224);1736 static_assert(test_wmemcpy(0, 1, 2) == 2334); // both-error {{constant}} both-note {{in call}}1737 static_assert(test_wmemcpy(1, 0, 2) == 1124); // both-error {{constant}} both-note {{in call}}1738 static_assert(test_wmemcpy(1, 2, 1) == 1334);1739 static_assert(test_wmemcpy(0, 3, 1) == 4234);1740 static_assert(test_wmemcpy(0, 3, 2) == 4234); // both-error {{constant}} both-note {{in call}}1741 static_assert(test_wmemcpy(2, 0, 3) == 4234); // both-error {{constant}} both-note {{in call}}1742 1743 wchar_t global;1744 constexpr wchar_t *null = 0;1745 static_assert(__builtin_wmemcpy(&global, null, sizeof(wchar_t))); // both-error {{}} \1746 // both-note {{source of 'wmemcpy' is nullptr}}1747 static_assert(__builtin_wmemcpy(null, &global, sizeof(wchar_t))); // both-error {{}} \1748 // both-note {{destination of 'wmemcpy' is nullptr}}1749}1750 1751namespace WMemMove {1752 template<typename T>1753 constexpr T result(T (&arr)[4]) {1754 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];1755 }1756 1757 constexpr int test_wmemmove(int a, int b, int n) {1758 wchar_t arr[4] = {1, 2, 3, 4};1759 __builtin_wmemmove(arr + a, arr + b, n);1760 // both-note@-1 {{source is not a contiguous array of at least 2 elements of type 'wchar_t'}}1761 // both-note@-2 {{destination is not a contiguous array of at least 3 elements of type 'wchar_t'}}1762 return result(arr);1763 }1764 1765 static_assert(test_wmemmove(1, 2, 1) == 1334);1766 static_assert(test_wmemmove(2, 1, 1) == 1224);1767 static_assert(test_wmemmove(0, 1, 2) == 2334);1768 static_assert(test_wmemmove(1, 0, 2) == 1124);1769 static_assert(test_wmemmove(1, 2, 1) == 1334);1770 static_assert(test_wmemmove(0, 3, 1) == 4234);1771 static_assert(test_wmemmove(0, 3, 2) == 4234); // both-error {{constant}} both-note {{in call}}1772 static_assert(test_wmemmove(2, 0, 3) == 4234); // both-error {{constant}} both-note {{in call}}1773 1774 wchar_t global;1775 constexpr wchar_t *null = 0;1776 static_assert(__builtin_wmemmove(&global, null, sizeof(wchar_t))); // both-error {{}} \1777 // both-note {{source of 'wmemmove' is nullptr}}1778 static_assert(__builtin_wmemmove(null, &global, sizeof(wchar_t))); // both-error {{}} \1779 // both-note {{destination of 'wmemmove' is nullptr}}1780 1781 // Check that a pointer to an incomplete array is rejected.1782 constexpr int test_address_of_incomplete_array_type() { // both-error {{never produces a constant}}1783 extern int arr[];1784 __builtin_memmove(&arr, &arr, 4 * sizeof(arr[0])); // both-note 2{{cannot constant evaluate 'memmove' between objects of incomplete type 'int[]'}}1785 return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];1786 }1787 static_assert(test_address_of_incomplete_array_type() == 1234); // both-error {{constant}} \1788 // both-note {{in call}}1789}1790 1791namespace Invalid {1792 constexpr int test() { // both-error {{never produces a constant expression}}1793 __builtin_abort(); // both-note 2{{subexpression not valid in a constant expression}}1794 return 0;1795 }1796 static_assert(test() == 0); // both-error {{not an integral constant expression}} \1797 // both-note {{in call to}}1798}1799 1800#if __cplusplus >= 202002L1801namespace WithinLifetime {1802 constexpr int a = 10;1803 static_assert(__builtin_is_within_lifetime(&a));1804 1805 consteval int IsActive(bool ReadB) {1806 union {1807 int a, b;1808 } A;1809 A.a = 10;1810 if (ReadB)1811 return __builtin_is_within_lifetime(&A.b);1812 return __builtin_is_within_lifetime(&A.a);1813 }1814 static_assert(IsActive(false));1815 static_assert(!IsActive(true));1816 1817 static_assert(__builtin_is_within_lifetime((void*)nullptr)); // both-error {{not an integral constant expression}} \1818 // both-note {{'__builtin_is_within_lifetime' cannot be called with a null pointer}}1819 1820 constexpr int i = 2;1821 constexpr int arr[2]{};1822 void f() {1823 __builtin_is_within_lifetime(&i + 1); // both-error {{call to consteval function '__builtin_is_within_lifetime' is not a constant expression}} \1824 // both-note {{'__builtin_is_within_lifetime' cannot be called with a one-past-the-end pointer}} \1825 // both-warning {{expression result unused}}1826 __builtin_is_within_lifetime(arr + 2); // both-error {{call to consteval function '__builtin_is_within_lifetime' is not a constant expression}} \1827 // both-note {{'__builtin_is_within_lifetime' cannot be called with a one-past-the-end pointer}} \1828 // both-warning {{expression result unused}}1829 }1830 1831 1832 constexpr bool self = __builtin_is_within_lifetime(&self); // both-error {{must be initialized by a constant expression}} \1833 // both-note {{'__builtin_is_within_lifetime' cannot be called with a pointer to an object whose lifetime has not yet begun}} \1834 // ref-error {{call to consteval function '__builtin_is_within_lifetime' is not a constant expression}} \1835 // ref-note {{initializer of 'self' is not a constant expression}} \1836 // ref-note {{declared here}}1837 1838 int nontCE(int p) { // both-note {{declared here}}1839 return __builtin_is_within_lifetime(&p); // both-error {{call to consteval function}} \1840 // both-note {{function parameter 'p' with unknown value cannot be used in a constant expression}}1841 }1842 1843 1844 struct XStd {1845 consteval XStd() {1846 __builtin_is_within_lifetime(this); // both-note {{cannot be called with a pointer to an object whose lifetime has not yet begun}}1847 }1848 } xstd; // both-error {{is not a constant expression}} \1849 // both-note {{in call to}}1850 1851 /// FIXME: We do not have per-element lifetime information for primitive arrays.1852 /// See https://github.com/llvm/llvm-project/issues/1475281853 consteval bool test_dynamic(bool read_after_deallocate) {1854 std::allocator<int> a;1855 int* p = a.allocate(1); // expected-note 2{{allocation performed here was not deallocated}}1856 // a.allocate starts the lifetime of an array,1857 // the complete object of *p has started its lifetime1858 if (__builtin_is_within_lifetime(p))1859 return false;1860 std::construct_at(p);1861 if (!__builtin_is_within_lifetime(p))1862 return false;1863 std::destroy_at(p);1864 if (__builtin_is_within_lifetime(p))1865 return false;1866 a.deallocate(p, 1);1867 if (read_after_deallocate)1868 __builtin_is_within_lifetime(p); // ref-note {{read of heap allocated object that has been deleted}}1869 return true;1870 }1871 static_assert(test_dynamic(false)); // expected-error {{not an integral constant expression}}1872 static_assert(test_dynamic(true)); // both-error {{not an integral constant expression}} \1873 // ref-note {{in call to}}1874}1875 1876#ifdef __SIZEOF_INT128__1877namespace I128Mul {1878 constexpr int mul() {1879 __int128 A = 10;1880 __int128 B = 10;1881 __int128 R;1882 __builtin_mul_overflow(A, B, &R);1883 return 1;1884 }1885 static_assert(mul() == 1);1886}1887#endif1888 1889namespace InitParam {1890 constexpr int foo(int a) {1891 __builtin_mul_overflow(20, 10, &a);1892 return a;1893 }1894 static_assert(foo(10) == 200);1895}1896 1897#endif1898 1899namespace NonBlockPointerStore {1900 int a;1901 void foo(void) { a *= __builtin_sadd_overflow(1, 2, 0); }1902 void foo2(void) { a *= __builtin_addc(1, 2, 0, 0); }1903}1904