1#include <cstdio>
2#include <string>
3#include <variant>
4#include <vector>
5
6struct S {
7 S() = default;
8 S(S &&) { throw 42; }
9 S &operator=(S &&) = default;
10};
11
12int main() {
13 std::variant<int, double, char> v1;
14 std::variant<int, double, char> &v1_ref = v1;
15
16 using V1_typedef = std::variant<int, double, char>;
17 V1_typedef v1_typedef;
18 V1_typedef &v1_typedef_ref = v1_typedef;
19
20 std::variant<int, double, char> v2;
21 std::variant<int, double, char> v3;
22 std::variant<std::variant<int, double, char>> v_v1;
23 std::variant<int, char, S> v_valueless = 5;
24 // The next variant has 300 types, meaning the type index does not fit in
25 // a byte and must be `unsigned short` instead of `unsigned char` when
26 // using the unstable libc++ ABI. With stable libc++ ABI, the type index
27 // is always just `unsigned int`.
28 std::variant<
29 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
30 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
31 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
32 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
33 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
34 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
35 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
36 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
37 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
38 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
39 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
40 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
41 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
42 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
43 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
44 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
45 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
46 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
47 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
48 int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
49 S>
50 v_300_types_valueless;
51
52 v_valueless = 5;
53 v_300_types_valueless.emplace<0>(10);
54
55 v1 = 12; // v contains int
56 v1_typedef = v1;
57 v_v1 = v1;
58 int i = std::get<int>(v1);
59 printf(format: "%d\n", i); // break here
60
61 v2 = 2.0;
62 double d = std::get<double>(v2);
63 printf(format: "%f\n", d);
64
65 v3 = 'A';
66 char c = std::get<char>(v3);
67 printf(format: "%d\n", c);
68
69 // Checking v1 above and here to make sure we done maintain the incorrect
70 // state when we change its value.
71 v1 = 2.0;
72 d = std::get<double>(v1);
73 printf(format: "%f\n", d); // break here
74
75 try {
76 // Exception in type-changing move-assignment is guaranteed to put
77 // std::variant into a valueless state.
78 v_valueless = S();
79 } catch (...) {
80 }
81
82 printf(format: "%d\n", v_valueless.valueless_by_exception());
83
84 try {
85 // Exception in move-assignment is guaranteed to put std::variant into a
86 // valueless state.
87 v_300_types_valueless = S();
88 } catch (...) {
89 }
90
91 printf("%d\n", v_300_types_valueless.valueless_by_exception());
92
93 return 0; // break here
94}
95

source code of lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/variant/main.cpp