xref: /llvm-project/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/variant/main.cpp (revision 5ce9a86110df0592d036688dc5b3ae2fbdbf99db)
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