On Fri, Nov 11, 2016 at 03:44:07PM -0800, Cesar Philippidis wrote:
> --- a/gcc/fortran/gfortran.h
> +++ b/gcc/fortran/gfortran.h
> @@ -314,6 +314,15 @@ enum save_state
>  { SAVE_NONE = 0, SAVE_EXPLICIT, SAVE_IMPLICIT
>  };
>  
> +/* Flags to keep track of ACC routine states.  */
> +enum oacc_function
> +{ OACC_FUNCTION_NONE = 0,

Please add a newline after {.

>    if (clauses)
>      {
>        unsigned mask = 0;
>  
>        if (clauses->gang)
> -     level = GOMP_DIM_GANG, mask |= GOMP_DIM_MASK (level);
> +     {
> +       level = GOMP_DIM_GANG, mask |= GOMP_DIM_MASK (level);
> +       ret = OACC_FUNCTION_GANG;
> +     }
>        if (clauses->worker)
> -     level = GOMP_DIM_WORKER, mask |= GOMP_DIM_MASK (level);
> +     {
> +       level = GOMP_DIM_WORKER, mask |= GOMP_DIM_MASK (level);
> +       ret = OACC_FUNCTION_WORKER;
> +     }
>        if (clauses->vector)
> -     level = GOMP_DIM_VECTOR, mask |= GOMP_DIM_MASK (level);
> +     {
> +       level = GOMP_DIM_VECTOR, mask |= GOMP_DIM_MASK (level);
> +       ret = OACC_FUNCTION_VECTOR;
> +     }

As you have {}s around, please use
        level = GOMP_DIM_*;
        mask |= GOMP_DIM_MASK (level);
        ret = OACC_FUNCTION_*;

>        if (clauses->seq)
>       level = GOMP_DIM_MAX, mask |= GOMP_DIM_MASK (level);
>  
>        if (mask != (mask & -mask))
> -     gfc_error ("Multiple loop axes specified for routine");
> +     ret = OACC_FUNCTION_NONE;
>      }
>  
> -  if (level < 0)
> -    level = GOMP_DIM_MAX;
> -
> -  return level;
> +  return ret;
>  }
>  
>  match
>  gfc_match_oacc_routine (void)
>  {
>    locus old_loc;
> -  gfc_symbol *sym = NULL;
>    match m;
> +  gfc_intrinsic_sym *isym = NULL;
> +  gfc_symbol *sym = NULL;
>    gfc_omp_clauses *c = NULL;
>    gfc_oacc_routine_name *n = NULL;
> +  oacc_function dims = OACC_FUNCTION_NONE;
> +  bool seen_error = false;
>  
>    old_loc = gfc_current_locus;
>  
> @@ -2287,45 +2314,52 @@ gfc_match_oacc_routine (void)
>    if (m == MATCH_YES)
>      {
>        char buffer[GFC_MAX_SYMBOL_LEN + 1];
> -      gfc_symtree *st;
> +      gfc_symtree *st = NULL;
>  
>        m = gfc_match_name (buffer);
>        if (m == MATCH_YES)
>       {
> -       st = gfc_find_symtree (gfc_current_ns->sym_root, buffer);
> +       if ((isym = gfc_find_function (buffer)) == NULL
> +           && (isym = gfc_find_subroutine (buffer)) == NULL)
> +         {
> +           st = gfc_find_symtree (gfc_current_ns->sym_root, buffer);
> +           if (st == NULL && gfc_current_ns->proc_name->attr.contained

Please add a newline before &&.

> +               && gfc_current_ns->parent)
> +             st = gfc_find_symtree (gfc_current_ns->parent->sym_root,
> +                                    buffer);
> +         }

> @@ -5934,6 +6033,21 @@ gfc_resolve_oacc_blocks (gfc_code *code, gfc_namespace 
> *ns)
>    ctx.private_iterators = new hash_set<gfc_symbol *>;
>    ctx.previous = omp_current_ctx;
>    ctx.is_openmp = false;
> +
> +  if (code->ext.omp_clauses->gang)
> +    dims = OACC_FUNCTION_GANG;
> +  if (code->ext.omp_clauses->worker)
> +    dims = OACC_FUNCTION_WORKER;
> +  if (code->ext.omp_clauses->vector)
> +    dims = OACC_FUNCTION_VECTOR;
> +  if (code->ext.omp_clauses->seq)
> +    dims = OACC_FUNCTION_SEQ;

Shouldn't these be else if ?
> +
> +  if (dims == OACC_FUNCTION_NONE && ctx.previous != NULL

Again, as the whole condition doesn't fit on one line, please
put && on a new line.
> +      && !ctx.previous->is_openmp)
> +    dims = ctx.previous->dims;

        Jakub

Reply via email to