xref: /llvm-project/flang/test/Lower/module_use_in_same_file.f90 (revision 6ffea74f7c2cda7de91879a771daa6d45da198d9)
1! RUN: bbc -emit-fir %s -o - | FileCheck %s
2
3! Test use of module data that is defined in this file.
4! TODO: similar tests for the functions that are using the modules, but without the
5! module being defined in this file. This require a front-end fix to be pushed first
6! so
7
8! Module m2 defines simple data
9module m2
10  real :: x
11  integer :: y(100)
12contains
13  ! CHECK-LABEL: func @_QMm2Pfoo()
14  real function foo()
15    ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32>
16    ! CHECK-DAG: fir.address_of(@_QMm2Ey) : !fir.ref<!fir.array<100xi32>>
17    foo = x + y(1)
18  end function
19end module
20! CHECK-LABEL: func @_QPm2use()
21real function m2use()
22  use m2
23  ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32>
24  ! CHECK-DAG: fir.address_of(@_QMm2Ey) : !fir.ref<!fir.array<100xi32>>
25  m2use = x + y(1)
26end function
27! Test renaming
28! CHECK-LABEL: func @_QPm2use_rename()
29real function m2use_rename()
30  use m2, only: renamedx => x
31  ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32>
32  m2use_rename = renamedx
33end function
34
35! Module modEq2 defines data that is equivalenced
36module modEq2
37  ! Equivalence, no initialization
38  real :: x1(10), x2(10), x3(10)
39  ! Equivalence with initialization
40  real :: y1 = 42.
41  real :: y2(10)
42  equivalence (x1(1), x2(5), x3(10)), (y1, y2(5))
43contains
44  ! CHECK-LABEL: func @_QMmodeq2Pfoo()
45  real function foo()
46    ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>>
47    ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>>
48    foo = x2(1) + y1
49  end function
50end module
51! CHECK-LABEL: func @_QPmodeq2use()
52real function modEq2use()
53  use modEq2
54  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>>
55  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>>
56  modEq2use = x2(1) + y1
57end function
58! Test rename of used equivalence members
59! CHECK-LABEL: func @_QPmodeq2use_rename()
60real function modEq2use_rename()
61  use modEq2, only: renamedx => x2, renamedy => y1
62  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>>
63  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>>
64  modEq2use = renamedx(1) + renamedy
65end function
66
67
68! Module defines variable in common block
69module modCommon2
70  ! Module variable is in blank common
71  real :: x_blank
72  common // x_blank
73  ! Module variable is in named common, no init
74  real :: x_named1(10)
75  common /named1/ x_named1
76  ! Module variable is in named common, with init
77  integer :: i_named2 = 42
78  common /named2/ i_named2
79contains
80  ! CHECK-LABEL: func @_QMmodcommon2Pfoo()
81  real function foo()
82   ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>>
83   ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>>
84   ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>>
85   foo = x_blank + x_named1(5) + i_named2
86  end function
87end module
88! CHECK-LABEL: func @_QPmodcommon2use()
89real function modCommon2use()
90 use modCommon2
91 ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>>
92 ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>>
93 ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>>
94 modCommon2use = x_blank + x_named1(5) + i_named2
95end function
96! CHECK-LABEL: func @_QPmodcommon2use_rename()
97real function modCommon2use_rename()
98 use modCommon2, only : renamed0 => x_blank, renamed1 => x_named1, renamed2 => i_named2
99 ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>>
100 ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>>
101 ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>>
102 modCommon2use_rename = renamed0 + renamed1(5) + renamed2
103end function
104
105
106! Test that there are no conflicts between equivalence use associated and the ones
107! from the scope
108real function test_no_equiv_conflicts()
109  use modEq2
110  ! Same equivalences as in modEq2. Test that lowering does not mixes
111  ! up the equivalence based on the similar offset inside the scope.
112  real :: x1l(10), x2l(10), x3l(10)
113  real :: y1l = 42.
114  real :: y2l(10)
115  save :: x1l, x2l, x3l, y1l, y2l
116  equivalence (x1l(1), x2l(5), x3l(10)), (y1l, y2l(5))
117  ! CHECK-DAG: fir.address_of(@_QFtest_no_equiv_conflictsEx1l) : !fir.ref<!fir.array<76xi8>>
118  ! CHECK-DAG: fir.address_of(@_QFtest_no_equiv_conflictsEy1l) : !fir.ref<!fir.array<10xi32>>
119  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>>
120  ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>>
121  test_no_equiv_conflicts = x2(1) + y1 + x2l(1) + y1l
122end function
123