1 #include <cstdio>
2 #include <string>
3 #include <variant>
4 #include <vector>
5
6 struct S {
operator intS7 operator int() { throw 42; }
8 };
9
main()10 int main() {
11 bool has_variant = true;
12
13 printf("%d\n", has_variant); // break here
14
15 std::variant<int, double, char> v1;
16 std::variant<int, double, char> &v1_ref = v1;
17 using V1_typedef = std::variant<int, double, char>;
18 V1_typedef v1_typedef;
19 V1_typedef &v1_typedef_ref = v1_typedef;
20
21 std::variant<int, double, char> v2;
22 std::variant<int, double, char> v3;
23 std::variant<std::variant<int, double, char>> v_v1;
24 std::variant<int, double, char> v_no_value;
25 // The next variant has many types, meaning the type index does not fit in
26 // a byte and must be `unsigned short` instead of `unsigned char` when
27 // using the unstable libc++ ABI. With stable libc++ ABI, the type index
28 // is always just `unsigned int`.
29 std::variant<
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>
47 v_many_types_no_value;
48
49 v1 = 12; // v contains int
50 v1_typedef = v1;
51 v_v1 = v1;
52 int i = std::get<int>(v1);
53 printf("%d\n", i); // break here
54
55 v2 = 2.0;
56 double d = std::get<double>(v2);
57 printf("%f\n", d);
58
59 v3 = 'A';
60 char c = std::get<char>(v3);
61 printf("%d\n", c);
62
63 // Checking v1 above and here to make sure we done maintain the incorrect
64 // state when we change its value.
65 v1 = 2.0;
66 d = std::get<double>(v1);
67 printf("%f\n", d); // break here
68
69 try {
70 v_no_value.emplace<0>(S());
71 } catch (...) {
72 }
73
74 printf("%zu\n", v_no_value.index());
75
76 try {
77 v_many_types_no_value.emplace<0>(S());
78 } catch (...) {
79 }
80
81 printf("%zu\n", v_many_types_no_value.index());
82
83 return 0; // break here
84 }
85