Hi! I've created branches/gomp-5_0-branch as a playground for OpenMP 5.0 implementation (so far mostly the TR4 - OpenMP Version 5.0 Preview 1 from last fall, but including later changes too).
This is the first patch - OpenMP 5.0 will allow target data with just use_device_ptr clauses and no map clauses, which was invalid in 4.5. Tested on x86_64-linux, committed to gomp-5_0-branch. 2017-05-04 Jakub Jelinek <ja...@redhat.com> * c-parser.c (c_parser_omp_target_data): Allow target data with only use_device_ptr clauses. * parser.c (cp_parser_omp_target_data): Allow target data with only use_device_ptr clauses. * c-c++-common/gomp/target-data-1.c: New test. --- gcc/c/c-parser.c.jj 2017-05-04 15:05:06.000000000 +0200 +++ gcc/c/c-parser.c 2017-05-04 15:27:33.306131900 +0200 @@ -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; } --- gcc/cp/parser.c.jj 2017-05-04 15:05:49.000000000 +0200 +++ gcc/cp/parser.c 2017-05-04 15:28:27.167445027 +0200 @@ -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; } --- gcc/testsuite/c-c++-common/gomp/target-data-1.c.jj 2017-05-04 17:30:41.339849938 +0200 +++ gcc/testsuite/c-c++-common/gomp/target-data-1.c 2017-05-04 17:31:48.270000004 +0200 @@ -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]++; +} Jakub