blob: 7222f8aa1d8b20fb54b7657b4fc978837bccb8ec [file] [log] [blame]
// C++26 P1306R5 - Expansion statements
// { dg-do compile { target c++11 } }
// { dg-options "-fno-implicit-constexpr" }
struct A { int s; };
constexpr A a[] = { { 3 }, { 4 }, { 5 }, { 6 }, { 7 } };
struct B {
constexpr const A *begin () const { return &a[0]; }
constexpr const A *end () const { return &a[s]; }
int s;
};
constexpr B b = { 3 };
struct C {
C (int x) : s (x) {}
constexpr const A *begin () const { return &a[0]; }
constexpr const A *end () const { return &a[s]; }
int s;
};
struct D {
constexpr D (int x) : s (x) {}
constexpr const A *begin () const { return &a[0]; }
const A *end () const { return &a[s]; }
int s;
};
struct E {
constexpr E (int x) : s (x) {}
const A *begin () const { return &a[0]; }
constexpr const A *end () const { return &a[s]; }
int s;
};
struct F { F () : s (42) {} F (int x) : s (x) {} int s; };
F g[] = { { 3 }, { 4 }, { 5 }, { 6 }, { 7 } };
struct G {
constexpr G (int x) : s (x) {}
constexpr F *begin () const { return &g[0]; }
constexpr F *end () const { return &g[s]; }
int s;
};
struct H { int a; F b; int c; };
void
foo ()
{
B c = { 3 };
template for (constexpr auto g : c) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "'c' is not a constant expression" "" { target c++14 } .-1 }
// { dg-error "the value of 'c' is not usable in a constant expression" "" { target c++11_down } .-1 }
C d = { 3 };
template for (constexpr auto g : d) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "'d' is not a constant expression" "" { target c++14 } .-1 }
// { dg-error "call to non-'constexpr' function 'const A\\\* C::begin\\\(\\\) const'" "" { target c++11_down } .-1 }
// { dg-error "call to non-'constexpr' function 'const A\\\* C::end\\\(\\\) const'" "" { target c++11_down } .-2 }
// { dg-error "the type 'const C' of 'constexpr' variable '__for_range ' is not literal" "" { target c++11_down } .-3 }
constexpr D e = { 3 };
template for (constexpr auto g : e) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "'e' is not a constant expression" "" { target c++14 } .-1 }
// { dg-error "call to non-'constexpr' function 'const A\\\* D::end\\\(\\\) const'" "" { target *-*-* } .-1 }
constexpr E f = { 3 };
template for (constexpr auto g : f) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "'f' is not a constant expression" "" { target c++14 } .-1 }
// { dg-error "call to non-'constexpr' function 'const A\\\* E::begin\\\(\\\) const'" "" { target *-*-* } .-1 }
constexpr G h = { 3 };
template for (constexpr auto g : h) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "'h' is not a constant expression" "" { target c++14 } .-1 }
// { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target c++11_down } .-2 }
template for (constexpr auto g : { 1, 2, F { 3 }, 4L }) // { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target *-*-* } .-1 }
template for (constexpr auto g : H {})// { dg-warning "'template for' only available with" "" { target c++23_down } }
; // { dg-error "the type 'const F' of 'constexpr' variable 'g' is not literal" "" { target *-*-* } .-1 }
// { dg-error "call to non-'constexpr' function 'F::F\\\(\\\)'" "" { target *-*-* } .-2 }
}