aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-07-12 21:36:01 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-07-12 21:36:01 +0200
commit9b4520336913e7015415fa921ea1de89ac98cfa9 (patch)
tree211237062b7d9f8fe1a8f83048df1c6535b2bc5c /gcc
parentf34756291a6848f8eb6028a7a92808369ae8771b (diff)
downloadgcc-9b4520336913e7015415fa921ea1de89ac98cfa9.zip
gcc-9b4520336913e7015415fa921ea1de89ac98cfa9.tar.gz
gcc-9b4520336913e7015415fa921ea1de89ac98cfa9.tar.bz2
c-attribs.c (c_common_attribute_table): Add "omp declare target implicit" attribute.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c-attribs.c2
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-decl.c26
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/decl.c21
-rw-r--r--gcc/cp/decl2.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/declare-target-3.c53
-rw-r--r--gcc/testsuite/g++.dg/gomp/declare-target-2.C18
10 files changed, 147 insertions, 8 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 115e032..f35304d 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 8cb87eb..9da9c27 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -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 },
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 1ba1173..424b6a1 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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>
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index af16cfd..ed1dd28 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -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.
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5fc7f05..a640259 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3597ba0..3c1e2ef 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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);
}
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e06ffa6..f8fc20e 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7e8c380..e728838 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..bf72fda
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/declare-target-3.c
@@ -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
index 0000000..e080ca6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/declare-target-2.C
@@ -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