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