c-attribs.c (c_common_attribute_table): Add "omp declare target implicit" attribute.
authorJakub Jelinek <jakub@redhat.com>
Thu, 12 Jul 2018 19:36:01 +0000 (21:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 12 Jul 2018 19:36:01 +0000 (21:36 +0200)
* c-attribs.c (c_common_attribute_table): Add
"omp declare target implicit" attribute.

* c-decl.c (c_decl_attributes): Don't diagnose vars without mappable
type here, instead add "omp declare target implicit" attribute.
(finish_decl): Diagnose vars without mappable type here.

* decl2.c (cplus_decl_attributes): Don't diagnose vars without mappable
type here, instead add "omp declare target implicit" attribute.  Add
that attribute instead of "omp declare target" also when
processing_template_decl.
* decl.c (cp_finish_decl): Diagnose vars without mappable type here,
and before calling cp_omp_mappable_type call complete_type.

* c-c++-common/gomp/declare-target-3.c: New test.
* g++.dg/gomp/declare-target-2.C: New test.

From-SVN: r262605

gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/declare-target-3.c [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/declare-target-2.C [new file with mode: 0644]

index 115e032e41d7cba2c8076130029858f7943d0d8a..f35304d735ee8522932f14b3ed2b2ff4b5658c7c 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-attribs.c (c_common_attribute_table): Add
+       "omp declare target implicit" attribute.
+
 2018-07-12  Richard Biener  <rguenther@suse.de>
 
        PR c/86453
index 8cb87eb81543faee3ec1f8409f38656c48a4373d..9da9c2765e34737dae7a44eb4e72854ba8fa8458 100644 (file)
@@ -439,6 +439,8 @@ const struct attribute_spec c_common_attribute_table[] =
                              handle_omp_declare_target_attribute, NULL },
   { "omp declare target link", 0, 0, true, false, false, false,
                              handle_omp_declare_target_attribute, NULL },
+  { "omp declare target implicit", 0, 0, true, false, false, false,
+                             handle_omp_declare_target_attribute, NULL },
   { "alloc_align",           1, 1, false, true, true, false,
                              handle_alloc_align_attribute,
                              attr_alloc_exclusions },
index 1ba1173e9c212efe5b4c45fb2ccba314e5f83f5d..424b6a12bff9f00a06ca3087626a53658f4e3ba9 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-decl.c (c_decl_attributes): Don't diagnose vars without mappable
+       type here, instead add "omp declare target implicit" attribute.
+       (finish_decl): Diagnose vars without mappable type here.
+
 2018-06-20  Chung-Lin Tang <cltang@codesourcery.com>
            Thomas Schwinge <thomas@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
index af16cfd40bc2911c945b03e1d2e5a8232768c16f..ed1dd28cac63c8fe2155b99cd74ef60419e97f4e 100644 (file)
@@ -4643,8 +4643,8 @@ c_decl_attributes (tree *node, tree attributes, int flags)
     {
       if (VAR_P (*node)
          && !lang_hooks.types.omp_mappable_type (TREE_TYPE (*node)))
-       error ("%q+D in declare target directive does not have mappable type",
-              *node);
+       attributes = tree_cons (get_identifier ("omp declare target implicit"),
+                               NULL_TREE, attributes);
       else
        attributes = tree_cons (get_identifier ("omp declare target"),
                                NULL_TREE, attributes);
@@ -5223,7 +5223,27 @@ finish_decl (tree decl, location_t init_loc, tree init,
        diagnose_uninitialized_cst_member (decl, type);
     }
 
-       invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
+  if (flag_openmp
+      && VAR_P (decl)
+      && lookup_attribute ("omp declare target implicit",
+                          DECL_ATTRIBUTES (decl)))
+    {
+      DECL_ATTRIBUTES (decl)
+       = remove_attribute ("omp declare target implicit",
+                           DECL_ATTRIBUTES (decl));
+      if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (decl)))
+       error ("%q+D in declare target directive does not have mappable type",
+              decl);
+      else if (!lookup_attribute ("omp declare target",
+                                 DECL_ATTRIBUTES (decl))
+              && !lookup_attribute ("omp declare target link",
+                                    DECL_ATTRIBUTES (decl)))
+       DECL_ATTRIBUTES (decl)
+         = tree_cons (get_identifier ("omp declare target"),
+                      NULL_TREE, DECL_ATTRIBUTES (decl));
+    }
+
+  invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
 }
 
 /* Given a parsed parameter declaration, decode it into a PARM_DECL.
index 5fc7f05d3d05c5b102ef0ad10fb3b2e734b50195..a640259193c26bab3f9dc1c71d03265ae3693e60 100644 (file)
@@ -1,3 +1,12 @@
+2018-07-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * decl2.c (cplus_decl_attributes): Don't diagnose vars without mappable
+       type here, instead add "omp declare target implicit" attribute.  Add
+       that attribute instead of "omp declare target" also when
+       processing_template_decl.
+       * decl.c (cp_finish_decl): Diagnose vars without mappable type here,
+       and before calling cp_omp_mappable_type call complete_type.
+
 2018-07-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/86406
index 3597ba046546dfd9602e4014929d09432bcf6916..3c1e2ef36984129e2fa2d561908bbe3113f7d6e5 100644 (file)
@@ -7222,6 +7222,27 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
   if (was_readonly)
     TREE_READONLY (decl) = 1;
 
+  if (flag_openmp
+      && VAR_P (decl)
+      && lookup_attribute ("omp declare target implicit",
+                          DECL_ATTRIBUTES (decl)))
+    {
+      DECL_ATTRIBUTES (decl)
+       = remove_attribute ("omp declare target implicit",
+                           DECL_ATTRIBUTES (decl));
+      complete_type (TREE_TYPE (decl));
+      if (!cp_omp_mappable_type (TREE_TYPE (decl)))
+       error ("%q+D in declare target directive does not have mappable type",
+              decl);
+      else if (!lookup_attribute ("omp declare target",
+                                 DECL_ATTRIBUTES (decl))
+              && !lookup_attribute ("omp declare target link",
+                                    DECL_ATTRIBUTES (decl)))
+       DECL_ATTRIBUTES (decl)
+         = tree_cons (get_identifier ("omp declare target"),
+                      NULL_TREE, DECL_ATTRIBUTES (decl));
+    }
+
   invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
 }
 
index e06ffa613b71171477383cfebf969fb6df527c7b..f8fc20e409359c3c1af60b1fa18b7c1e4daec6ae 100644 (file)
@@ -1490,11 +1490,11 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
          && DECL_CLASS_SCOPE_P (*decl))
        error ("%q+D static data member inside of declare target directive",
               *decl);
-      else if (!processing_template_decl
-              && VAR_P (*decl)
-              && !cp_omp_mappable_type (TREE_TYPE (*decl)))
-       error ("%q+D in declare target directive does not have mappable type",
-              *decl);
+      else if (VAR_P (*decl)
+              && (processing_template_decl
+                  || !cp_omp_mappable_type (TREE_TYPE (*decl))))
+       attributes = tree_cons (get_identifier ("omp declare target implicit"),
+                               NULL_TREE, attributes);
       else
        attributes = tree_cons (get_identifier ("omp declare target"),
                                NULL_TREE, attributes);
index 7e8c380a691819f75688582857286361fab1dc0a..e72883860d6ae7f0b9ae0af942f8d8d410a8684a 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-c++-common/gomp/declare-target-3.c: New test.
+       * g++.dg/gomp/declare-target-2.C: New test.
+
 2018-07-12  Martin Sebor  <msebor@redhat.com>
 
        PR c/86453
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-target-3.c b/gcc/testsuite/c-c++-common/gomp/declare-target-3.c
new file mode 100644 (file)
index 0000000..bf72fda
--- /dev/null
@@ -0,0 +1,53 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#pragma omp declare target
+int a[] = { 1, 2, 3 };
+extern int b[];                        /* { dg-error "'b' in declare target directive does not have mappable type" } */
+extern int c[];                        /* { dg-error "'c' in declare target directive does not have mappable type" } */
+extern int d[];                        /* { dg-error "'d' in declare target directive does not have mappable type" } */
+int d[3];
+#pragma omp end declare target
+int c[3];
+int e[] = { 1, 2, 3 };
+#pragma omp declare target to (e)
+extern int f[];
+#pragma omp declare target to (f) /* { dg-error "'f' does not have a mappable type in 'to' clause" } */
+extern int g[];
+#pragma omp declare target to (g) /* { dg-error "'g' does not have a mappable type in 'to' clause" } */
+int g[3];
+extern int h[];
+int h[3];
+#pragma omp declare target to (h)
+
+int i[] = { 1, 2, 3 };
+int j[] = { 1, 2, 3 };
+extern int k[];
+extern int l[];
+extern int m[];
+extern int n[];
+extern int o[];
+extern int p[];
+int k[3];
+int l[3];
+int q;
+
+void
+foo (void)
+{
+  #pragma omp target update to (q) to (i)
+  #pragma omp target map (tofrom: j)
+  ;
+  #pragma omp target update from (q) from (k)
+  #pragma omp target map (to: l)
+  ;
+  #pragma omp target update from (q) from (m)  /* { dg-error "'m' does not have a mappable type in 'from' clause" } */
+  #pragma omp target map (from: n)             /* { dg-error "'n' does not have a mappable type in 'map' clause" } */
+  ;
+  #pragma omp target update to (q) to (o)      /* { dg-error "'o' does not have a mappable type in 'to' clause" } */
+  #pragma omp target map (from: p)             /* { dg-error "'p' does not have a mappable type in 'map' clause" } */
+  ;
+}
+
+int o[3];
+int p[3];
diff --git a/gcc/testsuite/g++.dg/gomp/declare-target-2.C b/gcc/testsuite/g++.dg/gomp/declare-target-2.C
new file mode 100644 (file)
index 0000000..e080ca6
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+#pragma omp declare target
+template <typename T>
+struct S { T a; };
+template <typename T>
+struct U { T a; };
+template <typename T>
+struct V { T a; };
+template <typename T>
+struct W { T a; };
+
+S<int> d;
+U<long> e[10];
+extern V<char> f[5];
+extern W<short> g[];           // { dg-error "'g' in declare target directive does not have mappable type" }
+#pragma omp end declare target