blob: f0b3921cb34f21c72a9be37f93b05c5b97cc2d5d [file] [log] [blame]
// { dg-do compile }
// { dg-options "-Wall" }
// Test for c++/68308 - [6 Regression] ICE: tree check: expected integer_cst,
// have var_decl in decompose, at tree.h:5105
typedef __typeof__ (sizeof 0) size_t;
// Not defined, only referenced in templates that aren't expected
// to be instantiated to make sure they really aren't to verify
// verify c++/68308.
template <class T> void inst_check ();
// Not instantiated (must not be diagnosed).
template <class T>
char* fn1_x () {
const size_t a = sizeof (T);
return inst_check<T>() ? new char [a] : 0;
}
// Not instantiated (must not be diagnosed).
template <size_t N>
char* fn2_1_x () {
return inst_check<char [N]>() ? new char [N] : 0;
}
template <size_t N>
char* fn2_1 () {
return new char [N];
}
// Not instantiated (must not be diagnosed).
template <size_t M, size_t N>
char* fn2_2_x () {
return inst_check<char [M][N]>() ? new char [M][N] : 0;
}
template <size_t M, size_t N>
char* fn2_2 () {
return new char [M][N]; // { dg-error "size .\[0-9\]+. of array exceeds maximum object size" }
}
// Not instantiated (must not be diagnosed).
template <class T>
T* fn3_x () {
const size_t a = sizeof (T);
return inst_check<T>() ? new T [a] : 0;
}
template <class T>
T* fn3 () {
const size_t a = sizeof (T);
return new T [a]; // { dg-error "size .\[0-9\]+. of array exceeds maximum object size" }
}
struct S { char a [__SIZE_MAX__ / 8]; };
void foo ()
{
fn2_1<1>();
fn2_1<__SIZE_MAX__ / 4>();
fn2_2<__SIZE_MAX__ / 4, 4>();
fn3<S>();
}