@@ -16091,6 +16091,8 @@ c_parser_omp_target_data (location_t loc
*pc = OMP_CLAUSE_CHAIN (*pc);
continue;
}
+ else if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_USE_DEVICE_PTR)
+ map_seen = 3;
pc = &OMP_CLAUSE_CHAIN (*pc);
}
@@ -16099,7 +16101,7 @@ c_parser_omp_target_data (location_t loc
if (map_seen == 0)
error_at (loc,
"%<#pragma omp target data%> must contain at least "
- "one %<map%> clause");
+ "one %<map%> or %<use_device_ptr%> clause");
return NULL_TREE;
}
@@ -35627,6 +35627,8 @@ cp_parser_omp_target_data (cp_parser *pa
*pc = OMP_CLAUSE_CHAIN (*pc);
continue;
}
+ else if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_USE_DEVICE_PTR)
+ map_seen = 3;
pc = &OMP_CLAUSE_CHAIN (*pc);
}
@@ -35635,7 +35637,7 @@ cp_parser_omp_target_data (cp_parser *pa
if (map_seen == 0)
error_at (pragma_tok->location,
"%<#pragma omp target data%> must contain at least "
- "one %<map%> clause");
+ "one %<map%> or %<use_device_ptr%> clause");
return NULL_TREE;
}
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+ int a[4] = { 1, 2, 3, 4 };
+ #pragma omp target data map(to:a)
+ #pragma omp target data use_device_ptr(a)
+ #pragma omp target is_device_ptr(a)
+ {
+ a[0]++;
+ }
+ #pragma omp target data /* { dg-error "must contain at least one" } */
+ a[0]++;
+ #pragma omp target data map(to:a)
+ #pragma omp target data use_device_ptr(a) use_device_ptr(a) /* { dg-error "appears more than once in data clauses" } */
+ a[0]++;
+}