1 #include <cstdarg>
2 #include <cstdint>
3 #include <cstdlib>
4 #include <ostream>
5 #include <new>
6 
7 enum class C : uint32_t {
8   X = 2,
9   Y,
10 };
11 
12 struct A {
13   int32_t m0;
14 
AA15   A(int32_t const& m0)
16     : m0(m0)
17   {}
18 
operator <A19   bool operator<(const A& other) const {
20     return m0 < other.m0;
21   }
operator <=A22   bool operator<=(const A& other) const {
23     return m0 <= other.m0;
24   }
25 };
26 
27 struct B {
28   int32_t x;
29   float y;
30 };
31 
32 union F {
33   enum class Tag : uint8_t {
34     Foo,
35     Bar,
36     Baz,
37   };
38 
39   struct Foo_Body {
40     Tag tag;
41     int16_t _0;
42   };
43 
44   struct Bar_Body {
45     Tag tag;
46     uint8_t x;
47     int16_t y;
48   };
49 
50   struct {
51     Tag tag;
52   };
53   Foo_Body foo;
54   Bar_Body bar;
55 
Foo(const int16_t & _0)56   static F Foo(const int16_t &_0) {
57     F result;
58     ::new (&result.foo._0) (int16_t)(_0);
59     result.tag = Tag::Foo;
60     return result;
61   }
62 
IsFoo() const63   bool IsFoo() const {
64     return tag == Tag::Foo;
65   }
66 
Bar(const uint8_t & x,const int16_t & y)67   static F Bar(const uint8_t &x,
68                const int16_t &y) {
69     F result;
70     ::new (&result.bar.x) (uint8_t)(x);
71     ::new (&result.bar.y) (int16_t)(y);
72     result.tag = Tag::Bar;
73     return result;
74   }
75 
IsBar() const76   bool IsBar() const {
77     return tag == Tag::Bar;
78   }
79 
Baz()80   static F Baz() {
81     F result;
82     result.tag = Tag::Baz;
83     return result;
84   }
85 
IsBaz() const86   bool IsBaz() const {
87     return tag == Tag::Baz;
88   }
89 };
90 
91 struct H {
92   enum class Tag : uint8_t {
93     Hello,
94     There,
95     Everyone,
96   };
97 
98   struct Hello_Body {
99     int16_t _0;
100   };
101 
102   struct There_Body {
103     uint8_t x;
104     int16_t y;
105   };
106 
107   Tag tag;
108   union {
109     Hello_Body hello;
110     There_Body there;
111   };
112 
HelloH113   static H Hello(const int16_t &_0) {
114     H result;
115     ::new (&result.hello._0) (int16_t)(_0);
116     result.tag = Tag::Hello;
117     return result;
118   }
119 
IsHelloH120   bool IsHello() const {
121     return tag == Tag::Hello;
122   }
123 
ThereH124   static H There(const uint8_t &x,
125                  const int16_t &y) {
126     H result;
127     ::new (&result.there.x) (uint8_t)(x);
128     ::new (&result.there.y) (int16_t)(y);
129     result.tag = Tag::There;
130     return result;
131   }
132 
IsThereH133   bool IsThere() const {
134     return tag == Tag::There;
135   }
136 
EveryoneH137   static H Everyone() {
138     H result;
139     result.tag = Tag::Everyone;
140     return result;
141   }
142 
IsEveryoneH143   bool IsEveryone() const {
144     return tag == Tag::Everyone;
145   }
146 };
147 
148 extern "C" {
149 
150 void root(A x, B y, C z, F f, H h);
151 
152 } // extern "C"
153