On Thu, Nov 07, 2019 at 11:42:22AM +0100, Tobias Burnus wrote:
> +  /* For VALUE, the scalar variable is passed as is but a hidden argument
> +     denotes the value.  Cf. trans-expr.c.  */
> +  if (TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE)
> +    {
> +      char name[GFC_MAX_SYMBOL_LEN + 2];
> +      tree tree_name;
> +
> +      name[0] = '_';
> +      strcpy (&name[1], IDENTIFIER_POINTER (DECL_NAME (decl)));
> +      tree_name = get_identifier (name);
> +
> +      /* Walk function argument list to find the hidden arg.  */
> +      decl = DECL_ARGUMENTS (DECL_CONTEXT (decl));
> +      for ( ; decl != NULL_TREE; decl = TREE_CHAIN (decl))
> +     if (DECL_NAME (decl) == tree_name)
> +       break;
> +
> +      gcc_assert (decl);
> +      return decl;
> +    }

Is this reliable?  I mean, consider -fallow-leading-underscore with:
subroutine foo (a, _a)
  integer, optional, value :: a
  logical(kind=1), value :: _a
...
end subroutine foo
and whatever OpenMP clause is affected in ...
In GIMPLE dump I certainly see:
foo (integer(kind=4) a, logical(kind=1) _a, logical(kind=1) _a)
and I bet the above would pick the wrong one.

Not really sure if additional DECL_ARTIFICIAL (decl) test would be enough.

> --- a/gcc/omp-general.c
> +++ b/gcc/omp-general.c
> @@ -63,12 +63,18 @@ omp_is_allocatable_or_ptr (tree decl)
>    return lang_hooks.decls.omp_is_allocatable_or_ptr (decl);
>  }
>  
> -/* Return true if DECL is a Fortran optional argument.  */
> +/* Check whether this DECL belongs to a Fortran optional argument.
> +   With 'for_present_check' set to false, decls which are optional parameters
> +   themselve are returned as tree - or a NULL_TREE otherwise. Those decls are
> +   always pointers.  With 'for_present_check' set to true, the decl for 
> checking
> +   whether an argument is present is returned; for arguments with value
> +   attribute this is the hidden argument and of BOOLEAN_TYPE.  If the decl is
> +   unrelated to optional arguments, NULL_TREE is returned.  */
>  
> -bool
> -omp_is_optional_argument (tree decl)
> +tree
> +omp_check_optional_argument (tree decl, bool also_value)

Why is the argument called for_present_check in the langhook and
also_value here?  Looks inconsistent.

> --- a/gcc/omp-general.h
> +++ b/gcc/omp-general.h
> @@ -74,7 +74,7 @@ struct omp_for_data
>  
>  extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
>  extern bool omp_is_allocatable_or_ptr (tree decl);
> -extern bool omp_is_optional_argument (tree decl);
> +extern tree omp_check_optional_argument (tree decl, bool also_value);
>  extern bool omp_is_reference (tree decl);
>  extern void omp_adjust_for_condition (location_t loc, enum tree_code 
> *cond_code,
>                                     tree *n2, tree v, tree step);

Here too.

        Jakub

Reply via email to