mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 05:36:06 +00:00
[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:
parent
4be9d92b69
commit
d8844b9d43
@ -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>(
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user