1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
! RUN: %python %S/test_folding.py %s %flang_fc1
! Test folding of structure constructors
module m1
type parent_type
integer :: parent_field
end type parent_type
type, extends(parent_type) :: child_type
integer :: child_field
end type child_type
type parent_array_type
integer, dimension(2) :: parent_field
end type parent_array_type
type, extends(parent_array_type) :: child_array_type
integer :: child_field
end type child_array_type
type(child_type), parameter :: child_const1 = child_type(10, 11)
logical, parameter :: test_child1 = child_const1%child_field == 11
logical, parameter :: test_parent = child_const1%parent_field == 10
type(child_type), parameter :: child_const2 = child_type(12, 13)
type(child_type), parameter :: array_var(2) = &
[child_type(14, 15), child_type(16, 17)]
logical, parameter :: test_array_child = array_var(2)%child_field == 17
logical, parameter :: test_array_parent = array_var(2)%parent_field == 16
type array_type
real, dimension(3) :: real_field
end type array_type
type(array_type), parameter :: array_var2 = &
array_type([(real(i*i), i = 1,3)])
logical, parameter :: test_array_var = array_var2%real_field(2) == 4.0
type(child_type), parameter, dimension(2) :: child_const3 = &
[child_type(18, 19), child_type(20, 21)]
integer, dimension(2), parameter :: int_const4 = &
child_const3(:)%parent_field
logical, parameter :: test_child2 = int_const4(1) == 18
type(child_array_type), parameter, dimension(2) :: child_const5 = &
[child_array_type([22, 23], 24), child_array_type([25, 26], 27)]
integer, dimension(2), parameter :: int_const6 = child_const5(:)%parent_field(2)
logical, parameter :: test_child3 = int_const6(1) == 23
type(child_type), parameter :: child_const7 = child_type(28, 29)
type(parent_type), parameter :: parent_const8 = child_const7%parent_type
logical, parameter :: test_child4 = parent_const8%parent_field == 28
type(child_type), parameter :: child_const9 = &
child_type(parent_type(30), 31)
integer, parameter :: int_const10 = child_const9%parent_field
logical, parameter :: test_child5 = int_const10 == 30
end module m1
module m2
type grandparent_type
real :: grandparent_field
end type grandparent_type
type, extends(grandparent_type) :: parent_type
integer :: parent_field
end type parent_type
type, extends(parent_type) :: child_type
real :: child_field
end type child_type
type(child_type), parameter :: child_const1 = child_type(10.0, 11, 12.0)
integer, parameter :: int_const2 = &
child_const1%grandparent_type%grandparent_field
logical, parameter :: test_child1 = int_const2 == 10.0
integer, parameter :: int_const3 = &
child_const1%grandparent_field
logical, parameter :: test_child2 = int_const3 == 10.0
type(child_type), parameter :: child_const4 = &
child_type(parent_type(13.0, 14), 15.0)
integer, parameter :: int_const5 = &
child_const4%grandparent_type%grandparent_field
logical, parameter :: test_child3 = int_const5 == 13.0
type(child_type), parameter :: child_const6 = &
child_type(parent_type(grandparent_type(16.0), 17), 18.0)
integer, parameter :: int_const7 = &
child_const6%grandparent_type%grandparent_field
logical, parameter :: test_child4 = int_const7 == 16.0
integer, parameter :: int_const8 = &
child_const6%grandparent_field
logical, parameter :: test_child5 = int_const8 == 16.0
end module m2
module m3
! tests that use components with default initializations and with the
! components in the structure constructors in a different order from the
! declared order
type parent_type
integer :: parent_field1
real :: parent_field2 = 20.0
logical :: parent_field3
end type parent_type
type, extends(parent_type) :: child_type
real :: child_field1
logical :: child_field2 = .false.
integer :: child_field3
end type child_type
type(child_type), parameter :: child_const1 = &
child_type( &
parent_field2 = 10.0, child_field3 = 11, &
child_field2 = .true., parent_field3 = .false., &
parent_field1 = 12, child_field1 = 13.3)
logical, parameter :: test_child1 = child_const1%child_field1 == 13.3
logical, parameter :: test_child2 = child_const1%child_field2 .eqv. .true.
logical, parameter :: test_child3 = child_const1%child_field3 == 11
logical, parameter :: test_parent1 = child_const1%parent_field1 == 12
logical, parameter :: test_parent2 = child_const1%parent_field2 == 10.0
logical, parameter :: test_parent3 = child_const1%parent_field3 .eqv. .false.
logical, parameter :: test_parent4 = &
child_const1%parent_type%parent_field1 == 12
logical, parameter :: test_parent5 = &
child_const1%parent_type%parent_field2 == 10.0
logical, parameter :: test_parent6 = &
child_const1%parent_type%parent_field3 .eqv. .false.
type(parent_type), parameter ::parent_const1 = child_const1%parent_type
logical, parameter :: test_parent7 = parent_const1%parent_field1 == 12
logical, parameter :: test_parent8 = parent_const1%parent_field2 == 10.0
logical, parameter :: test_parent9 = &
parent_const1%parent_field3 .eqv. .false.
type(child_type), parameter :: child_const2 = &
child_type( &
child_field3 = 14, parent_field3 = .true., &
parent_field1 = 15, child_field1 = 16.6)
logical, parameter :: test_child4 = child_const2%child_field1 == 16.6
logical, parameter :: test_child5 = child_const2%child_field2 .eqv. .false.
logical, parameter :: test_child6 = child_const2%child_field3 == 14
logical, parameter :: test_parent10 = child_const2%parent_field1 == 15
logical, parameter :: test_parent11 = child_const2%parent_field2 == 20.0
logical, parameter :: test_parent12 = child_const2%parent_field3 .eqv. .true.
type(child_type), parameter :: child_const3 = &
child_type(parent_type( &
parent_field2 = 17.7, parent_field3 = .false., parent_field1 = 18), &
child_field2 = .false., child_field1 = 19.9, child_field3 = 21)
logical, parameter :: test_child7 = child_const3%parent_field1 == 18
logical, parameter :: test_child8 = child_const3%parent_field2 == 17.7
logical, parameter :: test_child9 = child_const3%parent_field3 .eqv. .false.
logical, parameter :: test_child10 = child_const3%child_field1 == 19.9
logical, parameter :: test_child11 = child_const3%child_field2 .eqv. .false.
logical, parameter :: test_child12 = child_const3%child_field3 == 21
type(child_type), parameter :: child_const4 = &
child_type(parent_type( &
parent_field3 = .true., parent_field1 = 22), &
child_field1 = 23.4, child_field3 = 24)
logical, parameter :: test_child13 = child_const4%parent_field1 == 22
logical, parameter :: test_child14 = child_const4%parent_field2 == 20.0
logical, parameter :: test_child15 = child_const4%parent_field3 .eqv. .true.
logical, parameter :: test_child16 = child_const4%child_field1 == 23.4
logical, parameter :: test_child17 = child_const4%child_field2 .eqv. .false.
logical, parameter :: test_child18 = child_const4%child_field3 == 24
end module m3
|