blob: 5bb08cc5a1dcd703ddc006fd31b26f86517154e4 [file] [log] [blame]
// PR c++/94695
// { dg-do compile { target c++11 } }
// { dg-options "-Wrange-loop-construct" }
struct Foo { };
struct Bar {
char arr[100];
Bar(Foo);
Bar(int);
operator int();
};
template<typename T>
struct It {
T operator*();
It operator++();
bool operator!=(const It);
};
template<typename T>
struct Cont {
using I = It<T>;
I begin();
I end();
};
void
fn1 ()
{
int arr[10];
Cont<int> cont_int;
for (const double &x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const double x : arr) { (void) x; }
for (const int &x : arr) { (void) x; }
for (double &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (double x : arr) { (void) x; }
for (const int &&x : cont_int) { (void) x; }
for (const int &x : cont_int) { (void) x; }
for (const int x : cont_int) { (void) x; }
for (int&& x : cont_int) { (void) x; }
for (int x : cont_int) { (void) x; }
for (const double &&x : cont_int) { (void) x; }
for (const double &x : cont_int) { (void) x; }
for (const double x : cont_int) { (void) x; }
for (double &&x : cont_int) { (void) x; }
for (double x : cont_int) { (void) x; }
for (const Bar &&x : cont_int) { (void) x; }
for (const Bar x : cont_int) { (void) x; }
}
void
fn2 ()
{
Cont<int &> cont_int_ref;
for (const int &x : cont_int_ref) { (void) x; }
for (const int x : cont_int_ref) { (void) x; }
for (int &x : cont_int_ref) { (void) x; }
for (int x : cont_int_ref) { (void) x; }
for (const double &&x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const double &x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const double x : cont_int_ref) { (void) x; }
for (double &&x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (double x : cont_int_ref) { (void) x; }
for (const Bar &&x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar &x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar x : cont_int_ref) { (void) x; }
for (Bar &&x : cont_int_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (Bar x : cont_int_ref) { (void) x; }
}
void
fn3 ()
{
Cont<Bar> cont_bar;
for (const Bar &&x : cont_bar) { (void) x; }
for (const Bar &x : cont_bar) { (void) x; }
for (const Bar x : cont_bar) { (void) x; }
for (Bar &&x : cont_bar) { (void) x; }
for (Bar x : cont_bar) { (void) x; }
for (const int &&x : cont_bar) { (void) x; }
for (const int &x : cont_bar) { (void) x; }
for (const int x : cont_bar) { (void) x; }
for (int &&x : cont_bar) { (void) x; }
for (int x : cont_bar) { (void) x; }
}
void
fn4 ()
{
Cont<Bar &> cont_bar_ref;
for (const Bar &x : cont_bar_ref) { (void) x; }
for (Bar &x : cont_bar_ref) { (void) x; }
for (Bar x : cont_bar_ref) { (void) x; }
for (const int &&x : cont_bar_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int &x : cont_bar_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int x : cont_bar_ref) { (void) x; }
for (int &&x : cont_bar_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (int x : cont_bar_ref) { (void) x; }
}
void
fn5 ()
{
Cont<Foo> cont_foo;
for (const Bar &&x : cont_foo) { (void) x; }
for (const Bar &x : cont_foo) { (void) x; }
for (const Bar x : cont_foo) { (void) x; }
for (Bar &&x : cont_foo) { (void) x; }
for (Bar x : cont_foo) { (void) x; }
}
void
fn6 ()
{
Cont<Foo &> cont_foo_ref;
for (const Bar &&x : cont_foo_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar &x : cont_foo_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar x : cont_foo_ref) { (void) x; }
for (Bar &&x : cont_foo_ref) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (Bar x : cont_foo_ref) { (void) x; }
}
void
fn7 ()
{
double arr[2];
for (const double &x : arr) { (void) x; }
for (const double x : arr) { (void) x; }
for (double &x : arr) { (void) x; }
for (double x : arr) { (void) x; }
for (const int &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int &x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int x : arr) { (void) x; }
for (int &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (int x : arr) { (void) x; }
for (const Bar &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar &x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar x : arr) { (void) x; }
for (Bar &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (Bar x : arr) { (void) x; }
}
void
fn8 ()
{
Foo arr[2];
for (const Foo &x : arr) { (void) x; }
for (const Foo x : arr) { (void) x; }
for (Foo &x : arr) { (void) x; }
for (Foo x : arr) { (void) x; }
for (const Bar &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar &x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const Bar x : arr) { (void) x; }
for (Bar &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (Bar x : arr) { (void) x; }
}
void
fn9 ()
{
Bar arr[2] = { 1, 2 };
for (const Bar &x : arr) { (void) x; }
for (Bar &x : arr) { (void) x; }
for (Bar x : arr) { (void) x; }
for (const int &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int &x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (const int x : arr) { (void) x; }
for (int &&x : arr) { (void) x; } // { dg-warning "binds to a temporary constructed from type" }
for (int x : arr) { (void) x; }
}
template<typename T>
void
fn10 ()
{
Cont<Bar> cont_bar;
for (const Bar &x : cont_bar) { (void) x; }
Cont<T> cont_dep;
for (const T &x : cont_dep) { (void) x; }
}
template void fn10<Bar>();
struct S {
void fn()
{
Cont<Bar> cont_bar;
for (const Bar &x : cont_bar) { (void) x; }
}
};