xref: /llvm-project/flang/test/Semantics/label01.F90 (revision 31ad5c14fefa66085eff3629c0cc8393556ba849)
1*31ad5c14SArnamoy Bhattacharyya! RUN: %flang_fc1 -fdebug-unparse-with-symbols -DSTRICT_F18 -pedantic %s 2>&1 | FileCheck %s
2*31ad5c14SArnamoy Bhattacharyya! RUN: %flang_fc1 -fdebug-unparse-with-symbols -DARCHAIC_FORTRAN %s 2>&1 | FileCheck %s
305756e69STim Keith! CHECK-NOT: :{{[[:space:]]}}error:{{[[:space:]]}}
49c98ed9cSRichard Barton! FIXME: the above check line does not work because diags are not emitted with error: in them.
564ab3302SCarolineConcatto
664ab3302SCarolineConcatto! these are the conformance tests
764ab3302SCarolineConcatto! define STRICT_F18 to eliminate tests of features not in F18
864ab3302SCarolineConcatto! define ARCHAIC_FORTRAN to add test of feature found in Fortran before F95
964ab3302SCarolineConcatto
1064ab3302SCarolineConcattosubroutine sub00(a,b,n,m)
1164ab3302SCarolineConcatto  integer :: n, m
1264ab3302SCarolineConcatto  real a(n)
1364ab3302SCarolineConcatto  real :: b(m)
1464ab3302SCarolineConcatto1 print *, n, m
1564ab3302SCarolineConcatto1234 print *, a(n), b(1)
1664ab3302SCarolineConcatto99999 print *, a(1), b(m)
1764ab3302SCarolineConcattoend subroutine sub00
1864ab3302SCarolineConcatto
1964ab3302SCarolineConcattosubroutine do_loop01(a,n)
2064ab3302SCarolineConcatto  integer :: n
2164ab3302SCarolineConcatto  real, dimension(n) :: a
2264ab3302SCarolineConcatto  do 10 i = 1, n
2364ab3302SCarolineConcatto     print *, i, a(i)
2464ab3302SCarolineConcatto10   continue
2564ab3302SCarolineConcattoend subroutine do_loop01
2664ab3302SCarolineConcatto
2764ab3302SCarolineConcattosubroutine do_loop02(a,n)
2864ab3302SCarolineConcatto  integer :: n
2964ab3302SCarolineConcatto  real, dimension(n,n) :: a
3064ab3302SCarolineConcatto  do 10 j = 1, n
3164ab3302SCarolineConcatto     do 10 i = 1, n
3264ab3302SCarolineConcatto        print *, i, j, a(i, j)
3364ab3302SCarolineConcatto10      continue
3464ab3302SCarolineConcattoend subroutine do_loop02
3564ab3302SCarolineConcatto
3664ab3302SCarolineConcatto#ifndef STRICT_F18
3764ab3302SCarolineConcattosubroutine do_loop03(a,n)
3864ab3302SCarolineConcatto  integer :: n
3964ab3302SCarolineConcatto  real, dimension(n) :: a
4064ab3302SCarolineConcatto  do 10 i = 1, n
4164ab3302SCarolineConcatto10   print *, i, a(i)		! extension (not f18)
4264ab3302SCarolineConcattoend subroutine do_loop03
4364ab3302SCarolineConcatto
4464ab3302SCarolineConcattosubroutine do_loop04(a,n)
4564ab3302SCarolineConcatto  integer :: n
4664ab3302SCarolineConcatto  real :: a(n,n)
4764ab3302SCarolineConcatto  do 10 j = 1, n
4864ab3302SCarolineConcatto     do 10 i = 1, n
4964ab3302SCarolineConcatto10      print *, i, j, a(i, j)	! extension (not f18)
5064ab3302SCarolineConcattoend subroutine do_loop04
5164ab3302SCarolineConcatto
5264ab3302SCarolineConcattosubroutine do_loop05(a,n)
5364ab3302SCarolineConcatto  integer :: n
5464ab3302SCarolineConcatto  real a(n,n,n)
5564ab3302SCarolineConcatto  do 10 k = 1, n
5664ab3302SCarolineConcatto     do 10 j = 1, n
5764ab3302SCarolineConcatto        do 10 i = 1, n
5864ab3302SCarolineConcatto10         print *, a(i, j, k)	! extension (not f18)
5964ab3302SCarolineConcattoend subroutine do_loop05
6064ab3302SCarolineConcatto#endif
6164ab3302SCarolineConcatto
6264ab3302SCarolineConcattosubroutine do_loop06(a,n)
6364ab3302SCarolineConcatto  integer :: n
6464ab3302SCarolineConcatto  real, dimension(n) :: a
6564ab3302SCarolineConcatto  loopname: do i = 1, n
6664ab3302SCarolineConcatto     print *, i, a(i)
6764ab3302SCarolineConcatto     if (i .gt. 50) then
6864ab3302SCarolineConcatto678     exit
6964ab3302SCarolineConcatto     end if
7064ab3302SCarolineConcatto  end do loopname
7164ab3302SCarolineConcattoend subroutine do_loop06
7264ab3302SCarolineConcatto
7364ab3302SCarolineConcattosubroutine do_loop07(a,n)
7464ab3302SCarolineConcatto  integer :: n
7564ab3302SCarolineConcatto  real, dimension(n,n) :: a
7664ab3302SCarolineConcatto  loopone: do j = 1, n
7764ab3302SCarolineConcatto     looptwo: do i = 1, n
7864ab3302SCarolineConcatto        print *, i, j, a(i, j)
7964ab3302SCarolineConcatto     end do looptwo
8064ab3302SCarolineConcatto  end do loopone
8164ab3302SCarolineConcattoend subroutine do_loop07
8264ab3302SCarolineConcatto
839c98ed9cSRichard Barton#ifndef STRICT_F18
8464ab3302SCarolineConcattosubroutine do_loop08(a,b,n,m,nn)
8564ab3302SCarolineConcatto  integer :: n, m, nn
8664ab3302SCarolineConcatto  real, dimension(n,n) :: a
8764ab3302SCarolineConcatto  real b(m,nn)
8864ab3302SCarolineConcatto  loopone: do j = 1, n
8964ab3302SCarolineConcatto     condone: if (m .lt. n) then
9064ab3302SCarolineConcatto        looptwo: do i = 1, m
9164ab3302SCarolineConcatto           condtwo: if (n .lt. nn) then
9264ab3302SCarolineConcatto              b(m-i,j) = s(m-i,j)
9364ab3302SCarolineConcatto              if (i .eq. j) then
9464ab3302SCarolineConcatto                 goto 111
9564ab3302SCarolineConcatto              end if
9664ab3302SCarolineConcatto           else
9764ab3302SCarolineConcatto              cycle loopone
9864ab3302SCarolineConcatto           end if condtwo
9964ab3302SCarolineConcatto        end do looptwo
10064ab3302SCarolineConcatto     else if (n .lt. m) then
10164ab3302SCarolineConcatto        loopthree: do i = 1, n
10264ab3302SCarolineConcatto           condthree: if (n .lt. nn) then
10364ab3302SCarolineConcatto              a(i,j) = b(i,j)
10464ab3302SCarolineConcatto              if (i .eq. j) then
10564ab3302SCarolineConcatto                 return
10664ab3302SCarolineConcatto              end if
10764ab3302SCarolineConcatto           else
10864ab3302SCarolineConcatto              exit loopthree
10964ab3302SCarolineConcatto           end if condthree
11064ab3302SCarolineConcatto        end do loopthree
11164ab3302SCarolineConcatto     end if condone
11264ab3302SCarolineConcatto  end do loopone
11364ab3302SCarolineConcatto111 print *, "done"
11464ab3302SCarolineConcattoend subroutine do_loop08
1159c98ed9cSRichard Barton#endif
11664ab3302SCarolineConcatto
11764ab3302SCarolineConcatto#ifndef STRICT_F18
11864ab3302SCarolineConcatto! extended ranges supported by PGI, gfortran gives warnings
11964ab3302SCarolineConcattosubroutine do_loop09(a,n,j)
12064ab3302SCarolineConcatto  integer :: n
12164ab3302SCarolineConcatto  real a(n)
12264ab3302SCarolineConcatto  goto 400
12364ab3302SCarolineConcatto200 print *, "found the index", j
12464ab3302SCarolineConcatto  print *, "value at", j, "is", a(j)
125*31ad5c14SArnamoy Bhattacharyya  goto 300 ! FIXME: emits diagnostic even without -pedantic
12664ab3302SCarolineConcatto400  do 100 i = 1, n
12764ab3302SCarolineConcatto     if (i .eq. j) then
12864ab3302SCarolineConcatto        goto 200	! extension: extended GOTO ranges
12964ab3302SCarolineConcatto300     continue
13064ab3302SCarolineConcatto     else
13164ab3302SCarolineConcatto        print *, a(i)
13264ab3302SCarolineConcatto     end if
13364ab3302SCarolineConcatto100 end do
13464ab3302SCarolineConcatto500 continue
13564ab3302SCarolineConcattoend subroutine do_loop09
13664ab3302SCarolineConcatto#endif
13764ab3302SCarolineConcatto
13864ab3302SCarolineConcattosubroutine goto10(a,b,n)
13964ab3302SCarolineConcatto  dimension :: a(3), b(3)
14064ab3302SCarolineConcatto  goto 10
14164ab3302SCarolineConcatto10 print *,"x"
14264ab3302SCarolineConcatto4 labelit: if (a(n-1) .ne. b(n-2)) then
14364ab3302SCarolineConcatto     goto 567
14464ab3302SCarolineConcatto  end if labelit
14564ab3302SCarolineConcatto567 end subroutine goto10
14664ab3302SCarolineConcatto
14764ab3302SCarolineConcattosubroutine computed_goto11(i,j,k)
14864ab3302SCarolineConcatto  goto (100,110,120) i
14964ab3302SCarolineConcatto100 print *, j
15064ab3302SCarolineConcatto  goto 200
15164ab3302SCarolineConcatto110 print *, k
15264ab3302SCarolineConcatto  goto 200
15364ab3302SCarolineConcatto120 print *, -1
15464ab3302SCarolineConcatto200 end subroutine computed_goto11
15564ab3302SCarolineConcatto
15664ab3302SCarolineConcatto#ifndef STRICT_F18
15764ab3302SCarolineConcattosubroutine arith_if12(i)
15864ab3302SCarolineConcatto  if (i) 300,310,320
15964ab3302SCarolineConcatto300 continue
16064ab3302SCarolineConcatto  print *,"<"
16164ab3302SCarolineConcatto  goto 340
16264ab3302SCarolineConcatto310 print *,"=="
16364ab3302SCarolineConcatto340 goto 330
16464ab3302SCarolineConcatto320 print *,">"
16564ab3302SCarolineConcatto330 goto 350
16664ab3302SCarolineConcatto350 continue
16764ab3302SCarolineConcattoend subroutine arith_if12
16864ab3302SCarolineConcatto#endif
16964ab3302SCarolineConcatto
1709c98ed9cSRichard Barton#ifndef STRICT_F18
17164ab3302SCarolineConcattosubroutine alt_return_spec13(i,*,*,*)
17264ab3302SCarolineConcatto9 continue
17364ab3302SCarolineConcatto8 labelme: if (i .lt. 42) then
17464ab3302SCarolineConcatto7  return 1
17564ab3302SCarolineConcatto6 else if (i .lt. 94) then
17664ab3302SCarolineConcatto5  return 2
17764ab3302SCarolineConcatto4 else if (i .lt. 645) then
17864ab3302SCarolineConcatto3  return 3
17964ab3302SCarolineConcatto2 end if labelme
18064ab3302SCarolineConcatto1 end subroutine alt_return_spec13
18164ab3302SCarolineConcatto
18264ab3302SCarolineConcattosubroutine alt_return_spec14(i)
18364ab3302SCarolineConcatto  call alt_return_spec13(i,*6000,*6130,*6457)
18464ab3302SCarolineConcatto  print *, "Hi!"
18564ab3302SCarolineConcatto6000 continue
18664ab3302SCarolineConcatto6100 print *,"123"
18764ab3302SCarolineConcatto6130 continue
18864ab3302SCarolineConcatto6400 print *,"abc"
18964ab3302SCarolineConcatto6457 continue
19064ab3302SCarolineConcatto6650 print *,"!@#"
19164ab3302SCarolineConcattoend subroutine alt_return_spec14
19264ab3302SCarolineConcatto#endif
19364ab3302SCarolineConcatto
1949c98ed9cSRichard Barton#ifndef STRICT_F18
19564ab3302SCarolineConcattosubroutine specifiers15(a,b,x)
19664ab3302SCarolineConcatto  integer x
19764ab3302SCarolineConcatto  OPEN (10, file="myfile.dat", err=100)
19864ab3302SCarolineConcatto  READ (10,20,end=200,size=x,advance='no',eor=300) a
19964ab3302SCarolineConcatto  goto 99
20064ab3302SCarolineConcatto99 CLOSE (10)
20164ab3302SCarolineConcatto  goto 40
20264ab3302SCarolineConcatto100 print *,"error opening"
20364ab3302SCarolineConcatto101 return
20464ab3302SCarolineConcatto200 print *,"end of file"
20564ab3302SCarolineConcatto202 return
20664ab3302SCarolineConcatto300 print *, "end of record"
20764ab3302SCarolineConcatto303 return
20864ab3302SCarolineConcatto20 FORMAT (1x,F5.1)
20964ab3302SCarolineConcatto30 FORMAT (2x,F6.2)
21064ab3302SCarolineConcatto40 OPEN (11, file="myfile2.dat", err=100)
21164ab3302SCarolineConcatto  goto 50
21264ab3302SCarolineConcatto50 WRITE (11,30,err=100) b
21364ab3302SCarolineConcatto  CLOSE (11)
21464ab3302SCarolineConcattoend subroutine specifiers15
2159c98ed9cSRichard Barton#endif
21664ab3302SCarolineConcatto
21764ab3302SCarolineConcatto#if !defined(STRICT_F18) && defined(ARCHAIC_FORTRAN)
21864ab3302SCarolineConcatto! assigned goto was deleted in F95. PGI supports, gfortran gives warnings
21964ab3302SCarolineConcattosubroutine assigned_goto16
22064ab3302SCarolineConcatto  assign 10 to i
22164ab3302SCarolineConcatto  goto i (10, 20, 30)
22264ab3302SCarolineConcatto10 continue
22364ab3302SCarolineConcatto  assign 20 to i
22464ab3302SCarolineConcatto20 continue
22564ab3302SCarolineConcatto  assign 30 to i
22664ab3302SCarolineConcatto30 pause
22764ab3302SCarolineConcatto  print *, "archaic feature!"
22864ab3302SCarolineConcattoend subroutine assigned_goto16
22964ab3302SCarolineConcatto#endif
230