diff options
Diffstat (limited to 'libcxx/test')
4 files changed, 85 insertions, 6 deletions
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.pass.cpp index 7e8b3de35f4..29e76b36e4c 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.pass.cpp @@ -315,16 +315,16 @@ # endif # endif -# if !defined(_LIBCPP_VERSION) +# if TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 # ifndef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should be defined in c++2a" # endif # if __cpp_lib_is_constant_evaluated != 201811L # error "__cpp_lib_is_constant_evaluated should have the value 201811L in c++2a" # endif -# else // _LIBCPP_VERSION +# else # ifdef __cpp_lib_is_constant_evaluated -# error "__cpp_lib_is_constant_evaluated should not be defined because it is unimplemented in libc++!" +# error "__cpp_lib_is_constant_evaluated should not be defined when TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 is not defined!" # endif # endif diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp index b85d42d00ca..7735a13db30 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp @@ -1798,16 +1798,16 @@ # endif # endif -# if !defined(_LIBCPP_VERSION) +# if TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 # ifndef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should be defined in c++2a" # endif # if __cpp_lib_is_constant_evaluated != 201811L # error "__cpp_lib_is_constant_evaluated should have the value 201811L in c++2a" # endif -# else // _LIBCPP_VERSION +# else # ifdef __cpp_lib_is_constant_evaluated -# error "__cpp_lib_is_constant_evaluated should not be defined because it is unimplemented in libc++!" +# error "__cpp_lib_is_constant_evaluated should not be defined when TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 is not defined!" # endif # endif diff --git a/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.fail.cpp b/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.fail.cpp new file mode 100644 index 00000000000..c139233b8da --- /dev/null +++ b/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.fail.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 + +// <type_traits> + + +#include <type_traits> +#include <cassert> + +#include "test_macros.h" + +int main(int, char**) +{ +#ifndef __cpp_lib_is_constant_evaluated + // expected-error@+1 {{no member named 'is_constant_evaluated' in namespace 'std'}} + bool b = std::is_constant_evaluated(); +#else + // expected-error@+1 {{static_assert failed}} + static_assert(!std::is_constant_evaluated(), ""); +#endif + return 0; +} diff --git a/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.pass.cpp b/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.pass.cpp new file mode 100644 index 00000000000..4dc796e950f --- /dev/null +++ b/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.pass.cpp @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// <type_traits> + +// constexpr bool is_constant_evaluated() noexcept; // C++20 + +#include <type_traits> +#include <cassert> + +#include "test_macros.h" + +#ifndef __cpp_lib_is_constant_evaluated +#if TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) +# error __cpp_lib_is_constant_evaluated should be defined +#endif +#endif + +template <bool> struct InTemplate {}; + +int main(int, char**) +{ +#ifdef __cpp_lib_is_constant_evaluated + // Test the signature + { + ASSERT_SAME_TYPE(decltype(std::is_constant_evaluated()), bool); + ASSERT_NOEXCEPT(std::is_constant_evaluated()); + constexpr bool p = std::is_constant_evaluated(); + assert(p); + } + // Test the return value of the builtin for basic sanity only. It's the + // compilers job to test tho builtin for correctness. + { + static_assert(std::is_constant_evaluated(), ""); + bool p = std::is_constant_evaluated(); + assert(!p); + ASSERT_SAME_TYPE(InTemplate<std::is_constant_evaluated()>, InTemplate<true>); + static int local_static = std::is_constant_evaluated() ? 42 : -1; + assert(local_static == 42); + } +#endif + return 0; +} |