Hi, The attached patch resolves c/PR64748. The patch adds the use of parm's with the deviceptr clause.
Question.... As there is VAR_P (), could there be a PARM_P ()? Or would that obscure something I'm not aware of? Regtested and bootstrapped on x86_64. Thanks, Jim ==== ChangeLog entries... gcc/c/ PR c/64748 * c-parser.c (c_parser_oacc_data_clause_deviceptr): Allow parms. gcc/cp/ PR c/64748 * parser.c (cp_parser_oacc_data_clause_deviceptr): Allow parms. gcc/testsuite/ PR c/64748 * c-c++-common/goacc/deviceptr-1.c: Add tests.
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 5341f04..f2d114c 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2016-02-XX James Norris <jnor...@codesourcery.com> + + PR c/64748 + * c-parser.c (c_parser_oacc_data_clause_deviceptr): Allow parms. + 2016-01-27 Jakub Jelinek <ja...@redhat.com> PR debug/66869 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index eede3a7..f61f559 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -10760,7 +10760,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) ; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3b5c9d5..b11b859 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-02-XX James Norris <jnor...@codesourcery.com> + + PR c/64748 + * parser.c (cp_parser_oacc_data_clause_deviceptr): Allow parms. + 2016-01-29 Jakub Jelinek <ja...@redhat.com> PR debug/66869 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d03b0c9..de96b44 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -30087,7 +30087,7 @@ cp_parser_oacc_data_clause_deviceptr (cp_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) ; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 150ebc8..db281cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-XX James Norris <jnor...@codesourcery.com> + + PR c/64748 + * c-c++-common/goacc/deviceptr-1.c: Add tests. + 2016-01-29 Jakub Jelinek <ja...@redhat.com> PR target/69551 diff --git a/gcc/testsuite/c-c++-common/goacc/deviceptr-1.c b/gcc/testsuite/c-c++-common/goacc/deviceptr-1.c index 546fa82..6edbdb1 100644 --- a/gcc/testsuite/c-c++-common/goacc/deviceptr-1.c +++ b/gcc/testsuite/c-c++-common/goacc/deviceptr-1.c @@ -84,3 +84,21 @@ 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" } */ +{ } + +}