| ! RUN: bbc -emit-fir %s -o - | FileCheck %s |
| |
| ! Test use of module data that is defined in this file. |
| ! TODO: similar tests for the functions that are using the modules, but without the |
| ! module being defined in this file. This require a front-end fix to be pushed first |
| ! so |
| |
| ! Module m2 defines simple data |
| module m2 |
| real :: x |
| integer :: y(100) |
| contains |
| ! CHECK-LABEL: func @_QMm2Pfoo() |
| real function foo() |
| ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32> |
| ! CHECK-DAG: fir.address_of(@_QMm2Ey) : !fir.ref<!fir.array<100xi32>> |
| foo = x + y(1) |
| end function |
| end module |
| ! CHECK-LABEL: func @_QPm2use() |
| real function m2use() |
| use m2 |
| ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32> |
| ! CHECK-DAG: fir.address_of(@_QMm2Ey) : !fir.ref<!fir.array<100xi32>> |
| m2use = x + y(1) |
| end function |
| ! Test renaming |
| ! CHECK-LABEL: func @_QPm2use_rename() |
| real function m2use_rename() |
| use m2, only: renamedx => x |
| ! CHECK-DAG: fir.address_of(@_QMm2Ex) : !fir.ref<f32> |
| m2use_rename = renamedx |
| end function |
| |
| ! Module modEq2 defines data that is equivalenced |
| module modEq2 |
| ! Equivalence, no initialization |
| real :: x1(10), x2(10), x3(10) |
| ! Equivalence with initialization |
| real :: y1 = 42. |
| real :: y2(10) |
| equivalence (x1(1), x2(5), x3(10)), (y1, y2(5)) |
| contains |
| ! CHECK-LABEL: func @_QMmodeq2Pfoo() |
| real function foo() |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>> |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>> |
| foo = x2(1) + y1 |
| end function |
| end module |
| ! CHECK-LABEL: func @_QPmodeq2use() |
| real function modEq2use() |
| use modEq2 |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>> |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>> |
| modEq2use = x2(1) + y1 |
| end function |
| ! Test rename of used equivalence members |
| ! CHECK-LABEL: func @_QPmodeq2use_rename() |
| real function modEq2use_rename() |
| use modEq2, only: renamedx => x2, renamedy => y1 |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>> |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>> |
| modEq2use = renamedx(1) + renamedy |
| end function |
| |
| |
| ! Module defines variable in common block |
| module modCommon2 |
| ! Module variable is in blank common |
| real :: x_blank |
| common // x_blank |
| ! Module variable is in named common, no init |
| real :: x_named1(10) |
| common /named1/ x_named1 |
| ! Module variable is in named common, with init |
| integer :: i_named2 = 42 |
| common /named2/ i_named2 |
| contains |
| ! CHECK-LABEL: func @_QMmodcommon2Pfoo() |
| real function foo() |
| ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>> |
| ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>> |
| ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>> |
| foo = x_blank + x_named1(5) + i_named2 |
| end function |
| end module |
| ! CHECK-LABEL: func @_QPmodcommon2use() |
| real function modCommon2use() |
| use modCommon2 |
| ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>> |
| ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>> |
| ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>> |
| modCommon2use = x_blank + x_named1(5) + i_named2 |
| end function |
| ! CHECK-LABEL: func @_QPmodcommon2use_rename() |
| real function modCommon2use_rename() |
| use modCommon2, only : renamed0 => x_blank, renamed1 => x_named1, renamed2 => i_named2 |
| ! CHECK-DAG: fir.address_of(@named2_) : !fir.ref<tuple<i32>> |
| ! CHECK-DAG: fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>> |
| ! CHECK-DAG: fir.address_of(@named1_) : !fir.ref<!fir.array<40xi8>> |
| modCommon2use_rename = renamed0 + renamed1(5) + renamed2 |
| end function |
| |
| |
| ! Test that there are no conflicts between equivalence use associated and the ones |
| ! from the scope |
| real function test_no_equiv_conflicts() |
| use modEq2 |
| ! Same equivalences as in modEq2. Test that lowering does not mixes |
| ! up the equivalence based on the similar offset inside the scope. |
| real :: x1l(10), x2l(10), x3l(10) |
| real :: y1l = 42. |
| real :: y2l(10) |
| save :: x1l, x2l, x3l, y1l, y2l |
| equivalence (x1l(1), x2l(5), x3l(10)), (y1l, y2l(5)) |
| ! CHECK-DAG: fir.address_of(@_QFtest_no_equiv_conflictsEx1l) : !fir.ref<!fir.array<76xi8>> |
| ! CHECK-DAG: fir.address_of(@_QFtest_no_equiv_conflictsEy1l) : !fir.ref<!fir.array<10xi32>> |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ex1) : !fir.ref<!fir.array<76xi8>> |
| ! CHECK-DAG: fir.address_of(@_QMmodeq2Ey1) : !fir.ref<!fir.array<10xi32>> |
| test_no_equiv_conflicts = x2(1) + y1 + x2l(1) + y1l |
| end function |