xref: /llvm-project/flang/test/Lower/associate-construct.f90 (revision f35f863a88f83332bef9605ef4cfe4f05c066efb)
1! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
2
3! CHECK-LABEL: func @_QQmain
4program p
5  ! CHECK-DAG: [[I:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEi"}
6  ! CHECK-DAG: [[N:%[0-9]+]] = fir.alloca i32 {{{.*}}uniq_name = "_QFEn"}
7  ! CHECK: [[T:%[0-9]+]] = fir.alloca !fir.array<3xi32> {bindc_name = "t", uniq_name = "_QFEt"}
8  integer :: n, foo, t(3)
9  ! CHECK: [[N]]
10  ! CHECK-COUNT-3: fir.coordinate_of [[T]]
11  n = 100; t(1) = 111; t(2) = 222; t(3) = 333
12  ! CHECK: fir.load [[N]]
13  ! CHECK: addi {{.*}} %c5
14  ! CHECK: fir.store %{{[0-9]*}} to [[B:%[0-9]+]]
15  ! CHECK: [[C:%[0-9]+]] = fir.coordinate_of [[T]]
16  ! CHECK: fir.call @_QPfoo
17  ! CHECK: fir.store %{{[0-9]*}} to [[D:%[0-9]+]]
18  associate (a => n, b => n+5, c => t(2), d => foo(7))
19    ! CHECK: fir.load [[N]]
20    ! CHECK: addi %{{[0-9]*}}, %c1
21    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
22    a = a + 1
23    ! CHECK: fir.load [[C]]
24    ! CHECK: addi %{{[0-9]*}}, %c1
25    ! CHECK: fir.store %{{[0-9]*}} to [[C]]
26    c = c + 1
27    ! CHECK: fir.load [[N]]
28    ! CHECK: addi %{{[0-9]*}}, %c1
29    ! CHECK: fir.store %{{[0-9]*}} to [[N]]
30    n = n + 1
31    ! CHECK: fir.load [[N]]
32    ! CHECK: fir.embox [[T]]
33    ! CHECK: fir.load [[N]]
34    ! CHECK: fir.load [[B]]
35    ! CHECK: fir.load [[C]]
36    ! CHECK: fir.load [[D]]
37    print*, n, t, a, b, c, d ! expect: 102 111 223 333 102 105 223 7
38  end associate
39
40  call nest
41
42  do i=1,4
43    associate (x=>i)
44      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
45      ! CHECK: [[TWO:%.*]] = arith.constant 2 : i32
46      ! CHECK: arith.cmpi eq, [[IVAL]], [[TWO]] : i32
47      ! CHECK: ^bb
48      if (x==2) goto 9
49      ! CHECK: [[IVAL:%[0-9]+]] = fir.load [[I]] : !fir.ref<i32>
50      ! CHECK: [[THREE:%.*]] = arith.constant 3 : i32
51      ! CHECK: arith.cmpi eq, [[IVAL]], [[THREE]] : i32
52      ! CHECK: ^bb
53      ! CHECK: fir.call @_FortranAStopStatementText
54      ! CHECK: fir.unreachable
55      ! CHECK: ^bb
56      if (x==3) stop 'Halt'
57      ! CHECK: fir.call @_FortranAioOutputAscii
58      print*, "ok"
59  9 end associate
60  enddo
61end
62
63! CHECK-LABEL: func @_QPfoo
64integer function foo(x)
65  integer x
66  integer, save :: i = 0
67  i = i + x
68  foo = i
69end function foo
70
71! CHECK-LABEL: func @_QPnest(
72subroutine nest
73  integer, parameter :: n = 10
74  integer :: a(5), b(n)
75  associate (s => sequence(size(a)))
76    a = s
77    associate(t => sequence(n))
78      b = t
79      ! CHECK:   cond_br %{{.*}}, [[BB1:\^bb[0-9]]], [[BB2:\^bb[0-9]]]
80      ! CHECK: [[BB1]]:
81      ! CHECK:   br [[BB3:\^bb[0-9]]]
82      ! CHECK: [[BB2]]:
83      if (a(1) > b(1)) goto 9
84    end associate
85    a = a * a
86  end associate
87  ! CHECK:   br [[BB3]]
88  ! CHECK: [[BB3]]:
899 print *, sum(a), sum(b) ! expect: 55 55
90contains
91  function sequence(n)
92    integer sequence(n)
93    sequence = [(i,i=1,n)]
94  end function
95end subroutine nest
96