diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-07-12 19:37:11 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-07-12 19:37:11 +0000 |
commit | 17b1bc0f8e83f622807a88bc356671a3a1499067 (patch) | |
tree | 8a20168f87ba37d75a7f377b22ca3a918b223ac6 | |
parent | 3365a8e982e9c363acce5830709e75edf0bf0343 (diff) |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-8-branch@262606 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/c-family/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c-family/c-attribs.c | 2 | ||||
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 26 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 21 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/declare-target-3.c | 53 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/declare-target-2.C | 18 |
10 files changed, 147 insertions, 8 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index a0c793910d1b..5dda769f7733 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-06-20 Jakub Jelinek <jakub@redhat.com> PR c++/86210 diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 744315eec867..9ac9d3587948 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -445,6 +445,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 b80178de881d..04024484c5f0 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 Jakub Jelinek <jakub@redhat.com> Backported from mainline diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index f0198ec81c36..68b7c978010c 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -4632,8 +4632,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); @@ -5212,7 +5212,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 fe1f4fc0361b..fff998d29a42 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 7dd9c6adf425..c0cc71f4ebad 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7305,6 +7305,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 9aae34a814ce..6a67c4e5b33b 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1514,11 +1514,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 4683ad72c45d..8bc77b3acc29 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 Richard Biener <rguenther@suse.de> PR target/84829 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 000000000000..bf72fda0a89f --- /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 000000000000..e080ca6bfb5b --- /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 |