// -*- C++ -*- //===----------------------------------------------------------------------===// // // 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++03, c++11, c++14 // // template // constexpr add_pointer_t>> // get_if(variant* v) noexcept; // template // constexpr add_pointer_t>> // get_if(const variant* v) noexcept; #include "test_macros.h" #include "variant_test_helpers.h" #include #include #include void test_const_get_if() { { using V = std::variant; constexpr const V *v = nullptr; static_assert(std::get_if<0>(v) == nullptr, ""); } { using V = std::variant; constexpr V v(42); ASSERT_NOEXCEPT(std::get_if<0>(&v)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); static_assert(*std::get_if<0>(&v) == 42, ""); static_assert(std::get_if<1>(&v) == nullptr, ""); } { using V = std::variant; constexpr V v(42l); ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *); static_assert(*std::get_if<1>(&v) == 42, ""); static_assert(std::get_if<0>(&v) == nullptr, ""); } // FIXME: Remove these once reference support is reinstated #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant; int x = 42; const V v(x); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); assert(std::get_if<0>(&v) == &x); } { using V = std::variant; int x = 42; const V v(std::move(x)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); assert(std::get_if<0>(&v) == &x); } { using V = std::variant; int x = 42; const V v(std::move(x)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); assert(std::get_if<0>(&v) == &x); } #endif } void test_get_if() { { using V = std::variant; V *v = nullptr; assert(std::get_if<0>(v) == nullptr); } { using V = std::variant; V v(42); ASSERT_NOEXCEPT(std::get_if<0>(&v)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); assert(*std::get_if<0>(&v) == 42); assert(std::get_if<1>(&v) == nullptr); } { using V = std::variant; V v(42l); ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *); assert(*std::get_if<1>(&v) == 42); assert(std::get_if<0>(&v) == nullptr); } // FIXME: Remove these once reference support is reinstated #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant; int x = 42; V v(x); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); assert(std::get_if<0>(&v) == &x); } { using V = std::variant; int x = 42; V v(x); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); assert(std::get_if<0>(&v) == &x); } { using V = std::variant; int x = 42; V v(std::move(x)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); assert(std::get_if<0>(&v) == &x); } { using V = std::variant; int x = 42; V v(std::move(x)); ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); assert(std::get_if<0>(&v) == &x); } #endif } int main(int, char**) { test_const_get_if(); test_get_if(); return 0; }