view gcc/testsuite/g++.dg/gomp/for-21.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

// { 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);
}