aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp1z/decomp6.C
blob: 7a8a239d9e17c952be26c12a31121d0ae838c3c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// { dg-do run { target c++11 } }
// { dg-options "" }

int ccnt, dcnt, cccnt, tccnt;

struct A
{
  A () : a (6) { ccnt++; }
  ~A () { dcnt++; }
  explicit A (const A &x) : a (x.a) { cccnt++; }
  template <typename T>
  A (const T &x) : a (x.a) { tccnt++; }
  int a;
};

int
main ()
{
  if (ccnt || dcnt || cccnt || tccnt)
    __builtin_abort ();
  {
    A a[6];
    if (ccnt != 6 || dcnt || cccnt || tccnt)
      __builtin_abort ();
    {
      auto [b,c,d,e,f,g] = a;		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
      if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
	__builtin_abort ();
      b.a++;
      c.a += 2;
      f.a += 3;
      if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
	__builtin_abort ();
      if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
	__builtin_abort ();
      {
	auto&[ h, i, j, k, l, m ] = a;	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
	if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
	  __builtin_abort ();
	j.a += 4;
	k.a += 5;
	m.a += 6;
	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)
	  __builtin_abort ();
	if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
	  __builtin_abort ();
      }
      if (ccnt != 6 || dcnt || cccnt || tccnt != 6)
	__builtin_abort ();
    }
    if (ccnt != 6 || dcnt != 6 || cccnt || tccnt != 6)
      __builtin_abort ();
  }
  if (ccnt != 6 || dcnt != 12 || cccnt || tccnt != 6)
    __builtin_abort ();

  {
    A a[6];
    if (ccnt != 12 || dcnt != 12 || cccnt || tccnt != 6)
      __builtin_abort ();
    {
      auto [b,c,d,e,f,g] { a };		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
      if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
	__builtin_abort ();
      b.a++;
      c.a += 2;
      f.a += 3;
      if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
	__builtin_abort ();
      if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
	__builtin_abort ();
      {
	auto&[ h, i, j, k, l, m ] {a};	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
	if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
	  __builtin_abort ();
	j.a += 4;
	k.a += 5;
	m.a += 6;
	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)
	  __builtin_abort ();
	if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
	  __builtin_abort ();
      }
      if (ccnt != 12 || dcnt != 12 || cccnt != 6 || tccnt != 6)
	__builtin_abort ();
    }
    if (ccnt != 12 || dcnt != 18 || cccnt != 6 || tccnt != 6)
      __builtin_abort ();
  }
  if (ccnt != 12 || dcnt != 24 || cccnt != 6 || tccnt != 6)
    __builtin_abort ();

  {
    A a[6];
    if (ccnt != 18 || dcnt != 24 || cccnt != 6 || tccnt != 6)
      __builtin_abort ();
    {
      auto [b,c,d,e,f,g] ( a );		// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
      if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
	__builtin_abort ();
      b.a++;
      c.a += 2;
      f.a += 3;
      if (b.a != 7 || c.a != 8 || d.a != 6 || e.a != 6 || f.a != 9 || g.a != 6)
	__builtin_abort ();
      if (&b == &a[0] || &c == &a[1] || &d == &a[2] || &e == &a[3] || &f == &a[4] || &g == &a[5])
	__builtin_abort ();
      {
	auto&[ h, i, j, k, l, m ] (a);	// { dg-warning "decomposition declaration only available with" "" { target c++14_down } }
	if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
	  __builtin_abort ();
	j.a += 4;
	k.a += 5;
	m.a += 6;
	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)
	  __builtin_abort ();
	if (&h != &a[0] || &i != &a[1] || &j != &a[2] || &k != &a[3] || &l != &a[4] || &m != &a[5])
	  __builtin_abort ();
      }
      if (ccnt != 18 || dcnt != 24 || cccnt != 12 || tccnt != 6)
	__builtin_abort ();
    }
    if (ccnt != 18 || dcnt != 30 || cccnt != 12 || tccnt != 6)
      __builtin_abort ();
  }
  if (ccnt != 18 || dcnt != 36 || cccnt != 12 || tccnt != 6)
    __builtin_abort ();
}