blob: fbdaa71619a611144dcb7f9133bd1007ad7a59a8 [file] [log] [blame]
// { dg-do compile { target c++17 } }
void
f1 (int a[10][10])
{
#pragma omp for collapse (2)
for (int i = 0; i < 10; ++i)
for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
void
f2 (int (&a)[10])
{
#pragma omp for collapse (2)
for (auto i : a)
for (int j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
struct S { int a, b, c; };
void
f3 (S (&a)[10])
{
#pragma omp for collapse (2)
for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .+1 }
for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" }
; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-1 }
}
template <int N>
void
f4 (int a[10][10])
{
#pragma omp for collapse (2)
for (int i = 0; i < 10; ++i)
for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
template <int N>
void
f5 (int (&a)[10])
{
#pragma omp for collapse (2)
for (auto i : a)
for (int j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
template <int N>
void
f6 (S (&a)[10])
{
#pragma omp for collapse (2)
for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 }
for (int l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" }
; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 }
}
template <typename T>
void
f7 (T a[10][10])
{
#pragma omp for collapse (2)
for (T i = 0; i < 10; ++i)
for (auto j : a[i]) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
template <typename T>
void
f8 (T (&a)[10])
{
#pragma omp for collapse (2)
for (auto i : a)
for (T j = i * 2; j < i * 4; j++) // { dg-error "initializer expression refers to iteration variable 'i'" }
;
}
template <typename T, typename U>
void
f9 (U (&a)[10])
{
#pragma omp for collapse (2)
for (auto [i, j, k] : a) // { dg-error "use of 'i' before deduction of 'auto'" "" { target *-*-* } .-1 }
for (T l = i; l < j; l += k) // { dg-error "use of 'j' before deduction of 'auto'" }
; // { dg-error "use of 'k' before deduction of 'auto'" "" { target *-*-* } .-3 }
}
void
test ()
{
int a[10][10] {};
int b[10] {};
S c[10] {};
f4 <0> (a);
f5 <0> (b);
f6 <0> (c);
f7 (a);
f8 (b);
f9 <int, S> (c);
}