summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/type_traits.version.pass.cpp6
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp6
-rw-r--r--libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.fail.cpp29
-rw-r--r--libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.pass.cpp50
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;
+}
OpenPOWER on IntegriCloud