Hi Cesar!

On Tue, 27 Oct 2015 11:36:10 -0700, Cesar Philippidis <ce...@codesourcery.com> 
wrote:
>   * Proposed fortran cleanups and enhanced error reporting changes:
>     https://gcc.gnu.org/ml/gcc-patches/2015-10/msg02288.html

... has now been applied to trunk, in an altered version, so we now got
some divergence between trunk and gomp-4_0-branch to resolve.

> I'll apply this patch to gomp-4_0-branch shortly. I know that I should
> have broken this patch down into smaller patches, but it was already
> arranged as one big patch in my source tree.

> --- a/gcc/fortran/openmp.c
> +++ b/gcc/fortran/openmp.c

> @@ -1473,8 +1468,8 @@ gfc_match_oacc_declare (void)
>         if (n->u.map_op != OMP_MAP_FORCE_ALLOC
>             && n->u.map_op != OMP_MAP_FORCE_TO)
>           {
> -           gfc_error ("Invalid clause in module with "
> -                      "$!ACC DECLARE at %C");
> +           gfc_error ("Invalid clause in module with $!ACC DECLARE at %L",
> +                      &n->where);
>             return MATCH_ERROR;
>           }
>  
> @@ -1483,29 +1478,29 @@ gfc_match_oacc_declare (void)
>  
>        if (ns->proc_name->attr.oacc_function)
>       {
> -       gfc_error ("Invalid declare in routine with " "$!ACC DECLARE at %C");
> +       gfc_error ("Invalid declare in routine with $!ACC DECLARE at %C");
>         return MATCH_ERROR;
>       }

Shouldn't the "%C" -> "%L (&n->where)" substitution also be done for that
one?  If yes, please do so; if no, please add a source code comment, why.

>  
>        if (s->attr.in_common)
>       {
> -       gfc_error ("Unsupported: variable in a common block with "
> -                  "$!ACC DECLARE at %C");
> +       gfc_error ("Variable in a common block with $!ACC DECLARE at %L",
> +                  &n->where);
>         return MATCH_ERROR;
>       }
>  
>        if (s->attr.use_assoc)
>       {
> -       gfc_error ("Unsupported: variable is USE-associated with "
> -                  "$!ACC DECLARE at %C");
> +       gfc_error ("Variable is USE-associated with $!ACC DECLARE at %L",
> +                  &n->where);
>         return MATCH_ERROR;
>       }
>  
>        if ((s->attr.dimension || s->attr.codimension)
>         && s->attr.dummy && s->as->type != AS_EXPLICIT)
>       {
> -       gfc_error ("Unsupported: assumed-size dummy array with "
> -                  "$!ACC DECLARE at %C");
> +       gfc_error ("Assumed-size dummy array with $!ACC DECLARE at %L",
> +                  &n->where);
>         return MATCH_ERROR;
>       }

> -/* Returns true if clause in list 'list' is compatible with any of
> -   of the clauses in lists [0..list-1].  E.g., a reduction variable may
> -   appear in both reduction and private clauses, so this function
> -   will return true in this case.  */
> +/* Check if a variable appears in multiple clauses.  */
>  
> -static bool
> -oacc_compatible_clauses (gfc_omp_clauses *clauses, int list,
> -                        gfc_symbol *sym, bool openacc)
> +static void
> +resolve_omp_duplicate_list (gfc_omp_namelist *clause_list, bool openacc,
> +                         int list)

If I understand correctly, that has not been approved for trunk, so we
should revert this on gomp-4_0-branch, too?

>  {
>    gfc_omp_namelist *n;
> +  const char *error_msg = "Symbol %qs present on multiple clauses at %L";
>  
> -  if (!openacc)
> -    return false;
> +  /* OpenACC reduction clauses are compatible with everything.  We only
> +     need to check if a reduction variable is used more than once.  */
> +  if (openacc && list == OMP_LIST_REDUCTION)
> +    {
> +      hash_set<gfc_symbol *> reductions;
>  
> -  if (list != OMP_LIST_REDUCTION)
> -    return false;
> +      for (n = clause_list; n; n = n->next)
> +     {
> +       if (reductions.contains (n->sym))
> +         gfc_error (error_msg, n->sym->name, &n->where);
> +       else
> +         reductions.add (n->sym);
> +     }
>  
> -  for (n = clauses->lists[OMP_LIST_FIRST]; n; n = n->next)
> -    if (n->sym == sym)
> -      return true;
> +      return;
> +    }
>  
> -  return false;
> +  /* Ensure that variables are only used in one clause.  */
> +  for (n = clause_list; n; n = n->next)
> +    {
> +      if (n->sym->mark)
> +     gfc_error (error_msg, n->sym->name, &n->where);
> +      else
> +     n->sym->mark = 1;
> +    }
>  }

