blob: 7560ac37ab7590a7945aec5fb5b545902e8db3b3 [file] [log] [blame]
// P1061R10 - Structured Bindings can introduce a Pack
// { dg-do compile { target c++11 } }
// { dg-options "-fno-implicit-constexpr" }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1a:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1b:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1c:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1a_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1b_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1c_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivEDC1a1b1cE:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1a_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1b_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1AEivE1c_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1a:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1c:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1a_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1c_0:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivEDC1a1b1cE:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1a_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b_2:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b_3:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1c_1:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1a_2:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1b_4:" } }
// { dg-final { scan-assembler "_ZZ3fooI1BEivE1c_2:" } }
template <typename T>
int
foo ()
{
static int a = 1, b = 2, c = 3;
int d = a++ + b++ + c++;
{
static int a = 1, b = 2, c = 3;
d += a++ + b++ + c++;
{
static auto [a, ...b, c] = 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 }
d += a++ + b...[0]++ + c++; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
{
static int a = 1, b = 2, c = 3;
return d + a++ + b++ + c++;
}
}
}
}
struct A { int a, b, c, d, e; };
void
bar ()
{
foo <A> ();
}
namespace std {
template<typename T> struct tuple_size;
template<int, typename> struct tuple_element;
}
struct B {
int a[5];
template <int I> int &get () { return a[I]; }
};
template<> struct std::tuple_size<B> { static const int value = 5; };
template<int I> struct std::tuple_element<I,B> { using type = int; };
void
baz ()
{
foo <B> ();
}