| // OpenMP split / counts: parse and semantic diagnostics. |
| // |
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=60 -fsyntax-only -verify %s |
| |
| void body(int); |
| |
| void parse_and_clause_errors() { |
| |
| // Malformed `counts` — missing '(' |
| // expected-error@+1 {{expected '('}} |
| #pragma omp split counts |
| ; |
| |
| // Empty `counts` list |
| // expected-error@+1 {{expected expression}} |
| #pragma omp split counts() |
| ; |
| |
| // Truncated list / missing ')' |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp split counts(3 |
| for (int i = 0; i < 7; ++i) |
| ; |
| |
| // Trailing comma only |
| // expected-error@+1 {{expected expression}} |
| #pragma omp split counts(3,) |
| ; |
| |
| // Expression after comma missing |
| // expected-error@+2 {{expected expression}} |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp split counts(3, |
| ; |
| |
| // Incomplete arithmetic in count (like `tile_messages` sizes(5+)) |
| // expected-error@+2 {{expected expression}} |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp split counts(5+ |
| ; |
| |
| // `for` keyword not a constant-expression operand |
| // expected-error@+1 {{expected expression}} |
| #pragma omp split counts(for) |
| ; |
| |
| // Duplicate `counts` clauses |
| // expected-error@+1 {{directive '#pragma omp split' cannot contain more than one 'counts' clause}} |
| #pragma omp split counts(2, omp_fill) counts(3, omp_fill) |
| for (int i = 0; i < 7; ++i) |
| ; |
| |
| // Disallowed extra clause |
| // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp split'}} |
| #pragma omp split counts(2, omp_fill) collapse(2) |
| for (int i = 0; i < 7; ++i) |
| ; |
| |
| // Non-relational loop condition (canonical loop check) |
| #pragma omp split counts(omp_fill) |
| // expected-error@+1 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}} |
| for (int i = 0; i / 3 < 7; ++i) |
| ; |
| |
| // More than one `omp_fill` |
| // expected-error@+1 {{exactly one 'omp_fill' must appear in the 'counts' clause}} |
| #pragma omp split counts(omp_fill, omp_fill) |
| for (int i = 0; i < 10; ++i) |
| body(i); |
| |
| // No `omp_fill` at all — also triggers "exactly one" diagnostic. |
| // expected-error@+1 {{exactly one 'omp_fill' must appear in the 'counts' clause}} |
| #pragma omp split counts(2, 3) |
| for (int i = 0; i < 10; ++i) |
| body(i); |
| |
| // Positive: `omp_fill` may appear at any position in `counts` (not required to be last). |
| #pragma omp split counts(omp_fill, 2) |
| for (int i = 0; i < 10; ++i) |
| body(i); |
| |
| // OpenMP 6.0: non-`omp_fill` list items must be integral constant expressions. |
| { |
| int v = 3; // expected-note {{declared here}} |
| #pragma omp split counts(v, omp_fill) // expected-error {{expression is not an integral constant expression}} \ |
| // expected-note {{read of non-const variable 'v' is not allowed in a constant expression}} |
| for (int i = 0; i < 10; ++i) |
| body(i); |
| } |
| } |
| |
| void associated_statement_diagnostics() { |
| { |
| // expected-error@+2 {{expected statement}} |
| #pragma omp split counts(omp_fill) |
| } |
| |
| // Not a `for` loop (contrast `split_diag_errors.c` / `while`) |
| // expected-error@+2 {{statement after '#pragma omp split' must be a for loop}} |
| #pragma omp split counts(omp_fill) |
| int b = 0; |
| |
| // expected-warning@+2 {{extra tokens at the end of '#pragma omp split' are ignored}} |
| // expected-error@+1 {{directive '#pragma omp split' requires the 'counts' clause}} |
| #pragma omp split foo |
| for (int i = 0; i < 7; ++i) |
| ; |
| } |