llvm-project/flang/test/Lower/module-single-point-of-def.f90
Slava Zakharin ac76fa480f [flang] Represent TARGET for globals with 'target' attribute.
TARGET dummy arguments have fir.target attribute attached to them,
but globals do not have any sign of TARGET. This patch adds
target attribute for globals, which can be queried via
::fir::GlobalOp::getTarget().

Differential Revision: https://reviews.llvm.org/D135313
2022-10-06 19:14:28 -07:00

79 lines
2.3 KiB
Fortran

! 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: }