100 lines
3.1 KiB
C++
100 lines
3.1 KiB
C++
// 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);
|
|
}
|
|
|
|
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)
|
|
;
|
|
}
|