The scope model used for branch target checking treats a label on an END SELECT statement as if it were in the previous CASE block. This makes it illegal to GO TO that label from within any earlier CASE block in that statement. Fix by treating the CASE blocks as nested scopes within the scope of the SELECT construct. Also, add a "warning:" tag to related warning messages. Differential Revision: https://reviews.llvm.org/D127425
61 lines
1.3 KiB
Fortran
61 lines
1.3 KiB
Fortran
! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s
|
|
! CHECK: Label '50' was not found
|
|
! CHECK: warning: Label '55' is in a construct that should not be used as a branch target here
|
|
! CHECK: Label '70' is not a branch target
|
|
! CHECK: Control flow use of '70'
|
|
! CHECK: error: Label '80' is in a construct that prevents its use as a branch target here
|
|
! CHECK: error: Label '90' is in a construct that prevents its use as a branch target here
|
|
! CHECK: error: Label '91' is in a construct that prevents its use as a branch target here
|
|
! CHECK: error: Label '92' is in a construct that prevents its use as a branch target here
|
|
|
|
subroutine sub00(a,b,n,m)
|
|
real a(n,m)
|
|
real b(n,m)
|
|
if (n .ne. m) then
|
|
goto 50
|
|
end if
|
|
6 n = m
|
|
end subroutine sub00
|
|
|
|
subroutine sub01(a,b,n,m)
|
|
real a(n,m)
|
|
real b(n,m)
|
|
if (n .ne. m) then
|
|
goto 55
|
|
else
|
|
55 continue
|
|
end if
|
|
60 n = m
|
|
end subroutine sub01
|
|
|
|
subroutine sub02(a,b,n,m)
|
|
real a(n,m)
|
|
real b(n,m)
|
|
if (n .ne. m) then
|
|
goto 70
|
|
else
|
|
return
|
|
end if
|
|
70 FORMAT (1x,i6)
|
|
end subroutine sub02
|
|
|
|
subroutine sub03(a,n)
|
|
real a(n)
|
|
forall (j=1:n)
|
|
80 a(n) = j
|
|
end forall
|
|
go to 80
|
|
end subroutine sub03
|
|
|
|
subroutine sub04(a,n)
|
|
real a(n)
|
|
where (a > 0)
|
|
90 a = 1
|
|
elsewhere (a < 0)
|
|
91 a = 2
|
|
elsewhere
|
|
92 a = 3
|
|
end where
|
|
if (n - 3) 90, 91, 92
|
|
end subroutine sub04
|