https://reviews.llvm.org/D109156 did not properly update the case where the equivalence symbol appearing in the common statement is the "base symbol of an equivalence group" (this was the only case that previously worked ok, and the patch broke it). Fix this and add a test that actually uses this code path. Differential Revision: https://reviews.llvm.org/D109439
64 lines
2.4 KiB
Fortran
64 lines
2.4 KiB
Fortran
!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
|
|
|
|
! Size and alignment with EQUIVALENCE and COMMON
|
|
|
|
! a1 depends on a2 depends on a3
|
|
module ma
|
|
real :: a1(10), a2(10), a3(10)
|
|
equivalence(a1, a2(3)) !CHECK: a1, PUBLIC size=40 offset=20:
|
|
equivalence(a2, a3(4)) !CHECK: a2, PUBLIC size=40 offset=12:
|
|
!CHECK: a3, PUBLIC size=40 offset=0:
|
|
end
|
|
|
|
! equivalence and 2-dimensional array
|
|
module mb
|
|
real :: b1(4), b2, b3, b4
|
|
real :: b(-1:1,2:6) !CHECK: b, PUBLIC size=60 offset=0:
|
|
equivalence(b(1,6), b1) !CHECK: b1, PUBLIC size=16 offset=56:
|
|
equivalence(b(1,5), b2) !CHECK: b2, PUBLIC size=4 offset=44:
|
|
equivalence(b(0,6), b3) !CHECK: b3, PUBLIC size=4 offset=52:
|
|
equivalence(b(0,4), b4) !CHECK: b4, PUBLIC size=4 offset=28:
|
|
end
|
|
|
|
! equivalence and substring
|
|
subroutine mc !CHECK: Subprogram scope: mc size=12 alignment=1
|
|
character(10) :: c1 !CHECK: c1 size=10 offset=0:
|
|
character(5) :: c2 !CHECK: c2 size=5 offset=7:
|
|
equivalence(c1(9:), c2(2:4))
|
|
end
|
|
|
|
! Common block: objects are in order from COMMON statement and not part of module
|
|
module md !CHECK: Module scope: md size=1 alignment=1
|
|
integer(1) :: i
|
|
integer(2) :: d1 !CHECK: d1, PUBLIC size=2 offset=8:
|
|
integer(4) :: d2 !CHECK: d2, PUBLIC size=4 offset=4:
|
|
integer(1) :: d3 !CHECK: d3, PUBLIC size=1 offset=0:
|
|
real(2) :: d4 !CHECK: d4, PUBLIC size=2 offset=0:
|
|
common /common1/ d3,d2,d1 !CHECK: common1 size=10 offset=0: CommonBlockDetails alignment=4:
|
|
common /common2/ d4 !CHECK: common2 size=2 offset=0: CommonBlockDetails alignment=2:
|
|
end
|
|
|
|
! Test extension of common block size through equivalence statements.
|
|
module me
|
|
integer :: i1, j1, l1(10)
|
|
equivalence(i1, l1)
|
|
common /common3/ j1, i1 ! CHECK: common3 size=44 offset=0: CommonBlockDetails alignment=4:
|
|
|
|
integer :: i2, j2, l2(10)
|
|
equivalence(i2, l2(2))
|
|
common /common4/ j2, i2 ! CHECK: common4 size=40 offset=0: CommonBlockDetails alignment=4:
|
|
|
|
integer :: i3, j3, l3(10)
|
|
equivalence(i3, l3)
|
|
common /common5/ i3, j3 ! CHECK: common5 size=40 offset=0: CommonBlockDetails alignment=4:
|
|
|
|
integer :: i4, j4, l4(10), k4(10)
|
|
equivalence(i4, l4)
|
|
equivalence(l4(10), k4)
|
|
common /common6/ i4, j4 ! CHECK: common6 size=76 offset=0: CommonBlockDetails alignment=4:
|
|
|
|
integer :: i5, j5, l5(10)
|
|
equivalence(l5(1), i5)
|
|
common /common7/ j5, i5 ! CHECK: common7 size=44 offset=0: CommonBlockDetails alignment=4:
|
|
end
|