// RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion -Wno-constant-conversion %s // RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion -Wno-constant-conversion -fexperimental-new-constant-interpreter %s /* WG14 N3018: Full * The constexpr specifier for object definitions */ #define ULLONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL) #define UINT_MAX (__INT_MAX__ *2U +1U) void Example0() { constexpr unsigned int minusOne = -1; // expected-error@-1 {{constexpr initializer evaluates to -1 which is not exactly representable in type 'const unsigned int'}} constexpr unsigned int uint_max = -1U; constexpr double onethird = 1.0/3.0; constexpr double onethirdtrunc = (double)(1.0/3.0); constexpr char string[] = { "\xFF", }; constexpr unsigned char ucstring[] = { "\xFF", }; // expected-error@-1 {{constexpr initializer evaluates to -1 which is not exactly representable in type 'const unsigned char'}} constexpr char string1[] = { -1, 0, }; constexpr unsigned char ucstring1[] = { -1, 0, }; // expected-error@-1 {{constexpr initializer evaluates to -1 which is not exactly representable in type 'const unsigned char'}} // TODO: Make sure these work correctly once char8_t and _Decimal are supported // constexpr char8_t u8string[] = { 255, 0, }; // ok // constexpr char8_t u8string[] = { u8"\xFF", }; // ok // constexpr _Decimal32 small = DEC64_TRUE_MIN * 0;// constraint violation } void Example1() { constexpr int K = 47; enum { A = K, }; constexpr int L = K; static int b = K + 1; int array[K]; _Static_assert(K == 47); } constexpr int K = 47; static const int b = K + 1; void Example2() { constexpr int A = 42LL; constexpr signed short B = ULLONG_MAX; // expected-error@-1 {{constexpr initializer evaluates to 18446744073709551615 which is not exactly representable in type 'const short'}} constexpr float C = 47u; constexpr float D = 432000000; constexpr float E = 1.0 / 3.0; // expected-error@-1 {{constexpr initializer evaluates to 3.333333e-01 which is not exactly representable in type 'const float'}} constexpr float F = 1.0f / 3.0f; } void Example3() { constexpr static unsigned short array[] = { 3000, 300000, // expected-error@-1 {{constexpr initializer evaluates to 300000 which is not exactly representable in type 'const unsigned short'}} -1 // expected-error@-1 {{constexpr initializer evaluates to -1 which is not exactly representable in type 'const unsigned short'}} }; constexpr static unsigned short array1[] = { 3000, 3000, -1 // expected-error@-1 {{constexpr initializer evaluates to -1 which is not exactly representable in type 'const unsigned short'}} }; struct S { int x, y; }; constexpr struct S s = { .x = __INT_MAX__, .y = UINT_MAX, // expected-error@-1 {{constexpr initializer evaluates to 4294967295 which is not exactly representable in type 'int'}} }; } void Example4() { struct s { void *p; }; constexpr struct s A = { nullptr }; constexpr struct s B = A; }