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