[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
This commit is contained in:
Carlo Bertolli 2017-05-03 15:28:48 +00:00
parent 4be9d92b69
commit d8844b9d43
3 changed files with 87 additions and 2 deletions

View File

@ -1677,6 +1677,30 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
ConsumeToken();
ConsumeToken();
Data.MapType =
IsMapClauseModifierToken(Tok)
? static_cast<OpenMPMapClauseKind>(
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<OpenMPMapClauseKind>(

View File

@ -10,7 +10,7 @@ void foo() {}
template <typename T, int C>
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();

View File

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