1! RUN: bbc %s -emit-fir -o - | FileCheck %s
2
3! Test trivial goto statement
4subroutine sub1()
5goto 1
61 stop
7end subroutine
8! CHECK-LABEL: sub1
9! CHECK:   cf.br ^[[BB1:.*]]
10! CHECK: ^[[BB1]]:
11! CHECK:   {{.*}} fir.call @_FortranAStopStatement({{.*}}, {{.*}}, {{.*}}) : (i32, i1, i1) -> none
12! CHECK: }
13
14! Test multiple goto statements
15subroutine sub2()
16goto 1
171 goto 2
182 goto 3
193 stop
20end subroutine
21! CHECK-LABEL: sub2
22! CHECK:   cf.br ^[[BB1:.*]]
23! CHECK: ^[[BB1]]:
24! CHECK:   cf.br ^[[BB2:.*]]
25! CHECK: ^[[BB2]]:
26! CHECK:   cf.br ^[[BB3:.*]]
27! CHECK: ^[[BB3]]:
28! CHECK:   {{.*}} fir.call @_FortranAStopStatement({{.*}}, {{.*}}, {{.*}}) : (i32, i1, i1) -> none
29! CHECK: }
30
31! Test goto which branches to a previous label
32subroutine sub3()
33pause
341 goto 3
352 stop
363 goto 2
37end subroutine
38! CHECK: sub3
39! CHECK:   {{.*}} fir.call @_FortranAPauseStatement() : () -> none
40! CHECK:   cf.br ^[[BB2:.*]]
41! CHECK: ^[[BB1:.*]]: //
42! CHECK:   {{.*}} fir.call @_FortranAStopStatement({{.*}}, {{.*}}, {{.*}}) : (i32, i1, i1) -> none
43! CHECK: ^[[BB2]]:
44! CHECK:   cf.br ^[[BB1]]
45! CHECK: }
46
47! Test removal of blocks (pauses) which are not reachable
48subroutine sub4()
49pause
501 goto 2
51pause
522 goto 3
53pause
543 goto 1
55pause
56end subroutine
57! CHECK-LABEL: sub4
58! CHECK:   {{.*}} fir.call @_FortranAPauseStatement() : () -> none
59! CHECK-NEXT:   cf.br ^[[BB1:.*]]
60! CHECK-NEXT: ^[[BB1]]:
61! CHECK-NEXT:   cf.br ^[[BB2:.*]]
62! CHECK-NEXT: ^[[BB2]]:
63! CHECK-NEXT:   cf.br ^[[BB3:.*]]
64! CHECK-NEXT: ^[[BB3]]:
65! CHECK-NEXT:   cf.br ^[[BB1]]
66! CHECK-NEXT: }
67