On Mon, May 09, 2016 at 10:26:50PM +0800, Chung-Lin Tang wrote:
> 2015-05-09  Chung-Lin Tang  <clt...@codesourcery.com>
> 
>       gcc/
>       * fortran/openmp.c (resolve_omp_clauses): Adjust use_device clause
>       handling to only allow pointers and arrays.

As has been mentioned earlier, this should go into gcc/fortran/ChangeLog
without fortran/ prefix.

> --- gcc/fortran/openmp.c      (revision 236020)
> +++ gcc/fortran/openmp.c      (working copy)
> @@ -3743,11 +3743,18 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_claus
>                             && CLASS_DATA (n->sym)->attr.allocatable))
>                       gfc_error ("ALLOCATABLE object %qs in %s clause at %L",
>                                  n->sym->name, name, &n->where);
> -                   if (n->sym->attr.pointer
> -                       || (n->sym->ts.type == BT_CLASS && CLASS_DATA (n->sym)
> -                           && CLASS_DATA (n->sym)->attr.class_pointer))
> -                     gfc_error ("POINTER object %qs in %s clause at %L",
> -                                n->sym->name, name, &n->where);
> +                   if (n->sym->attr.flavor == FL_VARIABLE
> +                       && !n->sym->as && !n->sym->attr.pointer

Better put every && on a separate line if the whole if (...) doesn't fit
on a single line.

> +                       && !n->sym->attr.cray_pointer
> +                       && !n->sym->attr.cray_pointee)

This is too ugly.  I'd instead move the if after the cray pointer/pointee
tests, i.e.
if (n->sym->attr.cray_pointer)
  gfc_error (...);
else if (n->sym->attr.cray_pointee)
  gfc_error (...);
else if (n->sym->attr.flavor == FL_VARIABLE
         && !n->sym->as
         && !n->sym->attr.pointer)
  gfc_error (...);

> +                     gfc_error ("%s clause variable %qs at %L is neither "
> +                                "a pointer nor an array", name,
> +                                n->sym->name, &n->where);

Why pointer rather than POINTER ?

> +                   if (n->sym->ts.type == BT_CLASS && CLASS_DATA (n->sym)
> +                       && CLASS_DATA (n->sym)->attr.class_pointer)
> +                     gfc_error ("POINTER object %qs of polymorphic type in "
> +                                "%s clause at %L", n->sym->name, name,
> +                                &n->where);

And, doesn't this mean you emit 2 errors, the first one because it is not
a pointer nor array, and the second one because it is a class with
attr.class_pointer?  Also put && on the next line.

I think best would be to make it else if after the cray pointer/pointee
checks.

        Jakub

Reply via email to