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