| ! Test that module variables with an initializer are only defined once, |
| ! except for compiler generated derived type descriptor that should be |
| ! always fully defined as linkonce_odr by the compilation units defining or |
| ! using them. |
| ! Test that this holds true in contexts with namelist members that are special |
| ! because the symbol on the use site are not symbols with semantics::UseDetails, |
| ! but directly the symbols from the module scope. |
| |
| |
| ! RUN: split-file %s %t |
| ! RUN: bbc -emit-fir %t/definition-a.f90 -o - | FileCheck %s --check-prefix=CHECK-A-DEF |
| ! RUN: bbc -emit-fir %t/definition-b.f90 -o - | FileCheck %s --check-prefix=CHECK-B-DEF |
| ! RUN: bbc -emit-fir %t/use.f90 -o - | FileCheck %s --check-prefix=CHECK-USE |
| |
| |
| |
| !--- definition-a.f90 |
| |
| ! Test definition of `atype` derived type descriptor as `linkonce_odr` |
| module define_a |
| type atype |
| real :: x |
| end type |
| end module |
| |
| ! CHECK-A-DEF: fir.global linkonce_odr @_QMdefine_aE.dt.atype constant target : !fir.type<{{.*}}> { |
| ! CHECK-A-DEF: fir.has_value |
| ! CHECK-A-DEF: } |
| |
| !--- definition-b.f90 |
| |
| ! Test define_b `i` is defined here. |
| ! Also test that the derived type descriptor of types defined here (`btype`) and used |
| ! here (`atype`) are fully defined here as linkonce_odr. |
| module define_b |
| use :: define_a |
| type btype |
| type(atype) :: atype |
| end type |
| integer :: i = 42 |
| namelist /some_namelist/ i |
| end module |
| |
| ! CHECK-B-DEF: fir.global @_QMdefine_bEi : i32 { |
| ! CHECK-B-DEF: fir.has_value %{{.*}} : i32 |
| ! CHECK-B-DEF: } |
| |
| ! CHECK-B-DEF: fir.global linkonce_odr @_QMdefine_bE.dt.btype constant target : !fir.type<{{.*}}> { |
| ! CHECK-B-DEF: fir.has_value |
| ! CHECK-B-DEF: } |
| |
| ! CHECK-B-DEF: fir.global linkonce_odr @_QMdefine_aE.dt.atype constant : !fir.type<{{.*}}> { |
| ! CHECK-B-DEF: fir.has_value |
| ! CHECK-B-DEF: } |
| |
| |
| |
| !--- use.f90 |
| |
| ! Test define_b `i` is declared but not defined here and that derived types |
| ! descriptors are fully defined as linkonce_odr here. |
| subroutine foo() |
| use :: define_b |
| type(btype) :: somet |
| print *, somet |
| write(*, some_namelist) |
| end subroutine |
| ! CHECK-USE: fir.global @_QMdefine_bEi : i32{{$}} |
| ! CHECK-USE-NOT: fir.has_value %{{.*}} : i32 |
| |
| ! CHECK-USE: fir.global linkonce_odr @_QMdefine_aE.dt.atype constant : !fir.type<{{.*}}> { |
| ! CHECK-USE: fir.has_value |
| ! CHECK-USE: } |
| |
| ! CHECK-USE: fir.global linkonce_odr @_QMdefine_bE.dt.btype constant : !fir.type<{{.*}}> { |
| ! CHECK-USE: fir.has_value |
| ! CHECK-USE: } |
| |