[OpenMP] Add directive spellings introduced in OpenMP 6.0 (#141772)

For background information see

https://discourse.llvm.org/t/rfc-alternative-spellings-of-openmp-directives/85507
This commit is contained in:
Krzysztof Parzyszek
2025-06-25 07:55:06 -05:00
committed by GitHub
parent 006037675c
commit d7b936b633
8 changed files with 274 additions and 104 deletions

View File

@@ -1,12 +1,12 @@
// RUN: %clang_cc1 -verify=omp50,expected -fopenmp -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
// RUN: %clang_cc1 -verify=omp51,expected -fopenmp -ferror-limit 100 %s
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
// RUN: %clang_cc1 -verify=expected,omp60 -fopenmp -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
// RUN: %clang_cc1 -verify=omp50,omp5x,expected -fopenmp -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
// RUN: %clang_cc1 -verify=omp51,omp5x,expected -fopenmp -ferror-limit 100 %s
// RUN: %clang_cc1 -verify=expected,omp52,omp5x -fopenmp -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
// RUN: %clang_cc1 -verify=expected,omp60,omp60-maybe-simd -fopenmp -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
// RUN: %clang_cc1 -verify=omp50,expected -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
// RUN: %clang_cc1 -verify=omp51-simd,expected -fopenmp-simd -ferror-limit 100 %s
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
// RUN: %clang_cc1 -verify=expected,omp60-simd -fopenmp-simd -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
// RUN: %clang_cc1 -verify=omp50,omp5x,expected -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
// RUN: %clang_cc1 -verify=omp51-simd,omp5x,expected -fopenmp-simd -ferror-limit 100 %s
// RUN: %clang_cc1 -verify=expected,omp52,omp5x -fopenmp-simd -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
// RUN: %clang_cc1 -verify=expected,omp60-simd,omp60-maybe-simd -fopenmp-simd -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
int temp; // expected-note {{'temp' declared here}}
@@ -16,17 +16,38 @@ struct vec { // expec
double *data;
};
#pragma omp declare mapper // expected-error {{expected '(' after 'declare mapper'}}
#pragma omp declare mapper { // expected-error {{expected '(' after 'declare mapper'}}
#pragma omp declare mapper( // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(# // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(struct v // expected-error {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(struct vec // expected-error {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(S v // expected-error {{unknown type name 'S'}}
#pragma omp declare mapper(struct vec v // expected-error {{expected ')'}} expected-note {{to match this '('}}
#pragma omp declare mapper(aa:struct vec v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}}
#pragma omp declare mapper(bb:struct vec v) private(v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}} // expected-error {{unexpected OpenMP clause 'private' in directive '#pragma omp declare mapper'}}
#pragma omp declare mapper(cc:struct vec v) map(v) ( // expected-warning {{extra tokens at the end of '#pragma omp declare mapper' are ignored}}
// omp60-maybe-simd-error@+2 {{expected '(' after 'declare_mapper'}}
// omp5x-error@+1 {{expected '(' after 'declare mapper'}}
#pragma omp declare mapper
// omp60-maybe-simd-error@+2 {{expected '(' after 'declare_mapper'}}
// omp5x-error@+1 {{expected '(' after 'declare mapper'}}
#pragma omp declare mapper {
// expected-error@+2 {{expected a type}}
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(
// expected-error@+2 {{expected a type}}
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(#
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(struct v
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
#pragma omp declare mapper(struct vec
// expected-error@+1 {{unknown type name 'S'}}
#pragma omp declare mapper(S v
// expected-error@+2 {{expected ')'}}
// expected-note@+1 {{to match this '('}}
#pragma omp declare mapper(struct vec v
// omp60-maybe-simd-error@+2 {{expected at least one clause on '#pragma omp declare_mapper' directive}}
// omp5x-error@+1 {{expected at least one clause on '#pragma omp declare mapper' directive}}
#pragma omp declare mapper(aa:struct vec v)
// omp60-maybe-simd-error@+4 {{expected at least one clause on '#pragma omp declare_mapper' directive}}
// omp60-maybe-simd-error@+3 {{unexpected OpenMP clause 'private' in directive '#pragma omp declare_mapper'}}
// omp5x-error@+2 {{expected at least one clause on '#pragma omp declare mapper' directive}}
// omp5x-error@+1 {{unexpected OpenMP clause 'private' in directive '#pragma omp declare mapper'}}
#pragma omp declare mapper(bb:struct vec v) private(v)
// omp60-maybe-simd-warning@+2 {{extra tokens at the end of '#pragma omp declare_mapper' are ignored}}
// omp5x-warning@+1 {{extra tokens at the end of '#pragma omp declare mapper' are ignored}}
#pragma omp declare mapper(cc:struct vec v) map(v) (
#pragma omp declare mapper(++: struct vec v) map(v.len) // expected-error {{illegal OpenMP user-defined mapper identifier}}
#pragma omp declare mapper(id1: struct vec v) map(v.len, temp) // expected-error {{only variable 'v' is allowed in map clauses of this 'omp declare mapper' directive}}
@@ -58,7 +79,9 @@ int fun(int arg) {
#pragma omp declare mapper(id: struct vec v) map(v.len) // expected-note {{previous definition is here}}
#pragma omp declare mapper(id: struct vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'struct vec' with name 'id'}}
{
#pragma omp declare mapper(id: struct vec v) map(v.len) allocate(v) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare mapper'}}
// omp60-maybe-simd-error@+2 {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare_mapper'}}
// omp5x-error@+1 {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare mapper'}}
#pragma omp declare mapper(id: struct vec v) map(v.len) allocate(v)
struct vec vv, v1;
struct vec arr[10];
double d;

View File

@@ -11,14 +11,14 @@
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause,omp45-to-51-clause %{openmp45} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51,dev5 %{openmp50} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -fopenmp-is-target-device %{target_mac} %{aux_triple} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host5,host-5-and-51,no-host5-and-51 %{openmp50_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60_simd} -fopenmp-is-target-device %{target_mac} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp45,omp45-to-51,omp45-to-51-var,omp45-to-51-clause -fopenmp-version=45 -fopenmp-simd %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
@@ -26,12 +26,12 @@
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -I%S/Inputs -DTESTENDINC=1 -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp-simd %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp52} -DVERBOSE_MODE=1 %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} -DVERBOSE_MODE=1 %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp5,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 %{openmp50} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp51,ompvar,omp45-to-51,omp5-and-51,omp5-or-later,omp5-or-later-var,omp45-to-51-var,omp45-to-51-clause,host-5-and-51,no-host5-and-51 -fopenmp %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp52,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s
// RUN: %clang_cc1 %{common_opts_mac} -verify=expected,omp60,omp52-or-later,ompvar,omp5-or-later,omp5-or-later-var %{openmp60} %{limit} -o - %s
#pragma omp begin declare target
static int gg;
@@ -39,7 +39,9 @@ static int gg;
int recursive = recursive ^ 3 + gg;
#pragma omp end declare target
// expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target
// ompvar-error@+1 {{variable captured in declare target region must appear in a to clause}}
@@ -47,14 +49,20 @@ int a, b, z;
// expected-note@+1 {{defined as threadprivate or thread local}}
__thread int t;
// expected-error@+1 {{expected '(' after 'declare target'}}
// omp60-error@+3 {{expected '(' after 'declare_target'}}
// omp52-error@+2 {{expected '(' after 'declare target'}}
// omp45-to-51-error@+1 {{expected '(' after 'declare target'}}
#pragma omp declare target .
#pragma omp declare target
void f();
// expected-warning@+1 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
// omp60-warning@+3 {{extra tokens at the end of '#pragma omp end declare_target' are ignored}}
// omp52-warning@+2 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
// omp45-to-51-warning@+1 {{extra tokens at the end of '#pragma omp end declare target' are ignored}}
#pragma omp end declare target shared(a)
// omp60-error@+10 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp60-error@+9 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+8 {{unexpected 'map' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp52-error@+7 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp51-error@+6 {{unexpected 'map' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
@@ -65,6 +73,8 @@ void f();
// omp45-error@+1 {{expected at least one 'to' or 'link' clause}}
#pragma omp declare target map(a)
// omp60-error@+5 {{unexpected 'to' clause, use 'enter' instead}}
// omp60-error@+4 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-to-51-error@+1 {{use of undeclared identifier 'foo1'}}
@@ -73,6 +83,8 @@ void f();
// expected-error@+1 {{use of undeclared identifier 'foo2'}}
#pragma omp declare target link(foo2)
// omp60-error@+6 {{unexpected 'to' clause, use 'enter' instead}}
// omp60-error@+5 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// dev5-note@+2 {{marked as 'device_type(host)' here}}
@@ -80,8 +92,8 @@ void f();
#pragma omp declare target to(f) device_type(host)
void q();
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp5-and-51-warning@+2 {{more than one 'device_type' clause is specified}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(q) device_type(any) device_type(any) device_type(host)
@@ -121,7 +133,7 @@ void c();
// expected-note@+1 {{'func' defined here}}
void func() {}
// omp52-error@+5 {{unexpected 'allocate' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp52-or-later-error@+5 {{unexpected 'allocate' clause, only 'enter', 'link', 'device_type' or 'indirect' clauses expected}}
// omp51-error@+4 {{unexpected 'allocate' clause, only 'to', 'link', 'device_type' or 'indirect' clauses expected}}
// omp5-error@+3 {{unexpected 'allocate' clause, only 'to', 'link' or 'device_type' clauses expected}}
// expected-error@+2 {{function name is not allowed in 'link' clause}}
@@ -171,7 +183,9 @@ void t2() {
void abc();
#pragma omp end declare target
void cba();
// expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target
#pragma omp declare target
@@ -234,7 +248,9 @@ void foo1() {
#pragma omp end declare target
#pragma omp end declare target
// expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target
int C::method() {
@@ -255,18 +271,22 @@ int *y;
int **w = &y;
int main (int argc, char **argv) {
int a = 2;
// expected-error@+1 {{unexpected OpenMP directive '#pragma omp declare target'}}
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp declare target'}}
#pragma omp declare target
int v;
// expected-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp60-error@+3 {{unexpected OpenMP directive '#pragma omp end declare_target'}}
// omp52-error@+2 {{unexpected OpenMP directive '#pragma omp end declare target'}}
// omp45-to-51-error@+1 {{unexpected OpenMP directive '#pragma omp end declare target'}}
#pragma omp end declare target
foo(v);
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-error@+1 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+1 {{unexpected 'to' clause, use 'enter' instead}}
#pragma omp declare target to(foo3) link(w)
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-to-51-var-error@+1 {{local variable 'a' should not be used in 'declare target' directive}}
#pragma omp declare target to(a)
return (0);
@@ -283,48 +303,48 @@ namespace {
// expected-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
#pragma omp declare target (x, x)
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-to-51-clause-error@+1 {{'x' appears multiple times in clauses on the same declare target directive}}
#pragma omp declare target to(x) to(x)
// expected-error@+1 {{'x' must not appear in both clauses 'to' and 'link'}}
#pragma omp declare target link(x)
void bazz() {}
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host5-note@+2 3 {{marked as 'device_type(nohost)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(bazz) device_type(nohost)
void bazzz() {bazz();}
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(bazzz) device_type(nohost)
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void any() {bazz();}
// host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void host1() {bazz();}
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// dev5-note@+2 3 {{marked as 'device_type(host)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(host1) device_type(host)
//host5-error@+1 {{function with 'device_type(nohost)' is not available on host}}
void host2() {bazz();}
// omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
#pragma omp declare target to(host2)
// dev5-error@+1 {{function with 'device_type(host)' is not available on device}}
void device() {host1();}
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host5-note@+2 2 {{marked as 'device_type(nohost)' here}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(device) device_type(nohost)
void host3() {host1();} // dev5-error {{function with 'device_type(host)' is not available on device}}
// omp52-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+2 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+1 {{expected at least one 'enter', 'link' or 'indirect' clause}}
#pragma omp declare target to(host3)
#pragma omp declare target
@@ -343,17 +363,17 @@ void any7() {device();}
void any8() {any2();}
int MultiDevTy;
// omp52-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+3 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+2 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(any)
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// host-5-and-51-error@+2 {{'device_type(host)' does not match previously specified 'device_type(any)' for the same declaration}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(host)
// omp52-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// omp52-or-later-error@+4 {{unexpected 'to' clause, use 'enter' instead}}
// omp52-or-later-error@+3 {{expected at least one 'enter', 'link' or 'indirect' clause}}
// no-host5-and-51-error@+2 {{'device_type(nohost)' does not match previously specified 'device_type(any)' for the same declaration}}
// omp45-error@+1 {{unexpected 'device_type' clause, only 'to' or 'link' clauses expected}}
#pragma omp declare target to(MultiDevTy) device_type(nohost)
@@ -414,6 +434,8 @@ target *S1 = &S;
// expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp declare target'}}
#pragma omp declare target
#else
// expected-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
// omp60-warning@+3 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare_target'}}
// omp52-warning@+2 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
// omp45-to-51-warning@+1 {{expected '#pragma omp end declare target' at end of file to match '#pragma omp begin declare target'}}
#pragma omp begin declare target
#endif

View File

@@ -152,7 +152,7 @@ void vararg_bar2(const char *fmt) { return; }
#pragma omp declare variant(foo_v1) match(construct={dispatch}) \
append_args(foobar(target))
// expected-error@+2 {{directive '#pragma omp declare variant' cannot contain more than one 'append_args' clause}}
// expected-error@+2 {{directive '#pragma omp declare_variant' cannot contain more than one 'append_args' clause}}
#pragma omp declare variant(foo_v1) match(construct={dispatch}) \
append_args(interop(target)) \
append_args(interop(targetsync))

View File

@@ -102,7 +102,7 @@ T tmain(T argc, T *argv) {
// CHECK-NEXT: T i, j, b, c, d, e, x[20];
// CHECK-NEXT: #pragma omp target data map(to: c){{$}}
// CHECK-NEXT: i = argc;
// CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)
// CHECK-NEXT: foo();
// CHECK-NEXT: #pragma omp target data map(to: c) if(b)
// CHECK-NEXT: foo();
@@ -140,7 +140,7 @@ T tmain(T argc, T *argv) {
// CHECK-NEXT: int i, j, b, c, d, e, x[20];
// CHECK-NEXT: #pragma omp target data map(to: c)
// CHECK-NEXT: i = argc;
// CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)
// CHECK-NEXT: foo();
// CHECK-NEXT: #pragma omp target data map(to: c) if(b)
// CHECK-NEXT: foo();
@@ -178,7 +178,7 @@ T tmain(T argc, T *argv) {
// CHECK-NEXT: char i, j, b, c, d, e, x[20];
// CHECK-NEXT: #pragma omp target data map(to: c)
// CHECK-NEXT: i = argc;
// CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0)
// CHECK-NEXT: #pragma omp target data map(to: c) if(target{{[ _]}}data: j > 0)
// CHECK-NEXT: foo();
// CHECK-NEXT: #pragma omp target data map(to: c) if(b)
// CHECK-NEXT: foo();
@@ -225,7 +225,7 @@ int main (int argc, char **argv) {
a=2;
// CHECK-NEXT: a = 2;
#pragma omp target data map(to: c) if (target data: b)
// CHECK: #pragma omp target data map(to: c) if(target data: b)
// CHECK: #pragma omp target data map(to: c) if(target{{[ _]}}data: b)
foo();
// CHECK-NEXT: foo();

View File

@@ -1,35 +1,35 @@
// -fopenmp, -fno-openmp-extensions
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge51,lt60,omp,ge51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge51,ge52,lt60,omp,ge52-omp,omp52 -fopenmp -fno-openmp-extensions -fopenmp-version=52 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge52,ge60,omp,ge60-omp,omp60 -fopenmp -fno-openmp-extensions -fopenmp-version=60 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,omp,lt51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,ge51,lt60,omp,ge51-omp -fopenmp -fno-openmp-extensions -fopenmp-version=51 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,ge51,ge52,lt60,omp,ge52-omp,omp52 -fopenmp -fno-openmp-extensions -fopenmp-version=52 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge60,omp,ge60-omp,omp60 -fopenmp -fno-openmp-extensions -fopenmp-version=60 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -DCCODE -verify -fopenmp -fno-openmp-extensions -ferror-limit 300 -x c %s -Wno-openmp -Wuninitialized -Wno-vla
// -fopenmp-simd, -fno-openmp-extensions
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge51,lt60,omp,ge51-omp -fopenmp-simd -fno-openmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,omp,lt51-omp -fopenmp-simd -fno-openmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,ge51,lt60,omp,ge51-omp -fopenmp-simd -fno-openmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -DCCODE -verify -fopenmp-simd -fno-openmp-extensions -ferror-limit 300 -x c %s -Wno-openmp-mapping -Wuninitialized -Wno-vla
// -fopenmp -fopenmp-extensions
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge51,lt60,ompx,ge51-ompx -fopenmp -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,ge51,lt60,ompx,ge51-ompx -fopenmp -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -DCCODE -verify -fopenmp -fopenmp-extensions -ferror-limit 300 -x c %s -Wno-openmp -Wuninitialized -Wno-vla
// -fopenmp-simd -fopenmp-extensions
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=40 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,lt50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=45 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,ge50,ge51,lt60,ompx,ge51-ompx -fopenmp-simd -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,lt51,lt60,ompx,lt51-ompx -fopenmp-simd -fopenmp-extensions -fopenmp-version=50 -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -verify=expected,omp5x,ge50,ge51,lt60,ompx,ge51-ompx -fopenmp-simd -fopenmp-extensions -ferror-limit 300 %s -Wno-openmp-target -Wuninitialized -Wno-vla
// RUN: %clang_cc1 -DCCODE -verify -fopenmp-simd -fopenmp-extensions -ferror-limit 300 -x c %s -Wno-openmp-mapping -Wuninitialized -Wno-vla
// Check
@@ -87,7 +87,7 @@ struct SA {
{}
#pragma omp target map(arg[2:2],a,d) // expected-error {{subscripted value is not an array or pointer}}
{}
#pragma omp target map(arg,a*2) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
#pragma omp target map(arg,a*2) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} ge60-error {{expected addressable lvalue in 'map' clause}}
{}
#pragma omp target map(arg,(c+1)[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}}
{}
@@ -170,27 +170,32 @@ struct SA {
// expected-error@+1 {{use of undeclared identifier 'present'}}
#pragma omp target map(present)
{}
// ge60-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(ompx_hold, tofrom: c,f)
{}
// ge60-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(ompx_hold, tofrom: c[1:2],f)
{}
// ge60-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(ompx_hold, tofrom: c,f[1:2])
{}
// ge60-error@+5 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// expected-error@+3 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
// ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-omp-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(ompx_hold, tofrom: c[:],f)
{}
// ge60-error@+5 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+4 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// expected-error@+3 {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
// ge51-omp-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
@@ -211,12 +216,14 @@ struct SA {
// lt51-error@+1 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(present, present, tofrom: a)
{}
// ge60-error@+5 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge52-error@+4 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// ompx-error@+3 {{same map type modifier has been specified more than once}}
// ge51-omp-error@+2 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-omp-error@+1 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(ompx_hold, ompx_hold, tofrom: a)
{}
// ge60-error@+10 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator', 'self}}
// ge60-error@+9 {{same map type modifier has been specified more than once}}
// ge52-error@+8 2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present', 'iterator'}}
// expected-error@+7 2 {{same map type modifier has been specified more than once}}
@@ -247,10 +254,11 @@ struct SA {
// lt60-error@+1 {{missing map type}}
#pragma omp target map( , f, : a)
{}
#pragma omp target map(always close: a) // lt60-error {{missing map type}} ge52-error{{missing ',' after map type modifier}}
#pragma omp target map(always close: a) // lt60-error {{missing map type}} ge52-error{{missing ',' after map type modifier}} ge60-error {{missing ',' after map type modifier}}
{}
#pragma omp target map(always close bf: a) // ge52-error 2 {{missing ',' after map type modifier}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
#pragma omp target map(always close bf: a) // ge52-error 2 {{missing ',' after map type modifier}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} ge60-error 2 {{missing ',' after map type modifier}}
{}
// ge60-error@+5 {{missing ',' after map type modifier}}
// ge52-error@+4 {{missing ',' after map type modifier}}
// ge51-error@+3 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper', 'present'}}
// lt51-error@+2 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
@@ -263,6 +271,7 @@ struct SA {
// lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(tofrom from: a)
{}
// ge60-error@+6 {{missing ',' after map type modifier}}
// ge60-note@+5 {{map type 'to' is previous specified here}}
// ge60-error@+4 {{map type is already specified}}
// ge52-error@+3 {{missing ',' after map type modifier}}
@@ -270,7 +279,7 @@ struct SA {
// lt51-error@+1 {{incorrect map type modifier, expected one of: 'always', 'close', 'mapper'}}
#pragma omp target map(to always from: a)
{}
#pragma omp target map(close bf: a) // ge52-error {{missing ',' after map type modifier}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}}
#pragma omp target map(close bf: a) // ge52-error {{missing ',' after map type modifier}} expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} ge60-error {{missing ',' after map type modifier}}
{}
#pragma omp target map(([b[I]][bf])f) // lt50-error {{expected ',' or ']' in lambda capture list}} lt50-error {{expected ')'}} lt50-note {{to match this '('}}
{}
@@ -476,7 +485,7 @@ void SAclient(int arg) {
{}
#pragma omp target map(r.S.Arr[:12])
{}
#pragma omp target map(r.S.foo() [:12]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
#pragma omp target map(r.S.foo() [:12]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} ge60-error {{expected addressable lvalue in 'map' clause}}
{}
#pragma omp target map(r.C, r.D)
{}
@@ -673,7 +682,7 @@ T tmain(T argc) {
foo();
#pragma omp target map(T) // expected-error {{'T' does not refer to a value}}
foo();
#pragma omp target map(I) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}}
#pragma omp target map(I) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}} ge60-error 2 {{expected addressable lvalue in 'map' clause}}
foo();
#pragma omp target map(S2::S2s)
foo();
@@ -690,7 +699,7 @@ T tmain(T argc) {
#pragma omp target map(to, x)
foo();
#pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
#pragma omp target data map(tofrom: argc > 0 ? x : y) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}}
#pragma omp target data map(tofrom: argc > 0 ? x : y) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}} ge60-error 2 {{expected addressable lvalue in 'map' clause}}
#pragma omp target data map(argc)
#pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
#pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning 2 {{type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning 2 {{type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}}
@@ -809,7 +818,11 @@ int main(int argc, char **argv) {
SC1 s;
SC1 *p;
int Arr[10];
#pragma omp target data map // expected-error {{expected '(' after 'map'}} lt50-error {{expected at least one 'map' or 'use_device_ptr' clause for '#pragma omp target data'}} ge50-error {{expected at least one 'map', 'use_device_ptr', or 'use_device_addr' clause for '#pragma omp target data'}}
// expected-error@+4 {{expected '(' after 'map'}}
// lt50-error@+3 {{expected at least one 'map' or 'use_device_ptr' clause for '#pragma omp target data'}}
// omp5x-error@+2 {{expected at least one 'map', 'use_device_ptr', or 'use_device_addr' clause for '#pragma omp target data'}}
// ge60-error@+1 {{expected at least one 'map', 'use_device_ptr', or 'use_device_addr' clause for '#pragma omp target_data'}}
#pragma omp target data map
#pragma omp target data map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}}
#pragma omp target data map() // expected-error {{expected expression}}
#pragma omp target data map(alloc) // expected-error {{use of undeclared identifier 'alloc'}}
@@ -828,7 +841,7 @@ int main(int argc, char **argv) {
#pragma omp target map(to, x)
foo();
#pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}}
#pragma omp target data map(tofrom: argc > 0 ? argv[1] : argv[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}}
#pragma omp target data map(tofrom: argc > 0 ? argv[1] : argv[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} ge60-error {{expected addressable lvalue in 'map' clause}}
#pragma omp target data map(argc)
#pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}}
#pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning {{type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}}

View File

@@ -651,7 +651,8 @@ def OMP_EndAssumes : Directive<[Spelling<"end assumes">]> {
let category = OMP_BeginAssumes.category;
let languages = OMP_BeginAssumes.languages;
}
def OMP_BeginDeclareTarget : Directive<[Spelling<"begin declare target">]> {
def OMP_BeginDeclareTarget : Directive<[Spelling<"begin declare target", 1, 52>,
Spelling<"begin declare_target", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_DeviceType>,
VersionedClause<OMPC_Indirect, 51>,
@@ -662,17 +663,21 @@ def OMP_BeginDeclareTarget : Directive<[Spelling<"begin declare target">]> {
let category = CA_Declarative;
let languages = [L_C];
}
def OMP_EndDeclareTarget : Directive<[Spelling<"end declare target">]> {
def OMP_EndDeclareTarget : Directive<[Spelling<"end declare target", 1, 52>,
Spelling<"end declare_target", 60>]> {
let association = AS_Delimited;
let category = OMP_BeginDeclareTarget.category;
let languages = OMP_BeginDeclareTarget.languages;
}
def OMP_BeginDeclareVariant : Directive<[Spelling<"begin declare variant">]> {
def OMP_BeginDeclareVariant
: Directive<[Spelling<"begin declare variant", 1, 52>,
Spelling<"begin declare_variant", 60>]> {
let association = AS_Delimited;
let category = CA_Declarative;
let languages = [L_C];
}
def OMP_EndDeclareVariant : Directive<[Spelling<"end declare variant">]> {
def OMP_EndDeclareVariant : Directive<[Spelling<"end declare variant", 1, 52>,
Spelling<"end declare_variant", 60>]> {
let association = AS_Delimited;
let category = OMP_BeginDeclareVariant.category;
let languages = OMP_BeginDeclareVariant.languages;
@@ -685,7 +690,8 @@ def OMP_Cancel : Directive<[Spelling<"cancel">]> {
let association = AS_None;
let category = CA_Executable;
}
def OMP_CancellationPoint : Directive<[Spelling<"cancellation point">]> {
def OMP_CancellationPoint : Directive<[Spelling<"cancellation point", 1, 52>,
Spelling<"cancellation_point", 60>]> {
let allowedOnceClauses = [
VersionedClause<OMPC_CancellationConstructType>,
];
@@ -699,21 +705,24 @@ def OMP_Critical : Directive<[Spelling<"critical">]> {
let association = AS_Block;
let category = CA_Executable;
}
def OMP_DeclareMapper : Directive<[Spelling<"declare mapper">]> {
def OMP_DeclareMapper : Directive<[Spelling<"declare mapper", 1, 52>,
Spelling<"declare_mapper", 60>]> {
let requiredClauses = [
VersionedClause<OMPC_Map, 45>,
];
let association = AS_None;
let category = CA_Declarative;
}
def OMP_DeclareReduction : Directive<[Spelling<"declare reduction">]> {
def OMP_DeclareReduction : Directive<[Spelling<"declare reduction", 1, 52>,
Spelling<"declare_reduction", 60>]> {
let allowedOnceClauses = [
VersionedClause<OMPC_Initializer>,
];
let association = AS_None;
let category = CA_Declarative;
}
def OMP_DeclareSimd : Directive<[Spelling<"declare simd">]> {
def OMP_DeclareSimd : Directive<[Spelling<"declare simd", 1, 52>,
Spelling<"declare_simd", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_Aligned>,
VersionedClause<OMPC_Linear>,
@@ -729,7 +738,8 @@ def OMP_DeclareSimd : Directive<[Spelling<"declare simd">]> {
let association = AS_Declaration;
let category = CA_Declarative;
}
def OMP_DeclareTarget : Directive<[Spelling<"declare target">]> {
def OMP_DeclareTarget : Directive<[Spelling<"declare target", 1, 52>,
Spelling<"declare_target", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_Enter, 52>,
VersionedClause<OMPC_Indirect, 51>,
@@ -742,7 +752,8 @@ def OMP_DeclareTarget : Directive<[Spelling<"declare target">]> {
let association = AS_None;
let category = CA_Declarative;
}
def OMP_DeclareVariant : Directive<[Spelling<"declare variant">]> {
def OMP_DeclareVariant : Directive<[Spelling<"declare variant", 1, 52>,
Spelling<"declare_variant", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_AdjustArgs, 51>,
];
@@ -1101,7 +1112,8 @@ def OMP_Target : Directive<[Spelling<"target">]> {
let association = AS_Block;
let category = CA_Executable;
}
def OMP_TargetData : Directive<[Spelling<"target data">]> {
def OMP_TargetData : Directive<[Spelling<"target data", 1, 52>,
Spelling<"target_data", 60>]> {
let allowedOnceClauses = [
VersionedClause<OMPC_Device>,
VersionedClause<OMPC_If>,
@@ -1114,7 +1126,8 @@ def OMP_TargetData : Directive<[Spelling<"target data">]> {
let association = AS_Block;
let category = CA_Executable;
}
def OMP_TargetEnterData : Directive<[Spelling<"target enter data">]> {
def OMP_TargetEnterData : Directive<[Spelling<"target enter data", 1, 52>,
Spelling<"target_enter_data", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_Depend>,
];
@@ -1129,7 +1142,8 @@ def OMP_TargetEnterData : Directive<[Spelling<"target enter data">]> {
let association = AS_None;
let category = CA_Executable;
}
def OMP_TargetExitData : Directive<[Spelling<"target exit data">]> {
def OMP_TargetExitData : Directive<[Spelling<"target exit data", 1, 52>,
Spelling<"target_exit_data", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_Depend>,
];
@@ -1144,7 +1158,8 @@ def OMP_TargetExitData : Directive<[Spelling<"target exit data">]> {
let association = AS_None;
let category = CA_Executable;
}
def OMP_TargetUpdate : Directive<[Spelling<"target update">]> {
def OMP_TargetUpdate : Directive<[Spelling<"target update", 1, 52>,
Spelling<"target_update", 60>]> {
let allowedClauses = [
VersionedClause<OMPC_Depend>,
VersionedClause<OMPC_From>,

View File

@@ -19,6 +19,7 @@ add_llvm_unittest(LLVMFrontendTests
OpenMPParsingTest.cpp
OpenMPCompositionTest.cpp
OpenMPDecompositionTest.cpp
OpenMPDirectiveNameTest.cpp
DEPENDS
acc_gen

View File

@@ -0,0 +1,96 @@
//===- llvm/unittests/Frontend/OpenMPDirectiveNameTest.cpp ----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Frontend/OpenMP/OMP.h"
#include "gtest/gtest.h"
using namespace llvm;
using namespace llvm::omp;
const DenseMap<Directive, StringRef> &Expected52() {
static const DenseMap<Directive, StringRef> Names{
{OMPD_begin_declare_target, "begin declare target"},
{OMPD_begin_declare_variant, "begin declare variant"},
{OMPD_cancellation_point, "cancellation point"},
{OMPD_declare_mapper, "declare mapper"},
{OMPD_declare_reduction, "declare reduction"},
{OMPD_declare_simd, "declare simd"},
{OMPD_declare_target, "declare target"},
{OMPD_declare_variant, "declare variant"},
{OMPD_end_declare_target, "end declare target"},
{OMPD_end_declare_variant, "end declare variant"},
{OMPD_target_data, "target data"},
{OMPD_target_enter_data, "target enter data"},
{OMPD_target_exit_data, "target exit data"},
{OMPD_target_update, "target update"},
};
return Names;
}
const DenseMap<Directive, StringRef> &Expected60() {
static const DenseMap<Directive, StringRef> Names{
{OMPD_begin_declare_target, "begin declare_target"},
{OMPD_begin_declare_variant, "begin declare_variant"},
{OMPD_cancellation_point, "cancellation_point"},
{OMPD_declare_mapper, "declare_mapper"},
{OMPD_declare_reduction, "declare_reduction"},
{OMPD_declare_simd, "declare_simd"},
{OMPD_declare_target, "declare_target"},
{OMPD_declare_variant, "declare_variant"},
{OMPD_end_declare_target, "end declare_target"},
{OMPD_end_declare_variant, "end declare_variant"},
{OMPD_target_data, "target_data"},
{OMPD_target_enter_data, "target_enter_data"},
{OMPD_target_exit_data, "target_exit_data"},
{OMPD_target_update, "target_update"},
};
return Names;
}
class VersionTest : public testing::TestWithParam<unsigned> {
public:
void SetUp() override {
Version = GetParam();
if (Version < 60)
KindToName = &Expected52();
else
KindToName = &Expected60();
}
const DenseMap<Directive, StringRef> *KindToName;
unsigned Version;
};
INSTANTIATE_TEST_SUITE_P(OpenMPDirectiveNames, VersionTest,
testing::ValuesIn(getOpenMPVersions()));
TEST_P(VersionTest, DirectiveName) {
for (auto [Kind, Name] : *KindToName)
ASSERT_EQ(Name, getOpenMPDirectiveName(Kind, Version));
}
TEST(OpenMPDirectiveNames, DirectiveKind52) {
for (auto [Kind, Name] : Expected52()) {
auto [K, R] = getOpenMPDirectiveKindAndVersions(Name);
ASSERT_EQ(K, Kind);
// Expect the name to be valid in 5.2, but not in 6.0.
EXPECT_TRUE(52 <= R.Max && R.Max < 60);
}
}
TEST(OpenMPDirectiveNames, DirectiveKind60) {
for (auto [Kind, Name] : Expected60()) {
auto [K, R] = getOpenMPDirectiveKindAndVersions(Name);
ASSERT_EQ(K, Kind);
// Expect the name to be valid in 6.0 and later.
EXPECT_TRUE(60 <= R.Min);
}
}