> @@ -4966,64 +4927,27 @@ gfc_resolve_oacc_declare (gfc_namespace *ns)
>      {
>        loc = oc->where;

As far as I can tell, given the following changes, the "loc" local
variable is now unused, so should be removed?

>  
> -      for (list = OMP_LIST_DEVICE_RESIDENT;
> -        list <= OMP_LIST_DEVICE_RESIDENT; list++)
> -     for (n = oc->clauses->lists[list]; n; n = n->next)
> -       {
> -         n->sym->mark = 0;
> -         if (n->sym->attr.flavor == FL_PARAMETER)
> -           gfc_error ("PARAMETER object %qs is not allowed at %L",
> -                      n->sym->name, &loc);
> -       }
> -
> -      for (list = OMP_LIST_DEVICE_RESIDENT;
> -         list <= OMP_LIST_DEVICE_RESIDENT; list++)
> -     for (n = oc->clauses->lists[list]; n; n = n->next)
> -       {
> -         if (n->sym->mark)
> -           gfc_error ("Symbol %qs present on multiple clauses at %L",
> -                      n->sym->name, &loc);
> -         else
> -           n->sym->mark = 1;
> -       }
> -
>        for (n = oc->clauses->lists[OMP_LIST_DEVICE_RESIDENT]; n; n = n->next)
> -     check_array_not_assumed (n->sym, loc, "DEVICE_RESIDENT");
> -
> -      for (n = oc->clauses->lists[OMP_LIST_MAP]; n; n = n->next)
>       {
> -       if (n->expr && n->expr->ref->type == REF_ARRAY)
> -           gfc_error ("Subarray: %qs not allowed in $!ACC DECLARE at %L",
> -                      n->sym->name, &loc);
> -     }
> -    }
> -
> -  for (oc = ns->oacc_declare; oc; oc = oc->next)
> -    {
> -      for (list = OMP_LIST_LINK; list <= OMP_LIST_LINK; list++)
> -     for (n = oc->clauses->lists[list]; n; n = n->next)
>         n->sym->mark = 0;
> -    }
> +       if (n->sym->attr.flavor == FL_PARAMETER)
> +         gfc_error ("PARAMETER object %qs is not allowed at %L",
> +                    n->sym->name, &n->where);
>  
> -  for (oc = ns->oacc_declare; oc; oc = oc->next)
> -    {
> -      for (list = OMP_LIST_LINK; list <= OMP_LIST_LINK; list++)
> -     for (n = oc->clauses->lists[list]; n; n = n->next)
> -       {
> -         if (n->sym->mark)
> -           gfc_error ("Symbol %qs present on multiple clauses at %L",
> -                      n->sym->name, &loc);
> -         else
> -           n->sym->mark = 1;
> -       }
> -    }
> +       check_array_not_assumed (n->sym, n->where,
> +                                "DEVICE_RESIDENT");    
> +     }
>  
> -  for (oc = ns->oacc_declare; oc; oc = oc->next)
> -    {
> -      for (list = OMP_LIST_LINK; list <= OMP_LIST_LINK; list++)
> -     for (n = oc->clauses->lists[list]; n; n = n->next)
> -       n->sym->mark = 0;
> +      for (n = oc->clauses->lists[OMP_LIST_MAP]; n; n = n->next)
> +     if (n->expr && n->expr->ref->type == REF_ARRAY)
> +       gfc_error ("Subarray %qs is not allowed in $!ACC DECLARE at %L",
> +                  n->sym->name, &n->where);
>      }
> +
> +  /* Check for duplicate link, device_resident and data clauses.  */
> +  resolve_oacc_declare_map (ns->oacc_declare, OMP_LIST_LINK);
> +  resolve_oacc_declare_map (ns->oacc_declare, OMP_LIST_DEVICE_RESIDENT);
> +  resolve_oacc_declare_map (ns->oacc_declare, OMP_LIST_MAP);
>  }


Grüße
 Thomas

Attachment: signature.asc
Description: PGP signature

Reply via email to