1 // { dg-do compile }
2 // { dg-options "-std=c++17" }
3 
4 struct A { bool a, b; };
5 struct B { int a, b; };
6 
7 void
foo()8 foo ()
9 {
10   auto [ a, b ] = A ();
11   for (; auto [ a, b ] = A (); )			// { dg-error "expected" }
12     ;
13   for (; false; auto [ a, b ] = A ())			// { dg-error "expected" }
14     ;
15   if (auto [ a, b ] = A ())				// { dg-error "expected" }
16     ;
17   if (auto [ a, b ] = A (); auto [ c, d ] = A ())	// { dg-error "expected" }
18     ;
19   if (int d = 5; auto [ a, b ] = A ())			// { dg-error "expected" }
20     ;
21   switch (auto [ a, b ] = B ())				// { dg-error "expected" }
22     {
23     case 2:
24       break;
25     }
26   switch (int d = 5; auto [ a, b ] = B ())		// { dg-error "expected" }
27     {
28     case 2:
29       break;
30     }
31   A e = A ();
32   auto && [ c, d ] = e;
33   auto [ i, j ] = A (), [ k, l ] = A ();		// { dg-error "expected" }
34   auto m = A (), [ n, o ] = A ();			// { dg-error "expected" }
35 }
36 
37 template <typename T>
38 auto [ a, b ] = A ();					// { dg-error "expected" }
39 
40 struct C
41 {
42   auto [ e, f ] = A ();					// { dg-error "expected" }
43   mutable auto [ g, h ] = A ();				// { dg-error "expected" }
44   virtual auto [ i, j ] = A ();				// { dg-error "expected" }
45   explicit auto [ k, l ] = A ();			// { dg-error "expected" }
46   friend auto [ m, n ] = A ();				// { dg-error "expected" }
47 };
48