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++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.h"
23 #include <cassert>
24 #include <memory>
25 #include <variant>
26
test_const_get_if()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
test_get_if()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
main(int,char **)128 int main(int, char**) {
129 test_const_get_if();
130 test_get_if();
131
132 return 0;
133 }
134