1 // PR c++/83205
2 // { dg-do compile { target c++11 } }
3 // { dg-options "" }
4 
5 struct A { int i; };
6 struct B { int i; };
7 namespace std {
8   template <typename T> struct tuple_size;
9   template <> struct tuple_size<A> {
10     static constexpr int value = -1;
11   };
12 #ifdef __SIZEOF_INT128__
13   template <> struct tuple_size<B> {
14     static constexpr unsigned __int128 value = -1;
15   };
16 #endif
17 }
18 
19 auto [a] = A{};	// { dg-error "1 name provided" }
20 		// { dg-message "while 'A' decomposes into -1 elements" "" { target *-*-* } .-1 }
21 		// { dg-warning "structured bindings only available with" "" { target c++14_down } .-2 }
22 #ifdef __SIZEOF_INT128__
23 auto [b] = B{};	// { dg-error "1 name provided" "" { target int128 } }
24 		// { dg-message "while 'B' decomposes into \[0-9xa-fXA-F]* elements" "" { target int128 } .-1 }
25 		// { dg-warning "structured bindings only available with" "" { target { c++14_down && int128 } } .-2 }
26 auto [c, d] = B{};	// { dg-error "2 names provided" "" { target int128 } }
27 			// { dg-message "while 'B' decomposes into \[0-9xa-fXA-F]* elements" "" { target int128 } .-1 }
28 			// { dg-warning "structured bindings only available with" "" { target { c++14_down && int128 } } .-2 }
29 #endif
30 auto [e, f, g] = A{};	// { dg-error "3 names provided" }
31 			// { dg-message "while 'A' decomposes into -1 elements" "" { target *-*-* } .-1 }
32 			// { dg-warning "structured bindings only available with" "" { target c++14_down } .-2 }
33