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

Janus Weil janus@gcc.gnu.org
Sun Oct 31 15:56:00 GMT 2010


Hi Steve,

> See the PR for a thorough discussion of the problem and
> the fix.  The attached patch has been tested on i686-*-freebsd
> without regression.  I plan to commit this within the next
> 24 hours.

I think your patch is basically ok, so thanks for your work!

Just one little nit: I still don't quite like the fact that you simply
remove the one line in allocate_derived_1 where the error message has
changed.

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.

Cheers,
Janus



> 2010-10-30  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>        PR fortran/46152
>        * gfortran.dg/select_type_11.f03: Update dg-error phrase.
>        * gfortran.dg/allocate_with_typespec_4.f90: New test.
>        * gfortran.dg/allocate_with_typespec_1.f90: New test.
>        * gfortran.dg/allocate_with_typespec_2.f: New test.
>        * gfortran.dg/allocate_with_typespec_3.f90: New test.
>        * gfortran.dg/allocate_derived_1.f90: Delete an obselescent test.
>        * gfortran.dg/select_type_1.f03: Update dg-error phrase.
>
> 2010-10-30  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>        PR fortran/46152
>        * fortran/match.c (match_derived_type_spec): Reoplace gfc_match_symbol
>        with a gfc_find_symbol to prevent namespace pollution.  Remove dead
>        code.
>        (match_type_spec): Remove parsing of '::'.  Collapse character
>        kind checking to one location.
>        (gfc_match_allocate): Use correct locus in error message.
>
> --
> Steve
>



More information about the Fortran mailing list