blob: ffdbe070d9a4c23e589355a931941c28dc7cdaae [file] [log] [blame]
// C++26 P1306R5 - Expansion statements
// { dg-do run { target c++11 } }
// { dg-options "" }
struct S { int s; };
constexpr S c[] = { { 3 }, { 4 }, { 5 }, { 6 }, { 7 } };
struct U {
constexpr const S *begin () const { return &c[0]; }
constexpr const S *end () const { return &c[s]; }
int s;
};
constexpr U u1 = { 3 }, u2 = { 0 };
struct V {
constexpr V () : a (1), b (2), c (3.0) {}
constexpr int foo () const { return a; }
constexpr unsigned long bar () const { return b; }
constexpr double baz () const { return c; }
int a;
unsigned long b;
double c;
};
long long
foo ()
{
long long r = 0;
template for (constexpr auto h = 2; constexpr auto g : u1) // { dg-warning "'template for' only available with" "" { target c++23_down } }
{
constexpr auto i = g.s + h;
r += i;
}
template for (constexpr auto h = 42; constexpr auto g : u2) // { dg-warning "'template for' only available with" "" { target c++23_down } }
{
constexpr auto i = g.s + h;
__builtin_abort ();
}
return r;
}
long long
bar ()
{
long long r = 0;
template for (constexpr S a { 42 }; constexpr auto b : { S { 1 }, S { 3 }, S { 5 } }) // { dg-warning "'template for' only available with" "" { target c++23_down } }
{
constexpr auto c = a.s + b.s;
r += c;
}
return r;
}
constexpr V v;
long long
baz ()
{
long long r = 0;
template for (constexpr auto x = 5; constexpr auto y : v) // { dg-warning "'template for' only available with" "" { target c++23_down } }
{
constexpr auto z = x + y;
r += z;
}
return r;
}
int
main ()
{
if (foo () != 18)
__builtin_abort ();
if (bar () != 135)
__builtin_abort ();
if (baz () != 21)
__builtin_abort ();
}