blob: 33fca213f529a485884a511d8154e3a302c05df7 [file] [edit]
// RUN: %clang_cc1 -triple x86_64-linux -verify=both,expected %s -fexperimental-new-constant-interpreter
// RUN: %clang_cc1 -triple x86_64-linux -verify=both,ref %s
static_assert("foo"[0] == 'f');
static_assert("foo"[1] == 'o');
static_assert("foo"[2] == 'o');
static_assert("foo"[3] == '\0');
static_assert(+"foo" == +"foo"); // both-error {{not an integral constant expression}} \
// both-note {{comparison of addresses of potentially overlapping literals}}
static_assert("foo"[4] == '\0'); // both-error {{not an integral constant expression}} \
// both-note {{read of dereferenced one-past-the-end pointer}}
static_assert("foo"[5] == '\0'); // both-error {{not an integral constant expression}} \
// both-note {{cannot refer to element 5 of array of 4 elements}}
constexpr const wchar_t *wide = L"bar";
static_assert(wide[0] == L'b', "");
constexpr const char32_t *u32 = U"abc";
static_assert(u32[1] == U'b', "");
constexpr int testMemcpy() {
char s[5] = {0, 0, 0, 0, 0};
__builtin_memcpy(s, "abcd", 5);
return s[0] == 'a';
}
static_assert(testMemcpy() == 1, "");
constexpr const auto *wp = L"abc";
static_assert(&wp[2] - &wp[0] == 2);
constexpr int checkMemcpy() {
char a[3] = {};
__builtin_memcpy(a, &"abcdef"[3], 3);
return __builtin_strncmp(a, "def", 3) == 0;
}
static_assert(checkMemcpy());