Hello,

Le 23/04/2013 09:58, Tobias Burnus a écrit :
> The constraint checks for assumed-type and assumed-rank with regards to
> intrinsics only worked very indirectly and, hence, was not strict
> enough. That's now fixed with the attached patch - also for
> NO_ARG_CHECK. For the latter, it also improves the wording a bit and
> allows PRESENT as second permitted intrinsic. (That's the same as for
> TYPE(*) minus the array intrinsics.)
> 
> Build and regtested on x86-64-gnu-linux.
> OK for the trunk?
> 

> diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
> index f4bcdef..78ac0f7 100644
> --- a/gcc/fortran/gfortran.texi
> +++ b/gcc/fortran/gfortran.texi
> @@ -2694,17 +2694,18 @@ with this attribute actual arguments of any type and 
> kind (similar to
>  @code{TYPE(*)}), scalars and arrays of any rank (no equivalent
>  in Fortran standard) are accepted.  As with @code{TYPE(*)}, the argument
>  is unlimited polymorphic and no type information is available.
> -Additionally, the same restrictions apply, i.e. the argument may only be
> -passed to dummy arguments with the @code{NO_ARG_CHECK} attribute and as
> -argument to the @code{C_LOC} intrinsic function of the @code{ISO_C_BINDING}
> -module.
> +Additionally, the the argument may only be passed to dummy arguments
s/the the/the/

> +with the @code{NO_ARG_CHECK} attribute and as argument to the
> +@code{PRESENT} intrinsic function and to @code{C_LOC} of the
> +@code{ISO_C_BINDING} module.
>  
> diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
> index 688332f..cc62c6c 100644
> --- a/gcc/fortran/intrinsic.c
> +++ b/gcc/fortran/intrinsic.c
> @@ -182,10 +182,65 @@ static bool
[...]
> +      else if (a->expr->ts.type == BT_ASSUMED
> +            && (a != arg
> +                || (specific->id != GFC_ISYM_LBOUND
> +                    && specific->id != GFC_ISYM_PRESENT
> +                    && specific->id != GFC_ISYM_RANK
> +                    && specific->id != GFC_ISYM_SHAPE
> +                    && specific->id != GFC_ISYM_SIZE
> +                    && specific->id != GFC_ISYM_UBOUND
> +                    && specific->id != GFC_ISYM_C_LOC)))
I think that when both of the || conditions are true...

> +     {
> +       if (a != arg)
> +         gfc_error ("Assumed-type argument at %L is only permitted as "
> +                    "first actual argument to the intrinsic %s",
> +                    &a->expr->where, gfc_current_intrinsic);
> +       else
> +         gfc_error ("Assumed-type argument at %L is not permitted as actual"
> +                    " argument to the intrinsic %s", &a->expr->where,
> +                    gfc_current_intrinsic);
> +       return false;
> +     }
... the second error should be preferred.
Testcase:

 subroutine thirteen(x, y)
   type(*) :: x
   integer, pointer :: y
   print *, associated(y, x)
   print *, associated(x)
 end subroutine thirteen


output:
test.f90:4.26:

   print *, associated(y, x)
                          1
Error: Assumed-type argument at (1) is only permitted as first actual
argument to the intrinsic associated
test.f90:5.23:

   print *, associated(x)
                       1
Error: Assumed-type argument at (1) is not permitted as actual argument
to the intrinsic associated



Otherwise looks good.
Mikael


Reply via email to