xref: /llvm-project/flang/test/Semantics/offsets03.f90 (revision e7b8e18fc359c0de380e89b27898d18913ca9c50)
1!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
2
3! Size and alignment with EQUIVALENCE and COMMON
4
5! a1 depends on a2 depends on a3
6module ma
7  real :: a1(10), a2(10), a3(10)
8  equivalence(a1, a2(3)) !CHECK: a1, PUBLIC, SAVE size=40 offset=20:
9  equivalence(a2, a3(4)) !CHECK: a2, PUBLIC, SAVE size=40 offset=12:
10  !CHECK: a3, PUBLIC, SAVE size=40 offset=0:
11end
12
13! equivalence and 2-dimensional array
14module mb
15  real :: b1(4), b2, b3, b4
16  real :: b(-1:1,2:6)     !CHECK: b, PUBLIC, SAVE size=60 offset=0:
17  equivalence(b(1,6), b1) !CHECK: b1, PUBLIC, SAVE size=16 offset=56:
18  equivalence(b(1,5), b2) !CHECK: b2, PUBLIC, SAVE size=4 offset=44:
19  equivalence(b(0,6), b3) !CHECK: b3, PUBLIC, SAVE size=4 offset=52:
20  equivalence(b(0,4), b4) !CHECK: b4, PUBLIC, SAVE size=4 offset=28:
21end
22
23! equivalence and substring
24subroutine mc         !CHECK: Subprogram scope: mc size=12 alignment=1
25  character(10) :: c1 !CHECK: c1 size=10 offset=0:
26  character(5)  :: c2 !CHECK: c2 size=5 offset=7:
27  equivalence(c1(9:), c2(2:4))
28end
29
30! Common block: objects are in order from COMMON statement and not part of module
31module md                   !CHECK: Module scope: md size=1 alignment=1
32  integer(1) :: i
33  integer(2) :: d1          !CHECK: d1, PUBLIC size=2 offset=8:
34  integer(4) :: d2          !CHECK: d2, PUBLIC size=4 offset=4:
35  integer(1) :: d3          !CHECK: d3, PUBLIC size=1 offset=0:
36  real(2) :: d4             !CHECK: d4, PUBLIC size=2 offset=0:
37  common /common1/ d3,d2,d1 !CHECK: common1 size=10 offset=0: CommonBlockDetails alignment=4:
38  common /common2/ d4       !CHECK: common2 size=2 offset=0: CommonBlockDetails alignment=2:
39end
40
41! Test extension of common block size through equivalence statements.
42module me
43  integer :: i1, j1, l1(10)
44  equivalence(i1, l1)
45  common /common3/ j1, i1   ! CHECK: common3 size=44 offset=0: CommonBlockDetails alignment=4:
46
47  integer :: i2, j2, l2(10)
48  equivalence(i2, l2(2))
49  common /common4/ j2, i2   ! CHECK: common4 size=40 offset=0: CommonBlockDetails alignment=4:
50
51  integer :: i3, j3, l3(10)
52  equivalence(i3, l3)
53  common /common5/ i3, j3   ! CHECK: common5 size=40 offset=0: CommonBlockDetails alignment=4:
54
55  integer :: i4, j4, l4(10), k4(10)
56  equivalence(i4, l4)
57  equivalence(l4(10), k4)
58  common /common6/ i4, j4   ! CHECK: common6 size=76 offset=0: CommonBlockDetails alignment=4:
59
60  integer :: i5, j5, l5(10)
61  equivalence(l5(1), i5)
62  common /common7/ j5, i5   ! CHECK: common7 size=44 offset=0: CommonBlockDetails alignment=4:
63
64  real :: a1, a2, a3(2)
65  equivalence(a1,a3(1)),(a2,a3(2))
66  common /common8/ a1, a2   ! CHECK: common8 size=8 offset=0: CommonBlockDetails alignment=4:
67end
68
69! Ensure EQUIVALENCE of undeclared names in internal subprogram doesn't
70! attempt to host-associate
71subroutine host1
72 contains
73  subroutine internal
74    common /b/ x(4)  ! CHECK: x (Implicit) size=16 offset=0: ObjectEntity type: REAL(4) shape: 1_8:4_8
75    equivalence(x,y) ! CHECK: y (Implicit) size=4 offset=0: ObjectEntity type: REAL(4)
76  end
77end
78