blob: 548f9af0503f137080aa8f6da21998d41f65f413 [file] [log] [blame]
// P1061R10 - Structured Bindings can introduce a Pack
// { dg-do run { target c++11 } }
// { dg-options "" }
int
sum ()
{
return 0;
}
template <typename T, typename ...A>
T
sum (T x, A... y)
{
return x + sum (y...);
}
template <typename T>
T
square (T x)
{
return x * x;
}
template <typename T, typename U>
struct same_type { static const bool value = false; };
template <typename T>
struct same_type<T, T> { static const bool value = true; };
typedef int V __attribute__((vector_size (16 * sizeof (int))));
template <int N>
void
foo ()
{
V v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
auto [...va] = v; // { 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 }
static_assert (sizeof... (va) == 16, "");
static_assert (same_type <decltype (va...[5]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (va...[13]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [vb, ...vc, vd, ve] = v; // { 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 }
static_assert (sizeof... (vc) == 13, "");
static_assert (same_type <decltype (vb), int>::value, "");
static_assert (same_type <decltype (vc...[0]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vc...[12]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vd), int>::value, "");
static_assert (same_type <decltype (ve), int>::value, "");
auto [vf, vg, vh, vi, ...vj] = v; // { 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 }
static_assert (sizeof... (vj) == 12, "");
static_assert (same_type <decltype (vf), int>::value, "");
static_assert (same_type <decltype (vg), int>::value, "");
static_assert (same_type <decltype (vh), int>::value, "");
static_assert (same_type <decltype (vi), int>::value, "");
static_assert (same_type <decltype (vj...[2]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vj...[10]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
if (va...[13] != 14 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (va...) != 8 * 17
|| sum (square (va)...) != 1496
|| vb != 1
|| vc...[10] != 12 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (vc...) != 15 * 7 - 1
|| sum <decltype (vc)...> (vc...) != 15 * 7 - 1
|| vd != 15 || ve != 16
|| vf != 1 || vg != 2 || vh != 3 || vi != 4
|| sum (vj...) != 8 * 17 - 10
|| (va + ...) != 8 * 17 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (... + vc) != 15 * 7 - 1 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (0 + ... + vj) != 8 * 17 - 10) // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
__builtin_abort ();
V v2[3] = { v, v + 1, v + 2 };
int i = 0;
for (auto [vk, ...vl, vm] : v2) // { 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 }
static_assert (sizeof... (vl) == 14, "");
static_assert (same_type <decltype (vk), int>::value, "");
static_assert (same_type <decltype (vl...[1]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vl...[9]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vm), int>::value, "");
if (vk != i + 1 || sum (vl...) != i * 14 + 15 * 8 - 1 || vm != i + 16)
__builtin_abort ();
++i;
}
_Complex double c = 1.0 + 2.0i;
auto [...ca] = c; // { 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 }
static_assert (sizeof... (ca) == 2, "");
static_assert (same_type <decltype (ca...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ca...[1]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [cb, ...cc, cd] = c; // { 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 }
static_assert (sizeof... (cc) == 0, "");
static_assert (same_type <decltype (cb), double>::value, "");
static_assert (same_type <decltype (cd), double>::value, "");
auto [ce, ...cf] = c; // { 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 }
static_assert (sizeof... (cf) == 1, "");
static_assert (same_type <decltype (ce), double>::value, "");
static_assert (same_type <decltype (cf...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [...cg, ch] = c; // { 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 }
static_assert (sizeof... (cg) == 1, "");
static_assert (same_type <decltype (cg...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ch), double>::value, "");
if (ca...[0] != 1.0 || ca...[1] != 2.0// { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (ca...) != 3.0
|| sum <decltype (ca)...> (ca...) != 3.0
|| sum (square (square (square (ca)))...) != 257.0
|| cb != 1.0 || cd != 2.0
|| ce != 1.0 || cf...[0] != 2.0 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (cf...) != 2.0
|| cg...[0] != 1.0 || ch != 2.0 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (cg...) != 1.0
|| (ca + ...) != 3.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (0.0 + ... + cc) != 0.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (... + cf) != 2.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (cg + ... + 0.0) != 1.0) // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
__builtin_abort ();
_Complex float c2[3] = { 1.0f + 2.0fi, 2.0f + 3.0fi, 3.0f + 4.0fi };
i = 0;
for (auto [...ci] : c2) // { 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 }
static_assert (sizeof... (ci) == 2, "");
static_assert (same_type <decltype (ci...[0]), float>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ci...[1]), float>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
if (sum (ci...) != i * 2 + 3.0f)
__builtin_abort ();
++i;
}
}
template <typename V, typename C, typename D>
void
bar ()
{
V v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
auto [...va] = v; // { 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 }
static_assert (sizeof... (va) == 16, "");
static_assert (same_type <decltype (va...[5]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (va...[13]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [vb, ...vc, vd, ve] = v; // { 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 }
static_assert (sizeof... (vc) == 13, "");
static_assert (same_type <decltype (vb), int>::value, "");
static_assert (same_type <decltype (vc...[0]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vc...[12]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vd), int>::value, "");
static_assert (same_type <decltype (ve), int>::value, "");
auto [vf, vg, vh, vi, ...vj] = v; // { 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 }
static_assert (sizeof... (vj) == 12, "");
static_assert (same_type <decltype (vf), int>::value, "");
static_assert (same_type <decltype (vg), int>::value, "");
static_assert (same_type <decltype (vh), int>::value, "");
static_assert (same_type <decltype (vi), int>::value, "");
static_assert (same_type <decltype (vj...[2]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vj...[10]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
if (va...[13] != 14 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (va...) != 8 * 17
|| vb != 1
|| vc...[10] != 12 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (vc...) != 15 * 7 - 1
|| sum <decltype (vc)...> (vc...) != 15 * 7 - 1
|| vd != 15 || ve != 16
|| vf != 1 || vg != 2 || vh != 3 || vi != 4
|| sum (vj...) != 8 * 17 - 10
|| (va + ...) != 8 * 17 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (... + vc) != 15 * 7 - 1 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (0 + ... + vj) != 8 * 17 - 10) // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
__builtin_abort ();
V v2[3] = { v, v + 1, v + 2 };
int i = 0;
for (auto [vk, ...vl, vm] : v2) // { 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 }
static_assert (sizeof... (vl) == 14, "");
static_assert (same_type <decltype (vk), int>::value, "");
static_assert (same_type <decltype (vl...[1]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vl...[9]), int>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (vm), int>::value, "");
if (vk != i + 1 || sum (vl...) != i * 14 + 15 * 8 - 1 || vm != i + 16)
__builtin_abort ();
++i;
}
C c = 1.0 + 2.0i;
auto [...ca] = c; // { 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 }
static_assert (sizeof... (ca) == 2, "");
static_assert (same_type <decltype (ca...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ca...[1]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [cb, ...cc, cd] = c; // { 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 }
static_assert (sizeof... (cc) == 0, "");
static_assert (same_type <decltype (cb), double>::value, "");
static_assert (same_type <decltype (cd), double>::value, "");
auto [ce, ...cf] = c; // { 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 }
static_assert (sizeof... (cf) == 1, "");
static_assert (same_type <decltype (ce), double>::value, "");
static_assert (same_type <decltype (cf...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
auto [...cg, ch] = c; // { 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 }
static_assert (sizeof... (cg) == 1, "");
static_assert (same_type <decltype (cg...[0]), double>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ch), double>::value, "");
if (ca...[0] != 1.0 || ca...[1] != 2.0// { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (ca...) != 3.0
|| sum <decltype (ca)...> (ca...) != 3.0
|| cb != 1.0 || cd != 2.0
|| ce != 1.0 || cf...[0] != 2.0 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (cf...) != 2.0
|| cg...[0] != 1.0 || ch != 2.0 // { dg-warning "pack indexing only available with" "" { target c++23_down } }
|| sum (cg...) != 1.0
|| (ca + ...) != 3.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (0.0 + ... + cc) != 0.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (... + cf) != 2.0 // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
|| (cg + ... + 0.0) != 1.0) // { dg-warning "fold-expressions only available with" "" { target c++14_down } }
__builtin_abort ();
D c2[3] = { 1.0f + 2.0fi, 2.0f + 3.0fi, 3.0f + 4.0fi };
i = 0;
for (auto [...ci] : c2) // { 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 }
static_assert (sizeof... (ci) == 2, "");
static_assert (same_type <decltype (ci...[0]), float>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
static_assert (same_type <decltype (ci...[1]), float>::value, ""); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
if (sum (ci...) != i * 2 + 3.0f)
__builtin_abort ();
++i;
}
}
int
main ()
{
foo <0> ();
bar <V, _Complex double, _Complex float> ();
}