1 // { dg-do run { target c++11 } }
2 // { dg-options "" }
3
4 int ccnt, dcnt, cccnt, tccnt;
5
6 struct A
7 {
AA8 A () : a (6) { ccnt++; }
~AA9 ~A () { dcnt++; }
AA10 explicit A (const A &x) : a (x.a) { cccnt++; }
11 template <typename T>
AA12 A (const T &x) : a (x.a) { tccnt++; }
13 int a;
14 };
15
16 int
main()17 main ()
18 {
19 if (ccnt || dcnt || cccnt || tccnt)
20 __builtin_abort ();
21 {
22 A a[6];
23 if (ccnt != 6 || dcnt || cccnt || tccnt)
24 __builtin_abort ();
25 {
26 auto [b,c,d,e,f,g] = a; // { dg-warning "structured bindings only available with" "" { target c++14_down } }
27 if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
28 __builtin_abort ();
29 b.a++;
30 c.a += 2;
31 f.a += 3;
32 if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
33 __builtin_abort ();
34 if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
35 __builtin_abort ();
36 {
37 auto&[ h, i, j, k, l, m ] = a; // { dg-warning "structured bindings only available with" "" { target c++14_down } }
38 if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
39 __builtin_abort ();
40 j.a += 4;
41 k.a += 5;
42 m.a += 6;
43 if (a[0].a != 6 || a[1].a != 6 || a[2].a != 10 || a[3].a != 11 || a[4].a != 6 || a[5].a != 12)
44 __builtin_abort ();
45 if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
46 __builtin_abort ();
47 }
48 if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
49 __builtin_abort ();
50 }
51 if (ccnt != 6 || dcnt != 6 || cccnt || tccnt != 6)
52 __builtin_abort ();
53 }
54 if (ccnt != 6 || dcnt != 12 || cccnt || tccnt != 6)
55 __builtin_abort ();
56
57 {
58 A a[6];
59 if (ccnt != 12 || dcnt != 12 || cccnt || tccnt != 6)
60 __builtin_abort ();
61 {
62 auto [b,c,d,e,f,g] { a }; // { dg-warning "structured bindings only available with" "" { target c++14_down } }
63 if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
64 __builtin_abort ();
65 b.a++;
66 c.a += 2;
67 f.a += 3;
68 if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
69 __builtin_abort ();
70 if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
71 __builtin_abort ();
72 {
73 auto&[ h, i, j, k, l, m ] {a}; // { dg-warning "structured bindings only available with" "" { target c++14_down } }
74 if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
75 __builtin_abort ();
76 j.a += 4;
77 k.a += 5;
78 m.a += 6;
79 if (a[0].a != 6 || a[1].a != 6 || a[2].a != 10 || a[3].a != 11 || a[4].a != 6 || a[5].a != 12)
80 __builtin_abort ();
81 if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
82 __builtin_abort ();
83 }
84 if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
85 __builtin_abort ();
86 }
87 if (ccnt != 12 || dcnt != 18 || cccnt != 6 || tccnt != 6)
88 __builtin_abort ();
89 }
90 if (ccnt != 12 || dcnt != 24 || cccnt != 6 || tccnt != 6)
91 __builtin_abort ();
92
93 {
94 A a[6];
95 if (ccnt != 18 || dcnt != 24 || cccnt != 6 || tccnt != 6)
96 __builtin_abort ();
97 {
98 auto [b,c,d,e,f,g] ( a ); // { dg-warning "structured bindings only available with" "" { target c++14_down } }
99 if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
100 __builtin_abort ();
101 b.a++;
102 c.a += 2;
103 f.a += 3;
104 if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
105 __builtin_abort ();
106 if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
107 __builtin_abort ();
108 {
109 auto&[ h, i, j, k, l, m ] (a); // { dg-warning "structured bindings only available with" "" { target c++14_down } }
110 if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
111 __builtin_abort ();
112 j.a += 4;
113 k.a += 5;
114 m.a += 6;
115 if (a[0].a != 6 || a[1].a != 6 || a[2].a != 10 || a[3].a != 11 || a[4].a != 6 || a[5].a != 12)
116 __builtin_abort ();
117 if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
118 __builtin_abort ();
119 }
120 if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
121 __builtin_abort ();
122 }
123 if (ccnt != 18 || dcnt != 30 || cccnt != 12 || tccnt != 6)
124 __builtin_abort ();
125 }
126 if (ccnt != 18 || dcnt != 36 || cccnt != 12 || tccnt != 6)
127 __builtin_abort ();
128 }
129