[Patch, Fortran] F2003: More ASSOCIATE stuff

Tobias Burnus burnus@net-b.de
Mon Aug 16 21:13:00 GMT 2010


  Daniel Kraft wrote:
> here's another ASSOCIATE patch.  It shifts handling of the variables 
> and their initialization to the trans-* phase.  This fixes the 
> problems with array boundaries and implements association to 
> variables.  I think most of the useful stuff should work with this now.
Awesome!

> What does not work [...] is association to strings. [...]
> parsing of component references if you associate a variable to a 
> derived-type value
(The latter is a rather important case, looking at my Fortran 2003 books 
...)

You can add to the list: Polymorphic types. The following example is 
rejected with:

associate ( one => a, two => b)
                     1
Error: CLASS variable 'one' at (1) must be dummy, allocatable or pointer

!----------------------------
type t
end type t

type, extends(t) :: t2
end type t2

class(t), allocatable :: a, b
allocate( t :: a)
allocate( t2 :: b)

associate ( one => a, two => b)
   select type(two)
     type is (t)
       stop 'ERROR'
     type is (t2)
       print *, 'OK', two
     class default
       stop 'ERROR'
   end select
   select type(one)
     type is (t2)
       stop 'ERROR'
     type is (t)
       print *, 'OK', one
     class default
       stop 'ERROR'
   end select
end associate
end
!----------------------------


I also would expect an error for:

subroutine test(x)
   integer, intent(in) :: x
   associate ( y => x)
     y = 7
   end associate
end subroutine test

due to the INTENT(IN).


> I saw two failures, namely array_memcpy_3.f90 and bind_c_dts_3.f90.  
> Is this currently broken?

I saw them as well - though the array_memcpy_3.f90 looked a bit spurious 
- especially, I got either a MEMREF or memcopy. With bind_c_dts_3.f90, I 
wonder whether this is due to my recent DT bugfix. I thought I fixed 
that before the committal - can you try to find out why you see this? 
Maybe do an "svn up" in gcc/testsuite/gfortran.dg to make sure your file 
is up to date.

Looking at http://gcc.gnu.org/ml/gcc-testresults/2010-08/msg01641.html 
or at http://gcc.gnu.org/ml/gcc-testresults/2010-08/msg01640.html I also 
see the array_memcpy_3.f90 failure, but no bind_c_dts_3.f90 failure. 
Thus, I think this failure does not prevent a committal.

> Ok for trunk when this is figured out?

OK, but I have one nit:

+	  gfc_error ("'%s' at %L associated to %s can not"
+		     " be used in a variable definition context",
+		     sym->name,&sym->declared_at,
+		     (target->expr_type == EXPR_VARIABLE
+		      ? "vector-indexed target" : "expression"));


Can you split this into two gfc_errors? I think we make the live for the 
translators much easier if we do not use %s + a string.

More general remark, not preventing the committal:

+  ASSOCIATE (a =>  5,&  ! { dg-error "variable definition context" }
+             b =>  arr((/ 1, 3 /))) ! { dg-error "variable definition context" }
+    a = 4
+    b = 7


At least for long ASSOCIATE blocks, I think it would be more helpful to 
have the error in the "a = 4" line and not in the "a => 5" line.

Tobias

PS: I have not yet thought about the other points you have raised in 
your email.



More information about the Fortran mailing list