| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=51 -fsyntax-only -Wuninitialized -verify %s |
| |
| void func(int n) { |
| // expected-error@+2 {{statement after '#pragma omp unroll' must be a for loop}} |
| #pragma omp unroll |
| func(n); |
| |
| // expected-error@+2 {{statement after '#pragma omp unroll' must be a for loop}} |
| #pragma omp unroll |
| ; |
| |
| // expected-error@+2 {{the loop condition expression depends on the current loop control variable}} |
| #pragma omp unroll |
| for (int i = 0; i < 2*(i-4); ++i) {} |
| |
| // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} |
| #pragma omp unroll |
| for (int i = 0; i/3 < 7; ++i) {} |
| |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp unroll' are ignored}} |
| #pragma omp unroll foo |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp unroll partial( |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp unroll partial(4 |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp unroll partial(4+ |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp unroll partial(for) |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{integral constant expression must have integral or unscoped enumeration type, not 'void (int)'}} |
| #pragma omp unroll partial(func) |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected expression}} |
| #pragma omp unroll partial() |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp unroll partial(4,4) |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+3 {{expression is not an integral constant expression}} expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}} |
| // expected-note@+1 {{declared here}} |
| int a; |
| #pragma omp unroll partial(a) |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{argument to 'partial' clause must be a strictly positive integer value}} |
| #pragma omp unroll partial(0) |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{directive '#pragma omp unroll' cannot contain more than one 'partial' clause}} |
| #pragma omp unroll partial partial |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{directive '#pragma omp unroll' cannot contain more than one 'partial' clause}} |
| #pragma omp unroll partial(4) partial |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{directive '#pragma omp unroll' cannot contain more than one 'full' clause}} |
| #pragma omp unroll full full |
| for (int i = 0; i < 128; ++i) {} |
| |
| // expected-error@+1 {{'full' and 'partial' clause are mutually exclusive and may not appear on the same directive}} expected-note@+1 {{'partial' clause is specified here}} |
| #pragma omp unroll partial full |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+1 {{'partial' and 'full' clause are mutually exclusive and may not appear on the same directive}} expected-note@+1 {{'full' clause is specified here}} |
| #pragma omp unroll full partial |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+2 {{loop to be fully unrolled must have a constant trip count}} expected-note@+1 {{'#pragma omp unroll full' directive found here}} |
| #pragma omp unroll full |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+2 {{statement after '#pragma omp for' must be a for loop}} |
| #pragma omp for |
| #pragma omp unroll |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+2 {{statement after '#pragma omp for' must be a for loop}} |
| #pragma omp for |
| #pragma omp unroll full |
| for (int i = 0; i < 128; ++i) {} |
| |
| // expected-error@+2 {{statement after '#pragma omp unroll' must be a for loop}} |
| #pragma omp unroll |
| #pragma omp unroll |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+2 {{statement after '#pragma omp tile' must be a for loop}} |
| #pragma omp tile sizes(4) |
| #pragma omp unroll |
| for (int i = 0; i < n; ++i) {} |
| |
| // expected-error@+4 {{expected 2 for loops after '#pragma omp for', but found only 1}} |
| // expected-note@+1 {{as specified in 'collapse' clause}} |
| #pragma omp for collapse(2) |
| for (int i = 0; i < n; ++i) { |
| #pragma omp unroll full |
| for (int j = 0; j < 128; ++j) {} |
| } |
| } |
| |
| |
| template<typename T, int Factor> |
| void templated_func(int n) { |
| // expected-error@+1 {{argument to 'partial' clause must be a strictly positive integer value}} |
| #pragma omp unroll partial(Factor) |
| for (T i = 0; i < n; ++i) {} |
| |
| // expected-error@+2 {{loop to be fully unrolled must have a constant trip count}} expected-note@+1 {{'#pragma omp unroll full' directive found here}} |
| #pragma omp unroll full |
| for (int i = 0; i < n; i-=Factor) {} |
| } |
| |
| void template_inst(int n) { |
| // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int, -1>' requested here}} |
| templated_func<int, -1>(n); |
| } |