xref: /llvm-project/libcxx/test/std/utilities/meta/meta.const.eval/is_constant_evaluated.pass.cpp (revision 14324fa4285f5cd1e421a6cebdceb05d6c49a8dc)
12fc5a786SEric Fiselier //===----------------------------------------------------------------------===//
22fc5a786SEric Fiselier //
32fc5a786SEric Fiselier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42fc5a786SEric Fiselier // See https://llvm.org/LICENSE.txt for license information.
52fc5a786SEric Fiselier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62fc5a786SEric Fiselier //
72fc5a786SEric Fiselier //===----------------------------------------------------------------------===//
82fc5a786SEric Fiselier 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
102fc5a786SEric Fiselier 
112fc5a786SEric Fiselier // <type_traits>
122fc5a786SEric Fiselier 
132fc5a786SEric Fiselier // constexpr bool is_constant_evaluated() noexcept; // C++20
142fc5a786SEric Fiselier 
152fc5a786SEric Fiselier #include <type_traits>
162fc5a786SEric Fiselier #include <cassert>
172fc5a786SEric Fiselier 
182fc5a786SEric Fiselier #include "test_macros.h"
192fc5a786SEric Fiselier 
202fc5a786SEric Fiselier #ifndef __cpp_lib_is_constant_evaluated
212fc5a786SEric Fiselier #if TEST_HAS_BUILTIN(__builtin_is_constant_evaluated)
222fc5a786SEric Fiselier # error __cpp_lib_is_constant_evaluated should be defined
232fc5a786SEric Fiselier #endif
242fc5a786SEric Fiselier #endif
252fc5a786SEric Fiselier 
26f97936faSEric Fiselier // Disable the tautological constant evaluation warnings for this test,
27f97936faSEric Fiselier // because it's explicitly testing those cases.
28*14324fa4SNikolas Klauser TEST_CLANG_DIAGNOSTIC_IGNORED("-Wconstant-evaluated")
29*14324fa4SNikolas Klauser TEST_MSVC_DIAGNOSTIC_IGNORED(5063)
30f97936faSEric Fiselier 
312fc5a786SEric Fiselier template <bool> struct InTemplate {};
322fc5a786SEric Fiselier 
main(int,char **)332fc5a786SEric Fiselier int main(int, char**)
342fc5a786SEric Fiselier {
352fc5a786SEric Fiselier   // Test the signature
362fc5a786SEric Fiselier   {
372fc5a786SEric Fiselier     ASSERT_SAME_TYPE(decltype(std::is_constant_evaluated()), bool);
382fc5a786SEric Fiselier     ASSERT_NOEXCEPT(std::is_constant_evaluated());
392fc5a786SEric Fiselier     constexpr bool p = std::is_constant_evaluated();
402fc5a786SEric Fiselier     assert(p);
412fc5a786SEric Fiselier   }
422fc5a786SEric Fiselier   // Test the return value of the builtin for basic sanity only. It's the
43437e0e51SStephan T. Lavavej   // compiler's job to test the builtin for correctness.
442fc5a786SEric Fiselier   {
452fc5a786SEric Fiselier     static_assert(std::is_constant_evaluated(), "");
462fc5a786SEric Fiselier     bool p = std::is_constant_evaluated();
472fc5a786SEric Fiselier     assert(!p);
482fc5a786SEric Fiselier     ASSERT_SAME_TYPE(InTemplate<std::is_constant_evaluated()>, InTemplate<true>);
492fc5a786SEric Fiselier     static int local_static = std::is_constant_evaluated() ? 42 : -1;
502fc5a786SEric Fiselier     assert(local_static == 42);
512fc5a786SEric Fiselier   }
522fc5a786SEric Fiselier   return 0;
532fc5a786SEric Fiselier }
54