#include #include #include #include struct S { S() = default; S(S &&) { throw 42; } S &operator=(S &&) = default; }; int main() { std::variant v1; std::variant &v1_ref = v1; using V1_typedef = std::variant; V1_typedef v1_typedef; V1_typedef &v1_typedef_ref = v1_typedef; std::variant v2; std::variant v3; std::variant> v_v1; std::variant v_valueless = 5; // The next variant has 300 types, meaning the type index does not fit in // a byte and must be `unsigned short` instead of `unsigned char` when // using the unstable libc++ ABI. With stable libc++ ABI, the type index // is always just `unsigned int`. std::variant< int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, S> v_300_types_valueless; v_valueless = 5; v_300_types_valueless.emplace<0>(10); v1 = 12; // v contains int v1_typedef = v1; v_v1 = v1; int i = std::get(v1); printf("%d\n", i); // break here v2 = 2.0; double d = std::get(v2); printf("%f\n", d); v3 = 'A'; char c = std::get(v3); printf("%d\n", c); // Checking v1 above and here to make sure we done maintain the incorrect // state when we change its value. v1 = 2.0; d = std::get(v1); printf("%f\n", d); // break here try { // Exception in type-changing move-assignment is guaranteed to put // std::variant into a valueless state. v_valueless = S(); } catch (...) { } printf("%d\n", v_valueless.valueless_by_exception()); try { // Exception in move-assignment is guaranteed to put std::variant into a // valueless state. v_300_types_valueless = S(); } catch (...) { } printf("%d\n", v_300_types_valueless.valueless_by_exception()); return 0; // break here }