! RUN: %f18 -funparse-with-symbols -DSTRICT_F18 -Mstandard %s 2>&1 | FileCheck %s ! RUN: %f18 -funparse-with-symbols -DARCHAIC_FORTRAN %s 2>&1 | FileCheck %s ! CHECK-NOT: :{{[[:space:]]}}error:{{[[:space:]]}} ! FIXME: the above check line does not work because diags are not emitted with error: in them. ! these are the conformance tests ! define STRICT_F18 to eliminate tests of features not in F18 ! define ARCHAIC_FORTRAN to add test of feature found in Fortran before F95 subroutine sub00(a,b,n,m) integer :: n, m real a(n) real :: b(m) 1 print *, n, m 1234 print *, a(n), b(1) 99999 print *, a(1), b(m) end subroutine sub00 subroutine do_loop01(a,n) integer :: n real, dimension(n) :: a do 10 i = 1, n print *, i, a(i) 10 continue end subroutine do_loop01 subroutine do_loop02(a,n) integer :: n real, dimension(n,n) :: a do 10 j = 1, n do 10 i = 1, n print *, i, j, a(i, j) 10 continue end subroutine do_loop02 #ifndef STRICT_F18 subroutine do_loop03(a,n) integer :: n real, dimension(n) :: a do 10 i = 1, n 10 print *, i, a(i) ! extension (not f18) end subroutine do_loop03 subroutine do_loop04(a,n) integer :: n real :: a(n,n) do 10 j = 1, n do 10 i = 1, n 10 print *, i, j, a(i, j) ! extension (not f18) end subroutine do_loop04 subroutine do_loop05(a,n) integer :: n real a(n,n,n) do 10 k = 1, n do 10 j = 1, n do 10 i = 1, n 10 print *, a(i, j, k) ! extension (not f18) end subroutine do_loop05 #endif subroutine do_loop06(a,n) integer :: n real, dimension(n) :: a loopname: do i = 1, n print *, i, a(i) if (i .gt. 50) then 678 exit end if end do loopname end subroutine do_loop06 subroutine do_loop07(a,n) integer :: n real, dimension(n,n) :: a loopone: do j = 1, n looptwo: do i = 1, n print *, i, j, a(i, j) end do looptwo end do loopone end subroutine do_loop07 #ifndef STRICT_F18 subroutine do_loop08(a,b,n,m,nn) integer :: n, m, nn real, dimension(n,n) :: a real b(m,nn) loopone: do j = 1, n condone: if (m .lt. n) then looptwo: do i = 1, m condtwo: if (n .lt. nn) then b(m-i,j) = s(m-i,j) if (i .eq. j) then goto 111 end if else cycle loopone end if condtwo end do looptwo else if (n .lt. m) then loopthree: do i = 1, n condthree: if (n .lt. nn) then a(i,j) = b(i,j) if (i .eq. j) then return end if else exit loopthree end if condthree end do loopthree end if condone end do loopone 111 print *, "done" end subroutine do_loop08 #endif #ifndef STRICT_F18 ! extended ranges supported by PGI, gfortran gives warnings subroutine do_loop09(a,n,j) integer :: n real a(n) goto 400 200 print *, "found the index", j print *, "value at", j, "is", a(j) goto 300 ! FIXME: emits diagnostic even without -Mstandard 400 do 100 i = 1, n if (i .eq. j) then goto 200 ! extension: extended GOTO ranges 300 continue else print *, a(i) end if 100 end do 500 continue end subroutine do_loop09 #endif subroutine goto10(a,b,n) dimension :: a(3), b(3) goto 10 10 print *,"x" 4 labelit: if (a(n-1) .ne. b(n-2)) then goto 567 end if labelit 567 end subroutine goto10 subroutine computed_goto11(i,j,k) goto (100,110,120) i 100 print *, j goto 200 110 print *, k goto 200 120 print *, -1 200 end subroutine computed_goto11 #ifndef STRICT_F18 subroutine arith_if12(i) if (i) 300,310,320 300 continue print *,"<" goto 340 310 print *,"==" 340 goto 330 320 print *,">" 330 goto 350 350 continue end subroutine arith_if12 #endif #ifndef STRICT_F18 subroutine alt_return_spec13(i,*,*,*) 9 continue 8 labelme: if (i .lt. 42) then 7 return 1 6 else if (i .lt. 94) then 5 return 2 4 else if (i .lt. 645) then 3 return 3 2 end if labelme 1 end subroutine alt_return_spec13 subroutine alt_return_spec14(i) call alt_return_spec13(i,*6000,*6130,*6457) print *, "Hi!" 6000 continue 6100 print *,"123" 6130 continue 6400 print *,"abc" 6457 continue 6650 print *,"!@#" end subroutine alt_return_spec14 #endif #ifndef STRICT_F18 subroutine specifiers15(a,b,x) integer x OPEN (10, file="myfile.dat", err=100) READ (10,20,end=200,size=x,advance='no',eor=300) a goto 99 99 CLOSE (10) goto 40 100 print *,"error opening" 101 return 200 print *,"end of file" 202 return 300 print *, "end of record" 303 return 20 FORMAT (1x,F5.1) 30 FORMAT (2x,F6.2) 40 OPEN (11, file="myfile2.dat", err=100) goto 50 50 WRITE (11,30,err=100) b CLOSE (11) end subroutine specifiers15 #endif #if !defined(STRICT_F18) && defined(ARCHAIC_FORTRAN) ! assigned goto was deleted in F95. PGI supports, gfortran gives warnings subroutine assigned_goto16 assign 10 to i goto i (10, 20, 30) 10 continue assign 20 to i 20 continue assign 30 to i 30 pause print *, "archaic feature!" end subroutine assigned_goto16 #endif