1 | #include <cstdio> |
2 | #include <string> |
3 | #include <variant> |
4 | #include <vector> |
5 | |
6 | struct S { |
7 | operator int() { throw 42; } |
8 | }; |
9 | |
10 | int main() { |
11 | bool has_variant = true; |
12 | |
13 | printf(format: "%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>(v&: v1); |
53 | printf(format: "%d\n" , i); // break here |
54 | |
55 | v2 = 2.0; |
56 | double d = std::get<double>(v&: v2); |
57 | printf(format: "%f\n" , d); |
58 | |
59 | v3 = 'A'; |
60 | char c = std::get<char>(v&: v3); |
61 | printf(format: "%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>(v&: v1); |
67 | printf(format: "%f\n" , d); // break here |
68 | |
69 | try { |
70 | v_no_value.emplace<0>(args: S()); |
71 | } catch (...) { |
72 | } |
73 | |
74 | printf(format: "%zu\n" , v_no_value.index()); |
75 | |
76 | try { |
77 | v_many_types_no_value.emplace<0>(args: S()); |
78 | } catch (...) { |
79 | } |
80 | |
81 | printf(format: "%zu\n" , v_many_types_no_value.index()); |
82 | |
83 | return 0; // break here |
84 | } |
85 | |