llvm-project/clang/test/OpenMP/split_messages.cpp
Amit Tiwari 1972cf64fd
[Clang][OpenMP] Implement Loop splitting #pragma omp split directive (#183261)
OpenMP 6.0 Loop-splitting directive `#pragma omp split` construct with `counts`
clause
2026-04-03 10:42:31 +05:30

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