xref: /llvm-project/lldb/test/API/lang/cpp/structured-binding/main.cpp (revision f56cb520d8554ca42a215e82ecfa58d0b6c178e4)
1*f56cb520SShafik Yaghmour // Structured binding in C++ can bind identifiers to subobjects of an object.
2*f56cb520SShafik Yaghmour //
3*f56cb520SShafik Yaghmour // There are three cases we need to test:
4*f56cb520SShafik Yaghmour // 1) arrays
5*f56cb520SShafik Yaghmour // 2) tuples like objects
6*f56cb520SShafik Yaghmour // 3) non-static data members
7*f56cb520SShafik Yaghmour //
8*f56cb520SShafik Yaghmour // They can also bind by copy, reference or rvalue reference.
9*f56cb520SShafik Yaghmour 
10*f56cb520SShafik Yaghmour #include <tuple>
11*f56cb520SShafik Yaghmour 
12*f56cb520SShafik Yaghmour struct A {
13*f56cb520SShafik Yaghmour   int x;
14*f56cb520SShafik Yaghmour   int y;
15*f56cb520SShafik Yaghmour };
16*f56cb520SShafik Yaghmour 
17*f56cb520SShafik Yaghmour // We want to cover a mix of types and also different sizes to make sure we
18*f56cb520SShafik Yaghmour // hande the offsets correctly.
19*f56cb520SShafik Yaghmour struct MixedTypesAndSizesStruct {
20*f56cb520SShafik Yaghmour   A a;
21*f56cb520SShafik Yaghmour   char b1;
22*f56cb520SShafik Yaghmour   char b2;
23*f56cb520SShafik Yaghmour   short b3;
24*f56cb520SShafik Yaghmour   int b4;
25*f56cb520SShafik Yaghmour   char b5;
26*f56cb520SShafik Yaghmour };
27*f56cb520SShafik Yaghmour 
main()28*f56cb520SShafik Yaghmour int main() {
29*f56cb520SShafik Yaghmour   MixedTypesAndSizesStruct b{{20, 30}, 'a', 'b', 50, 60, 'c'};
30*f56cb520SShafik Yaghmour 
31*f56cb520SShafik Yaghmour   auto [a1, b1, c1, d1, e1, f1] = b;
32*f56cb520SShafik Yaghmour   auto &[a2, b2, c2, d2, e2, f2] = b;
33*f56cb520SShafik Yaghmour   auto &&[a3, b3, c3, d3, e3, f3] =
34*f56cb520SShafik Yaghmour       MixedTypesAndSizesStruct{{20, 30}, 'a', 'b', 50, 60, 'c'};
35*f56cb520SShafik Yaghmour 
36*f56cb520SShafik Yaghmour   // Array with different sized types
37*f56cb520SShafik Yaghmour   char carr[]{'a', 'b', 'c'};
38*f56cb520SShafik Yaghmour   short sarr[]{11, 12, 13};
39*f56cb520SShafik Yaghmour   int iarr[]{22, 33, 44};
40*f56cb520SShafik Yaghmour 
41*f56cb520SShafik Yaghmour   auto [carr_copy1, carr_copy2, carr_copy3] = carr;
42*f56cb520SShafik Yaghmour   auto [sarr_copy1, sarr_copy2, sarr_copy3] = sarr;
43*f56cb520SShafik Yaghmour   auto [iarr_copy1, iarr_copy2, iarr_copy3] = iarr;
44*f56cb520SShafik Yaghmour 
45*f56cb520SShafik Yaghmour   auto &[carr_ref1, carr_ref2, carr_ref3] = carr;
46*f56cb520SShafik Yaghmour   auto &[sarr_ref1, sarr_ref2, sarr_ref3] = sarr;
47*f56cb520SShafik Yaghmour   auto &[iarr_ref1, iarr_ref2, iarr_ref3] = iarr;
48*f56cb520SShafik Yaghmour 
49*f56cb520SShafik Yaghmour   auto &&[carr_rref1, carr_rref2, carr_rref3] = carr;
50*f56cb520SShafik Yaghmour   auto &&[sarr_rref1, sarr_rref2, sarr_rref3] = sarr;
51*f56cb520SShafik Yaghmour   auto &&[iarr_rref1, iarr_rref2, iarr_rref3] = iarr;
52*f56cb520SShafik Yaghmour 
53*f56cb520SShafik Yaghmour   float x{4.0};
54*f56cb520SShafik Yaghmour   char y{'z'};
55*f56cb520SShafik Yaghmour   int z{10};
56*f56cb520SShafik Yaghmour 
57*f56cb520SShafik Yaghmour   std::tuple<float, char, int> tpl(x, y, z);
58*f56cb520SShafik Yaghmour   auto [tx1, ty1, tz1] = tpl;
59*f56cb520SShafik Yaghmour   auto &[tx2, ty2, tz2] = tpl;
60*f56cb520SShafik Yaghmour 
61*f56cb520SShafik Yaghmour   return a1.x + b1 + c1 + d1 + e1 + f1 + a2.y + b2 + c2 + d2 + e2 + f2 + a3.x +
62*f56cb520SShafik Yaghmour          b3 + c3 + d3 + e3 + f3 + carr_copy1 + carr_copy2 + carr_copy3 +
63*f56cb520SShafik Yaghmour          sarr_copy1 + sarr_copy2 + sarr_copy3 + iarr_copy1 + iarr_copy2 +
64*f56cb520SShafik Yaghmour          iarr_copy3 + carr_ref1 + carr_ref2 + carr_ref3 + sarr_ref1 +
65*f56cb520SShafik Yaghmour          sarr_ref2 + sarr_ref3 + iarr_ref1 + iarr_ref2 + iarr_ref3 +
66*f56cb520SShafik Yaghmour          carr_rref1 + carr_rref2 + carr_rref3 + sarr_rref1 + sarr_rref2 +
67*f56cb520SShafik Yaghmour          sarr_rref3 + iarr_rref1 + iarr_rref2 + iarr_rref3 + tx1 + ty1 + tz1 +
68*f56cb520SShafik Yaghmour          tx2 + ty2 + tz2; // break here
69*f56cb520SShafik Yaghmour }
70