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

Reply via email to