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
This commit is contained in:
Jakub Jelinek 2018-07-12 21:36:01 +02:00 committed by Jakub Jelinek
parent f34756291a
commit 9b45203369
10 changed files with 147 additions and 8 deletions

View 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

View 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 },

View 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>

View 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.

View 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

View 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);
}

View 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);

View 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

View File

@ -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];

View File

@ -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