1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03, c++11, c++14 11 12 // <variant> 13 14 // template <size_t I, class... Types> 15 // constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>> 16 // get_if(variant<Types...>* v) noexcept; 17 // template <size_t I, class... Types> 18 // constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>> 19 // get_if(const variant<Types...>* v) noexcept; 20 21 #include "test_macros.h" 22 #include "variant_test_helpers.hpp" 23 #include <cassert> 24 #include <memory> 25 #include <variant> 26 27 void test_const_get_if() { 28 { 29 using V = std::variant<int>; 30 constexpr const V *v = nullptr; 31 static_assert(std::get_if<0>(v) == nullptr, ""); 32 } 33 { 34 using V = std::variant<int, const long>; 35 constexpr V v(42); 36 ASSERT_NOEXCEPT(std::get_if<0>(&v)); 37 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); 38 static_assert(*std::get_if<0>(&v) == 42, ""); 39 static_assert(std::get_if<1>(&v) == nullptr, ""); 40 } 41 { 42 using V = std::variant<int, const long>; 43 constexpr V v(42l); 44 ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *); 45 static_assert(*std::get_if<1>(&v) == 42, ""); 46 static_assert(std::get_if<0>(&v) == nullptr, ""); 47 } 48 // FIXME: Remove these once reference support is reinstated 49 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) 50 { 51 using V = std::variant<int &>; 52 int x = 42; 53 const V v(x); 54 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); 55 assert(std::get_if<0>(&v) == &x); 56 } 57 { 58 using V = std::variant<int &&>; 59 int x = 42; 60 const V v(std::move(x)); 61 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); 62 assert(std::get_if<0>(&v) == &x); 63 } 64 { 65 using V = std::variant<const int &&>; 66 int x = 42; 67 const V v(std::move(x)); 68 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); 69 assert(std::get_if<0>(&v) == &x); 70 } 71 #endif 72 } 73 74 void test_get_if() { 75 { 76 using V = std::variant<int>; 77 V *v = nullptr; 78 assert(std::get_if<0>(v) == nullptr); 79 } 80 { 81 using V = std::variant<int, long>; 82 V v(42); 83 ASSERT_NOEXCEPT(std::get_if<0>(&v)); 84 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); 85 assert(*std::get_if<0>(&v) == 42); 86 assert(std::get_if<1>(&v) == nullptr); 87 } 88 { 89 using V = std::variant<int, const long>; 90 V v(42l); 91 ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *); 92 assert(*std::get_if<1>(&v) == 42); 93 assert(std::get_if<0>(&v) == nullptr); 94 } 95 // FIXME: Remove these once reference support is reinstated 96 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) 97 { 98 using V = std::variant<int &>; 99 int x = 42; 100 V v(x); 101 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); 102 assert(std::get_if<0>(&v) == &x); 103 } 104 { 105 using V = std::variant<const int &>; 106 int x = 42; 107 V v(x); 108 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); 109 assert(std::get_if<0>(&v) == &x); 110 } 111 { 112 using V = std::variant<int &&>; 113 int x = 42; 114 V v(std::move(x)); 115 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *); 116 assert(std::get_if<0>(&v) == &x); 117 } 118 { 119 using V = std::variant<const int &&>; 120 int x = 42; 121 V v(std::move(x)); 122 ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *); 123 assert(std::get_if<0>(&v) == &x); 124 } 125 #endif 126 } 127 128 int main() { 129 test_const_get_if(); 130 test_get_if(); 131 } 132