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