https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81827

--- Comment #16 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #15)
> Bisected to pauls r254427, the fix for PR81447 and PR82783.
> 
> Test adjustments suggest that we'll create even more malloc/free calls.

Hi Richard,

I am sorry to take so long to get back to this.

The vtable copy and finalise procedures get expanded for the allocatable
components to the the ultimate allocatable components. This is only an issue,
of course, if the vtable is generated.

This also exhibits the problem:
program main
    implicit none
    type level1
        real, allocatable :: var_r1(:), var_r2(:), var_r3(:), var_r4(:),
var_r5(:)
        integer, allocatable :: var_i1(:), var_i2(:), var_i3(:), var_i4(:),
var_i5(:)
        complex, allocatable :: var_c1(:), var_c2(:), var_c3(:), var_c4(:),
var_c5(:)
        logical, allocatable :: and_this_makes_sixteen(:)
    end type level1

    type level2
        type(level1), allocatable :: var1(:), var2(:), var3(:), var4(:),
var5(:)
    end type level2

    type level3
        type(level2), allocatable :: var1(:), var2(:), var3(:), var4(:),
var5(:)
    end type level3

    type level4
        type(level3), allocatable :: var1(:), var2(:), var3(:), var4(:),
var5(:)
    end type level4

    class (level4), allocatable :: foo(:) ! TYPE (level4) does not exibit the
long compile time.
    allocate(foo(1))
end program

There are two ways to fix this:
(i) Generate incomplete vtables, with the pointers to copy and finalise set to
null, for module derived types. This has the disadvantage that class objects,
such as the above, will still cause the compilation cascade; or
(ii) Call the functions associated with each derived type vtable at each level.

My preference would be for the latter and I will set to seeing how it can be
done.

Cheers

Paul

Reply via email to