Split off from PR 41872.

The following program fails because of:

  static struct .class.t.a a = {.$vptr=0B};

That is: Only $vptr and not also $data is initialized by NULL. Thus:
        if (a.$data == 0B)
fails. The initialization is seemingly done in gfc_build_class_symbol, but I do
not see ad hoc why it does not work.

 * * *

Replacing the variable by an array ("... :: a(:)" and "allocate (t :: a(1))")
leads to an ICE:

sub2.f90:20:0: internal compiler error: in gfc_conv_descriptor_data_get, at
fortran/trans-array.c:147

 * * *

program test
  implicit none
  type t
  end type t
  call sub (0)
  call sub (1)
  call sub (2)
contains
  subroutine sub (no)
    integer, intent(in) :: no
    class(t), allocatable, save :: a
    if (no == 0) then
      if (allocated (a)) call abort ()
      allocate (t :: a)
    else if (no == 1) then
      if (.not. allocated (a)) call abort ()
      deallocate (a)
    else
      if (allocated (a)) call abort ()
    end if
  end subroutine sub
end program test


-- 
           Summary: [OOP] CLASS with ALLOCATABLE + SAVE: Not initialized  /
                    ICE
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code, ice-on-valid-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42610

Reply via email to