blob: 68dae3f223f64eb854e8365feab0dc07339412bb [file] [log] [blame]
// P1061R10 - Structured Bindings can introduce a Pack
// { dg-do run { target c++11 } }
// { dg-options "" }
// { dg-add-options tls }
// { dg-require-effective-target tls_runtime }
struct S { int a, b, c; };
namespace std {
template <typename T> struct tuple_size;
template <int, typename> struct tuple_element;
}
struct T {
int a[3];
template <int I>
int &get () { return a[2 - I]; }
};
template <>
struct std::tuple_size<T> { static constexpr int value = 3; };
template <int N>
struct std::tuple_element<N, T> { typedef int type; };
template <int N>
inline int
foo ()
{
static int a[4] = { N, N + 1, N + 2, N + 3 };
static auto [...aa] = a; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'static' only in" "" { target c++17_down } .-2 }
aa...[1]++; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
return (... + aa); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
template <int N>
inline int
bar ()
{
static S s = { N, N + 1, N + 2 };
static auto [...sa] = s; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'static' only in" "" { target c++17_down } .-2 }
sa...[1]++; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
return (sa + ...); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
template <int N>
inline int
baz ()
{
static T t = { { N, N + 1, N + 2 } };
static auto [ta, ...tb, tc, td] = t; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'static' only in" "" { target c++17_down } .-2 }
tc++;
return ((ta + tc + td) + ... + tb); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
template <int N>
inline int
qux ()
{
thread_local int a[4] = { N, N + 1, N + 2, N + 3 };
thread_local auto [...aa] = a; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'thread_local' only in" "" { target c++17_down } .-2 }
aa...[1]++; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
return (... + aa); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
template <int N>
inline int
freddy ()
{
thread_local S s = { N, N + 1, N + 2 };
thread_local auto [...sa] = s; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'thread_local' only in" "" { target c++17_down } .-2 }
sa...[1]++; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
return (sa + ...); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
template <int N>
inline int
corge ()
{
thread_local T t = { { N, N + 1, N + 2 } };
thread_local auto [ta, ...tb, tc, td] = t; // { dg-warning "structured binding packs only available with" "" { target { c++17 && c++23_down } } }
// { dg-warning "structured bindings only available with" "" { target c++14_down } .-1 }
// { dg-warning "structured binding declaration can be 'thread_local' only in" "" { target c++17_down } .-2 }
tc++;
return ((ta + tc + td) + ... + tb); // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
}
int
main ()
{
if (foo <2> () != 15 || foo <2> () != 16 || foo <2> () != 17
|| foo <42> () != 175 || foo <42> () != 176
|| bar <5> () != 19 || bar <5> () != 20 || bar <5> () != 21
|| bar <18> () != 58 || bar <18> () != 59
|| baz <3> () != 13 || baz <3> () != 14 || baz <3> () != 15
|| baz <22> () != 70 || baz <22> () != 71)
__builtin_abort ();
if (qux <2> () != 15 || qux <2> () != 16 || qux <2> () != 17
|| qux <42> () != 175 || qux <42> () != 176
|| freddy <5> () != 19 || freddy <5> () != 20 || freddy <5> () != 21
|| freddy <18> () != 58 || freddy <18> () != 59
|| corge <3> () != 13 || corge <3> () != 14 || corge <3> () != 15
|| corge <22> () != 70 || corge <22> () != 71)
__builtin_abort ();
}