From 9b4520336913e7015415fa921ea1de89ac98cfa9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Jul 2018 21:36:01 +0200 Subject: [PATCH] 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 --- gcc/c-family/ChangeLog | 5 ++ gcc/c-family/c-attribs.c | 2 + gcc/c/ChangeLog | 6 +++ gcc/c/c-decl.c | 26 +++++++-- gcc/cp/ChangeLog | 9 ++++ gcc/cp/decl.c | 21 ++++++++ gcc/cp/decl2.c | 10 ++-- gcc/testsuite/ChangeLog | 5 ++ .../c-c++-common/gomp/declare-target-3.c | 53 +++++++++++++++++++ gcc/testsuite/g++.dg/gomp/declare-target-2.C | 18 +++++++ 10 files changed, 147 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/declare-target-3.c create mode 100644 gcc/testsuite/g++.dg/gomp/declare-target-2.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 115e032e41d..f35304d735e 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2018-07-12 Jakub Jelinek + + * c-attribs.c (c_common_attribute_table): Add + "omp declare target implicit" attribute. + 2018-07-12 Richard Biener PR c/86453 diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 8cb87eb8154..9da9c2765e3 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 1ba1173e9c2..424b6a12bff 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2018-07-12 Jakub Jelinek + + * 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 Thomas Schwinge Cesar Philippidis diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index af16cfd40bc..ed1dd28cac6 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 5fc7f05d3d0..a640259193c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2018-07-12 Jakub Jelinek + + * 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 PR sanitizer/86406 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 3597ba04654..3c1e2ef3698 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 e06ffa613b7..f8fc20e4093 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 7e8c380a691..e72883860d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-07-12 Jakub Jelinek + + * c-c++-common/gomp/declare-target-3.c: New test. + * g++.dg/gomp/declare-target-2.C: New test. + 2018-07-12 Martin Sebor 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 00000000000..bf72fda0a89 --- /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 00000000000..e080ca6bfb5 --- /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 +struct S { T a; }; +template +struct U { T a; }; +template +struct V { T a; }; +template +struct W { T a; }; + +S d; +U e[10]; +extern V f[5]; +extern W g[]; // { dg-error "'g' in declare target directive does not have mappable type" } +#pragma omp end declare target -- 2.30.2