// RUN: %clang_cc1 -fexperimental-new-constant-interpreter %s -verify=expected,both // RUN: %clang_cc1 %s -verify=ref,both extern __SIZE_TYPE__ strlen(const char *); struct str_t { char s1[sizeof("a")]; }; static const struct str_t str1 = {"a"}; #define str ((const char *)&str1) int structStrlen(void) { if (strlen(str) == 1) return 0; return 1; } void f() { __builtin_memcpy(f, f, 1); } void f2() { __builtin_memchr(f2, 0, 1); } _Static_assert(__atomic_is_lock_free(4, (void*)2), ""); // both-error {{not an integral constant expression}} _Static_assert(__builtin_strlen((void*)0 + 1) == 2, ""); // both-error {{not an integral constant expression}} \ // both-note {{cannot perform pointer arithmetic on null pointer}} int strcmp(const char *, const char *); #define S "\x01\x02" const char _str[] = {S[0], S[1]}; const union u { int a; char b[2]; } _str2[] = {S[0], S[1]}; const int compared = strcmp(_str, (const char *)_str2); // both-error {{initializer element is not a compile-time constant}} int ptrint = __builtin_bswap64("") == 0x1234 ? 1 : 0; // both-error {{incompatible pointer to integer conversion}} \ // both-error {{initializer element is not a compile-time constant}}