From d8844b9d438e17304bcb28e3245adfa57c710097 Mon Sep 17 00:00:00 2001 From: Carlo Bertolli Date: Wed, 3 May 2017 15:28:48 +0000 Subject: [PATCH] [OpenMP] Extended parse for 'always' map modifier https://reviews.llvm.org/D32807 This patch allows the map modifier 'always' to be separated by the map type (to, from, tofrom) only by a whitespace, rather than strictly by a comma as in current trunk. llvm-svn: 302031 --- clang/lib/Parse/ParseOpenMP.cpp | 24 +++++++++ clang/test/OpenMP/target_ast_print.cpp | 63 ++++++++++++++++++++++- clang/test/OpenMP/target_map_messages.cpp | 2 + 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index dfb0438ba8ce..86ac035f3c8c 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -1677,6 +1677,30 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, ConsumeToken(); ConsumeToken(); + Data.MapType = + IsMapClauseModifierToken(Tok) + ? static_cast( + getOpenMPSimpleClauseType(Kind, PP.getSpelling(Tok))) + : OMPC_MAP_unknown; + if (Data.MapType == OMPC_MAP_unknown || + Data.MapType == OMPC_MAP_always) + Diag(Tok, diag::err_omp_unknown_map_type); + ConsumeToken(); + } else { + Data.MapType = OMPC_MAP_tofrom; + Data.IsMapTypeImplicit = true; + } + } else if (IsMapClauseModifierToken(PP.LookAhead(0))) { + if (PP.LookAhead(1).is(tok::colon)) { + Data.MapTypeModifier = Data.MapType; + if (Data.MapTypeModifier != OMPC_MAP_always) { + Diag(Tok, diag::err_omp_unknown_map_type_modifier); + Data.MapTypeModifier = OMPC_MAP_unknown; + } else + MapTypeModifierSpecified = true; + + ConsumeToken(); + Data.MapType = IsMapClauseModifierToken(Tok) ? static_cast( diff --git a/clang/test/OpenMP/target_ast_print.cpp b/clang/test/OpenMP/target_ast_print.cpp index 032a39fe5e82..d004f738fc0d 100644 --- a/clang/test/OpenMP/target_ast_print.cpp +++ b/clang/test/OpenMP/target_ast_print.cpp @@ -10,7 +10,7 @@ void foo() {} template T tmain(T argc, T *argv) { - T i, j, a[20]; + T i, j, a[20], always; #pragma omp target foo(); #pragma omp target if (target:argc > 0) @@ -25,6 +25,12 @@ T tmain(T argc, T *argv) { foo(); #pragma omp target map(always,alloc: i) foo(); +#pragma omp target map(always from: i) + foo(); +#pragma omp target map(always) + {always++;} +#pragma omp target map(always,i) + {always++;i++;} #pragma omp target nowait foo(); #pragma omp target depend(in : argc, argv[i:argc], a[:]) @@ -50,6 +56,17 @@ T tmain(T argc, T *argv) { // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target map(always,alloc: i) // CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(always,from: i) +// CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(tofrom: always) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: } +// CHECK-NEXT: #pragma omp target map(tofrom: always,i) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: i++; +// CHECK-NEXT: } // CHECK-NEXT: #pragma omp target nowait // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) @@ -72,6 +89,17 @@ T tmain(T argc, T *argv) { // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target map(always,alloc: i) // CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(always,from: i) +// CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(tofrom: always) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: } +// CHECK-NEXT: #pragma omp target map(tofrom: always,i) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: i++; +// CHECK-NEXT: } // CHECK-NEXT: #pragma omp target nowait // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) @@ -94,6 +122,17 @@ T tmain(T argc, T *argv) { // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target map(always,alloc: i) // CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(always,from: i) +// CHECK-NEXT: foo() +// CHECK-NEXT: #pragma omp target map(tofrom: always) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: } +// CHECK-NEXT: #pragma omp target map(tofrom: always,i) +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: i++; +// CHECK-NEXT: } // CHECK-NEXT: #pragma omp target nowait // CHECK-NEXT: foo() // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) @@ -103,7 +142,7 @@ T tmain(T argc, T *argv) { // CHECK-LABEL: int main(int argc, char **argv) { int main (int argc, char **argv) { - int i, j, a[20]; + int i, j, a[20], always; // CHECK-NEXT: int i, j, a[20] #pragma omp target // CHECK-NEXT: #pragma omp target @@ -139,6 +178,26 @@ int main (int argc, char **argv) { foo(); // CHECK-NEXT: foo(); +#pragma omp target map(always from: i) +// CHECK-NEXT: #pragma omp target map(always,from: i) + foo(); +// CHECK-NEXT: foo(); + +#pragma omp target map(always) +// CHECK-NEXT: #pragma omp target map(tofrom: always) + {always++;} +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: } + +#pragma omp target map(always,i) +// CHECK-NEXT: #pragma omp target map(tofrom: always,i) + {always++;i++;} +// CHECK-NEXT: { +// CHECK-NEXT: always++; +// CHECK-NEXT: i++; +// CHECK-NEXT: } + #pragma omp target nowait // CHECK-NEXT: #pragma omp target nowait foo(); diff --git a/clang/test/OpenMP/target_map_messages.cpp b/clang/test/OpenMP/target_map_messages.cpp index 93f0216dd233..9d166ae9a1d9 100644 --- a/clang/test/OpenMP/target_map_messages.cpp +++ b/clang/test/OpenMP/target_map_messages.cpp @@ -66,6 +66,8 @@ struct SA { {} #pragma omp target map(always, tofrom: c,f[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} {} + #pragma omp target map(always) // expected-error {{use of undeclared identifier 'always'}} + {} return; } };