Internal subprograms have explicit interfaces. If an internal subprogram has an alternate return, we check its explicit interface. But we were not putting the label values of alternate returns into the actual argument. I fixed this by changing the definition of actual arguments to be able to contain a common::Label and putting the label for an alternate return into the actual argument. I also verified that we were already doing all of the semantic checking required for alternate returns and removed a "TODO" for this. I also added the test altreturn06.f90. Differential Revision: https://reviews.llvm.org/D94017
17 lines
472 B
Fortran
17 lines
472 B
Fortran
! RUN: %S/test_errors.sh %s %t %f18
|
|
! Test alternat return argument passing for internal and external subprograms
|
|
! Both of the following are OK
|
|
call extSubprogram (*100)
|
|
call intSubprogram (*100)
|
|
call extSubprogram (*101)
|
|
call intSubprogram (*101)
|
|
100 PRINT *,'First alternate return'
|
|
!ERROR: Label '101' is not a branch target
|
|
!ERROR: Label '101' is not a branch target
|
|
101 FORMAT("abc")
|
|
contains
|
|
subroutine intSubprogram(*)
|
|
return(1)
|
|
end subroutine
|
|
end
|