2 ! { dg-options "-fdump-tree-original" }
4 ! Tests the fix for PR87359 in which the finalization of
5 ! 'source=process%component%extract_mci_template()' in the allocation
6 ! of 'process%mci' caused invalid reads and freeing of already freed
7 ! memory. This test is a greatly reduced version of the original code.
9 ! Contributed by Juergen Reuter <juergen.reuter@desy.de>
15 public
:: mci_midpoint_t
18 type, abstract
:: mci_t
19 integer, dimension(:), allocatable
:: chain
21 type, extends (mci_t
) :: mci_midpoint_t
23 final
:: mci_midpoint_final
24 end type mci_midpoint_t
26 IMPURE ELEMENTAL
SUBROUTINE mci_midpoint_final(arg
)
27 TYPE(mci_midpoint_t
), INTENT(INOUT
) :: arg
29 END SUBROUTINE mci_midpoint_final
38 public
:: process_component_t
39 type :: process_component_t
40 class(mci_t
), allocatable
:: mci_template
42 procedure
:: init
=> process_component_init
43 procedure
:: extract_mci_template
=> process_component_extract_mci_template
44 end type process_component_t
48 subroutine process_component_init (component
, mci_template
)
49 class(process_component_t
), intent(out
) :: component
50 class(mci_t
), intent(in
), allocatable
:: mci_template
51 if (allocated (mci_template
)) &
52 allocate (component
%mci_template
, source
= mci_template
)
53 end subroutine process_component_init
55 function process_component_extract_mci_template (component
) &
57 class(mci_t
), allocatable
:: mci_template
58 class(process_component_t
), intent(in
) :: component
59 if (allocated (component
%mci_template
)) &
60 allocate (mci_template
, source
= component
%mci_template
)
61 end function process_component_extract_mci_template
62 end module process_config
74 type(process_component_t
) :: component
75 class(mci_t
), allocatable
:: mci
77 procedure
:: init_component
=> process_init_component
78 procedure
:: setup_mci
=> process_setup_mci
81 subroutine process_init_component
&
82 (process
, mci_template
)
83 class(process_t
), intent(inout
), target
:: process
84 class(mci_t
), intent(in
), allocatable
:: mci_template
85 call process
%component
%init (mci_template
)
86 end subroutine process_init_component
88 subroutine process_setup_mci (process
)
89 class(process_t
), intent(inout
) :: process
90 allocate (process
%mci
, source
=process
%component
%extract_mci_template ())
91 end subroutine process_setup_mci
99 use process
, only
: process_t
101 call event_transforms_1 ()
102 if (cnt
.ne
. 4) stop 2
105 subroutine event_transforms_1 ()
106 class(mci_t
), allocatable
:: mci_template
107 type(process_t
), allocatable
, target
:: process
109 allocate (mci_midpoint_t
:: mci_template
)
110 call process
%init_component (mci_template
)
111 call process
%setup_mci () ! generates 1 final call from call to extract_mci_template
112 if (cnt
.ne
. 1) stop 1
113 end subroutine event_transforms_1
! generates 3 final calls to mci_midpoint_final:
114 ! (i) process%component%mci_template
118 ! { dg-final { scan-tree-dump-times "__builtin_malloc" 17 "original" } }
119 ! { dg-final { scan-tree-dump-times "__builtin_free" 20 "original" } }