[Patch, Fortran, OOP] PR 57306: ICE on valid with class pointer initialization

Tobias Burnus burnus@net-b.de
Sat Jul 27 09:48:00 GMT 2013


Hi Janus,

Janus Weil wrote:
> here is a fix for class pointer initialization.

I think the patch looks reasonable. However, as soon as I try to use the 
variable, I get an ICE in write_global_declarations -> symtab_get_node. 
It works if one moves the targets into a module.

I wonder whether there is an ordering problem of the decl or something 
else. The dump has:

   static struct __class_MAIN___C_p cc = &cd;
   struct c cd;
   static struct __class_MAIN___C_p dc = ⅆ
   struct d dd;

Additionally, the CLASS are wrongly initialized: You only set "_data" 
(indirectly as it is the first field/component of the class) but you do 
not set the _vptr component. Hence, the my example fails at run time

Tobias

PS: The test case. With module - fails at run time for same_type_as. 
Without module - one gets an ICE.

!module m
   type :: c
   end type c
   type, extends(c) :: d
   end type d
   type(c), target :: cd
   type(d), target :: dd
!end module m

!  use m
   class(c), pointer :: cc => cd
   class(c), pointer :: dc => dd

   if(.not. associated(cc, cd)) call abort()   ! OK
   if(.not. same_type_as(cc, cd)) call abort() ! Fails
   if(.not. associated(dc, dd)) call abort()   ! OK
   if(.not. same_type_as(dc, dd)) call abort() ! Fails
end



More information about the Fortran mailing list