blob: 736911bab538f84ac28e63eb6ce6becd56b3e03e [file]
// { dg-do compile { target c++11 } }
namespace std {
template <typename T> struct tuple_size;
template <int, typename> struct tuple_element;
}
struct A { int a, b, c, d, e; };
struct B {};
struct C { int a, b; };
struct D { int a, b, c; static int d; };
struct E { int a : 1; int : 0; int : 2; int b : 1; int c : 3; int d : 4; };
typedef float V [[gnu::vector_size (16 * sizeof (float))]];
template <>
struct std::tuple_size <C> { static constexpr int value = 42; };
static_assert (__builtin_structured_binding_size (const A) == 5, "");
static_assert (__is_same_as (decltype (__builtin_structured_binding_size (A)), decltype (sizeof (int))), "");
static_assert (__builtin_structured_binding_size (B) == 0, "");
static_assert (__builtin_structured_binding_size (C) == 42, "");
static_assert (__builtin_structured_binding_size (A[17]) == 17, "");
static_assert (__builtin_structured_binding_size (C[6]) == 6, "");
static_assert (__builtin_structured_binding_size (volatile _Complex double) == 2, "");
static_assert (__builtin_structured_binding_size (V) == 16, "");
static_assert (__builtin_structured_binding_size (float [[gnu::vector_size (8 * sizeof (float))]]) == 8, "");
static_assert (__builtin_structured_binding_size (D) == 3, "");
static_assert (__builtin_structured_binding_size (E) == 4, "");
struct F {
static short f[42];
static_assert (__builtin_structured_binding_size (decltype (f)) == 42, "");
};
template <typename A, typename B, typename C, typename D,
typename E, typename F, typename G, typename H,
typename I, typename J>
void
foo ()
{
static_assert (__builtin_structured_binding_size (const A) == 5, "");
static_assert (__builtin_structured_binding_size (B) == 0, "");
static_assert (__builtin_structured_binding_size (C) == 42, "");
static_assert (__builtin_structured_binding_size (D) == 17, "");
static_assert (__builtin_structured_binding_size (E) == 6, "");
static_assert (__builtin_structured_binding_size (F) == 2, "");
static_assert (__builtin_structured_binding_size (volatile G) == 16, "");
static_assert (__builtin_structured_binding_size (H) == 8, "");
static_assert (__builtin_structured_binding_size (I) == 3, "");
static_assert (__builtin_structured_binding_size (J) == 4, "");
}
void
bar ()
{
foo <A, B, C, A[17], C[6], _Complex double, V, float [[gnu::vector_size (8 * sizeof (float))]], D, E> ();
}