diff --git a/clang/test/AST/Interp/intap.cpp b/clang/test/AST/Interp/intap.cpp new file mode 100644 index 0000000000000..4ca65e1040484 --- /dev/null +++ b/clang/test/AST/Interp/intap.cpp @@ -0,0 +1,79 @@ +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++11 -verify %s +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify %s +// RUN: %clang_cc1 -std=c++11 -fms-extensions -verify=ref %s +// RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref %s + +#ifdef __SIZEOF_INT128__ +namespace i128 { + typedef __int128 int128_t; + typedef unsigned __int128 uint128_t; + constexpr int128_t I128_1 = 12; + static_assert(I128_1 == 12, ""); + static_assert(I128_1 != 10, ""); + static_assert(I128_1 != 12, ""); // expected-error{{failed}} \ + // ref-error{{failed}} \ + // expected-note{{evaluates to}} \ + // ref-note{{evaluates to}} + + static const __uint128_t UINT128_MAX =__uint128_t(__int128_t(-1L)); + static_assert(UINT128_MAX == -1, ""); + + static const __int128_t INT128_MAX = UINT128_MAX >> (__int128_t)1; + static_assert(INT128_MAX != 0, ""); + static const __int128_t INT128_MIN = -INT128_MAX - 1; + constexpr __int128 A = INT128_MAX + 1; // expected-error {{must be initialized by a constant expression}} \ + // expected-note {{outside the range}} \ + // ref-error {{must be initialized by a constant expression}} \ + // ref-note {{outside the range}} + constexpr int128_t Two = (int128_t)1 << 1ul; + static_assert(Two == 2, ""); + + constexpr uint128_t AllOnes = ~static_cast(0); + static_assert(AllOnes == UINT128_MAX, ""); + +#if __cplusplus >= 201402L + template + constexpr T CastFrom(__int128_t A) { + T B = (T)A; + return B; + } + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + static_assert(CastFrom(12) == 12, ""); + + static_assert(CastFrom(AllOnes) == -1, ""); + static_assert(CastFrom(AllOnes) == 0xFF, ""); + static_assert(CastFrom(AllOnes) == -1, ""); + static_assert(CastFrom(AllOnes) == 0xFFFF, ""); + static_assert(CastFrom(AllOnes) == -1, ""); + static_assert(CastFrom(AllOnes) == -1, ""); + static_assert(CastFrom(AllOnes) == AllOnes, ""); + + template + constexpr __int128 CastTo(T A) { + int128_t B = (int128_t)A; + return B; + } + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); + static_assert(CastTo(12) == 12, ""); +#endif + + constexpr int128_t Error = __LDBL_MAX__; // ref-warning {{implicit conversion of out of range value}} \ + // ref-error {{must be initialized by a constant expression}} \ + // ref-note {{is outside the range of representable values of type}} \ + // expected-warning {{implicit conversion of out of range value}} \ + // expected-error {{must be initialized by a constant expression}} \ + // expected-note {{is outside the range of representable values of type}} +} + +#endif diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index 00875bcf44dc8..ceda59405ea91 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -26,81 +26,6 @@ static_assert(number != 10, ""); // expected-error{{failed}} \ // expected-note{{evaluates to}} \ // ref-note{{evaluates to}} - -#ifdef __SIZEOF_INT128__ -namespace i128 { - typedef __int128 int128_t; - typedef unsigned __int128 uint128_t; - constexpr int128_t I128_1 = 12; - static_assert(I128_1 == 12, ""); - static_assert(I128_1 != 10, ""); - static_assert(I128_1 != 12, ""); // expected-error{{failed}} \ - // ref-error{{failed}} \ - // expected-note{{evaluates to}} \ - // ref-note{{evaluates to}} - - static const __uint128_t UINT128_MAX =__uint128_t(__int128_t(-1L)); - static_assert(UINT128_MAX == -1, ""); - - static const __int128_t INT128_MAX = UINT128_MAX >> (__int128_t)1; - static_assert(INT128_MAX != 0, ""); - static const __int128_t INT128_MIN = -INT128_MAX - 1; - constexpr __int128 A = INT128_MAX + 1; // expected-error {{must be initialized by a constant expression}} \ - // expected-note {{outside the range}} \ - // ref-error {{must be initialized by a constant expression}} \ - // ref-note {{outside the range}} - constexpr int128_t Two = (int128_t)1 << 1ul; - static_assert(Two == 2, ""); - - constexpr uint128_t AllOnes = ~static_cast(0); - static_assert(AllOnes == UINT128_MAX, ""); - -#if __cplusplus >= 201402L - template - constexpr T CastFrom(__int128_t A) { - T B = (T)A; - return B; - } - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - static_assert(CastFrom(12) == 12, ""); - - static_assert(CastFrom(AllOnes) == -1, ""); - static_assert(CastFrom(AllOnes) == 0xFF, ""); - static_assert(CastFrom(AllOnes) == -1, ""); - static_assert(CastFrom(AllOnes) == 0xFFFF, ""); - static_assert(CastFrom(AllOnes) == -1, ""); - static_assert(CastFrom(AllOnes) == -1, ""); - static_assert(CastFrom(AllOnes) == AllOnes, ""); - - template - constexpr __int128 CastTo(T A) { - int128_t B = (int128_t)A; - return B; - } - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); - static_assert(CastTo(12) == 12, ""); -#endif - -constexpr int128_t Error = __LDBL_MAX__; // ref-warning {{implicit conversion of out of range value}} \ - // ref-error {{must be initialized by a constant expression}} \ - // ref-note {{is outside the range of representable values of type}} \ - // expected-warning {{implicit conversion of out of range value}} \ - // expected-error {{must be initialized by a constant expression}} \ - // expected-note {{is outside the range of representable values of type}} -} -#endif - constexpr bool b = number; static_assert(b, ""); constexpr int one = true;