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:
parent
f34756291a
commit
9b45203369
|
@ -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
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
|
@ -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
|
Loading…
Reference in New Issue