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

Reply via email to