This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR fortran/46152 -- fix namespace pollution in type-spec matching


On Sun, Oct 31, 2010 at 11:54:47AM +0100, Janus Weil wrote:
> 
> What do you think about adding the following hunk in match.c to
> improve the error message for this case:
> 
> 
> @@ -2874,7 +2861,15 @@ gfc_match_allocate (void)
>    if (m == MATCH_ERROR)
>      goto cleanup;
>    else if (m == MATCH_NO)
> -    ts.type = BT_UNKNOWN;
> +    {
> +      char name[GFC_MAX_SYMBOL_LEN + 1];
> +      if (gfc_match ("%n :: ", name) == MATCH_YES)
> +       {
> +         gfc_error ("Error in type-spec at %L", &old_locus);
> +         goto cleanup;
> +       }
> +      ts.type = BT_UNKNOWN;
> +    }
>    else
>      {
>        if (gfc_match (" :: ") == MATCH_YES)
> 
> 
> so that the test case becomes:
> 
> 
> Index: gcc/testsuite/gfortran.dg/allocate_derived_1.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/allocate_derived_1.f90    (revision 166088)
> +++ gcc/testsuite/gfortran.dg/allocate_derived_1.f90    (working copy)
> @@ -32,7 +32,7 @@
>   allocate(t1 :: x(2))
>   allocate(t2 :: x(3))
>   allocate(t3 :: x(4))
> - allocate(tx :: x(5))  ! { dg-error "is not an accessible derived type" }
> + allocate(tx :: x(5))  ! { dg-error "Error in type-spec" }
>   allocate(u0 :: x(6))  ! { dg-error "may not be ABSTRACT" }
>   allocate(v1 :: x(7))  ! { dg-error "is type incompatible with typespec" }
> 
> 
> I think this would be much better than complaining about something
> being wrong with the allocate-object, since the colons indicate that
> the (optional) type-spec is present, so we might as well make use of
> this information.
> 
> With this change the patch is ok from my side.
> 

Thanks.  Your suggestion is exactly what was needed!
I could not come up with what I considered a clean 
solution for 

module a
   type rael
     integer i
   end type rael
   type b
     real x
   end type b
end module a

program c
   use a, only : b
   real, allocatable :: x(:)
   allocate(rael :: x(1))    ! inaccessible type or a typographical error?
end program c

-- 
Steve


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]