Message ID | 56AFB4FE.1050203@codesourcery.com |
---|---|
State | New |
Headers | show |
On Mon, Feb 01, 2016 at 01:41:50PM -0600, James Norris wrote: > 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 ()? Not for GCC 6.x, for 7 it is possible. > --- 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)) Please don't write !(x == y) but x != y. > --- 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) > ; For C++, all this diagnostics is premature, if processing_template_decl you really often don't know what the type will be, not sure if you always know at least if it is a VAR_DECL, PARM_DECL or something else. I bet you can easily ICE with the current POINTER_TYPE_P (TREE_TYPE (v)) check as in templates the type can be NULL, or it could be some lang type and only later on become POINTER_TYPE, etc. For C++ the diagnostics need to be done during finish_omp_clauses or so, not earlier. Jakub
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 <jnorris@codesourcery.com> + + PR c/64748 + * c-parser.c (c_parser_oacc_data_clause_deviceptr): Allow parms. + 2016-01-27 Jakub Jelinek <jakub@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 <jnorris@codesourcery.com> + + PR c/64748 + * parser.c (cp_parser_oacc_data_clause_deviceptr): Allow parms. + 2016-01-29 Jakub Jelinek <jakub@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 <jnorris@codesourcery.com> + + PR c/64748 + * c-c++-common/goacc/deviceptr-1.c: Add tests. + 2016-01-29 Jakub Jelinek <jakub@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" } */ +{ } + +}