2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-09 15:51:08 +08:00

re PR c/64748 (OpenACC: "is not a variable" error with deviceptr())

PR c/64748

	gcc/c/
	* c-parser.c (c_parser_oacc_data_clause_deviceptr): Allow parms.

	gcc/cp/
	* parser.c (cp_parser_oacc_data_clause_deviceptr): Remove checking.
	* semantics.c (finish_omp_clauses): Add deviceptr checking.

	gcc/testsuite/
	* c-c++-common/goacc/deviceptr-1.c: Add tests.
	* g++.dg/goacc/deviceptr-1.c: New file.

From-SVN: r233458
This commit is contained in:
James Norris 2016-02-16 15:29:04 +00:00 committed by James Norris
parent 2a2b8f6488
commit ba53919561
8 changed files with 76 additions and 15 deletions

@ -1,3 +1,8 @@
2016-02-16 James Norris <jnorris@codesourcery.com>
PR c/64748
* c-parser.c (c_parser_oacc_data_clause_deviceptr): Allow parms.
2016-02-12 Bernd Schmidt <bschmidt@redhat.com>
* c-decl.c (build_null_declspecs): Zero the entire struct.

@ -10766,7 +10766,7 @@ c_parser_oacc_data_clause_deviceptr (c_parser *parser, tree list)
c_parser_omp_var_list_parens() should construct a list of
locations to go along with the var list. */
if (!VAR_P (v))
if (!VAR_P (v) && TREE_CODE (v) != PARM_DECL)
error_at (loc, "%qD is not a variable", v);
else if (TREE_TYPE (v) == error_mark_node)
;

@ -1,3 +1,8 @@
2016-02-16 James Norris <jnorris@codesourcery.com>
* parser.c (cp_parser_oacc_data_clause_deviceptr): Remove checking.
* semantics.c (finish_omp_clauses): Add deviceptr checking.
2016-02-15 Jakub Jelinek <jakub@redhat.com>
PR c++/69658

@ -30105,20 +30105,6 @@ cp_parser_oacc_data_clause_deviceptr (cp_parser *parser, tree list)
for (t = vars; t; t = TREE_CHAIN (t))
{
tree v = TREE_PURPOSE (t);
/* FIXME diagnostics: Ideally we should keep individual
locations for all the variables in the var list to make the
following errors more precise. Perhaps
c_parser_omp_var_list_parens should construct a list of
locations to go along with the var list. */
if (!VAR_P (v))
error_at (loc, "%qD is not a variable", v);
else if (TREE_TYPE (v) == error_mark_node)
;
else if (!POINTER_TYPE_P (TREE_TYPE (v)))
error_at (loc, "%qD is not a pointer variable", v);
tree u = build_omp_clause (loc, OMP_CLAUSE_MAP);
OMP_CLAUSE_SET_MAP_KIND (u, GOMP_MAP_FORCE_DEVICEPTR);
OMP_CLAUSE_DECL (u) = v;

@ -6634,6 +6634,14 @@ finish_omp_clauses (tree clauses, bool allow_fields, bool declare_simd)
omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
remove = true;
}
else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
&& OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FORCE_DEVICEPTR
&& !type_dependent_expression_p (t)
&& !POINTER_TYPE_P (TREE_TYPE (t)))
{
error ("%qD is not a pointer variable", t);
remove = true;
}
else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
&& OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER)
{

@ -1,3 +1,8 @@
2016-02-16 James Norris <jnorris@codesourcery.com>
* c-c++-common/goacc/deviceptr-1.c: Add tests.
* g++.dg/goacc/deviceptr-1.c: New file.
2016-02-16 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69820

@ -84,3 +84,17 @@ fun4 (void)
#pragma acc parallel deviceptr(s2_p)
s2_p = 0;
}
void
func5 (float *fp)
{
#pragma acc data deviceptr (fp)
;
}
void
func6 (float fp)
{
#pragma acc data deviceptr (fp) /* { dg-error "is not a pointer variable" } */
;
}

@ -0,0 +1,38 @@
// { dg-do compile }
template <typename P>
void
func1 (P p)
{
#pragma acc data deviceptr (p)// { dg-bogus "is not a pointer" }
;
}
void
func2 (int *p)
{
func1 (p);
}
template <typename P>
void
func3 (P p)
{
#pragma acc data deviceptr (p)// { dg-error "is not a pointer" }
;
}
void
func4 (int p)
{
func3 (p);
}
template <int N>
void
func5 (int *p, int q)
{
#pragma acc data deviceptr (p)// { dg-bogus "is not a pointer" }
;
#pragma acc data deviceptr (q)// { dg-error "is not a pointer" }
;
}