C { dg-options "-fprofile-arcs -ftest-coverage" }
C { dg-do run { target native } }
C
C Test gcov reports for line counts and branch and call return percentages
C for various Fortran 77 constructs to catch basic regressions in the
C functionality.

      program gcov1
      implicit none
      integer i,j,k,n
      integer result
      integer lpall, ieall, gtall
      integer lpval, ieval, gtval

					! returns(100)
      lpval = lpall()			! count(1)
					! returns(100)
      ieval = ieall()			! count(1)
					! returns(100)
      gtval = gtall()			! count(1)
					! returns(end)
      if ((lpval .ne. 1) .or. (ieval .ne. 1) .or. (gtval .ne. 1)) then
         call abort
      end if
      
      end

C Pass a value through a function to thwart optimization.
      integer function foo(i)
      implicit none
      integer i
      foo = i				! count(18)
      end

C Test various flavors of GOTO and compare results against expected values.
      integer function gtall()
      implicit none
      integer gt1, gt2, gt3, gt4, gt5
      integer gtval

      gtall = 1				! count(1)
      gtval = 0				! count(1)
					! returns(100)
      gtval = gtval + gt1(0)		! count(1)
					! returns(100)
      gtval = gtval + gt1(1)		! count(1)
					! returns(end)
					! branch(0)
      if (gtval .ne. 3) then		! count(1)
					! branch(end)
         print *,"gtall part 1:  ", gtval, 3
         gtall = 0
      end if

      gtval = 0				! count(1)
					! returns(100)
      gtval = gtval + gt2(9)		! count(1)
					! returns(100)
      gtval = gtval + gt2(20)		! count(1)
					! returns(end)
					! branch(0)
      if (gtval .ne. 12) then		! count(1)
					! branch(end)
         print *,"gtall part 2:  ", gtval, 12
         gtall = 0
      end if

      gtval = 0				! count(1)
					! returns(100)
      gtval = gtval + gt3(0)		! count(1)
					! returns(100)
      gtval = gtval + gt3(3)		! count(1)
					! returns(end)
					! branch(0)
      if (gtval .ne. 48) then		! count(1)
					! branch(end)
					! branch(end)
         print *,"gtall part 3:  ", gtval, 48
         gtall = 0
      end if

      gtval = 0				! count(1)
					! returns(100)
      gtval = gtval + gt4(1)		! count(1)
					! returns(100)
      gtval = gtval + gt4(2)		! count(1)
					! returns(100)
      gtval = gtval + gt4(3)		! count(1)
					! returns(end)
					! branch(0)
      if (gtval .ne. 14) then		! count(1)
					! branch(end)
         print *,"gtall part 4:  ", gtval, 14
         gtall = 0
      end if

      gtval = 0				! count(1)
					! returns(100)
      gtval = gtval + gt5(0)		! count(1)
					! returns(100)
      gtval = gtval + gt5(-1)		! count(1)
					! returns(100)
      gtval = gtval + gt5(5)		! count(1)
					! returns(end)
					! branch(0)
      if (gtval .ne. 14) then		! count(1)
					! branch(end)
         print *,"gtall part 5:  ", gtval, 14
         gtall = 0
      end if
      end

C Test simple GOTO.
      integer function gt1(f)
      implicit none
      integer f
					! branch(50)
      if (f .ne. 0) goto 100		! count(2)
					! branch(end)
      gt1 = 1				! count(1)
					! branch(100)
      goto 101				! count(1)
					! branch(end)
  100 gt1 = 2				! count(1)
  101 continue				! count(2)
      end

C Test simple GOTO again, this time out of a DO loop.
      integer function gt2(f)
      implicit none
      integer f
      integer i
					! branch(95)
      do i=1,10
					! branch(end)
         if (i .eq. f) goto 100		! count(19)
      end do
      gt2 = 4				! count(1)
					! branch(100)
      goto 101				! count(1)
					! branch(end)
  100 gt2 = 8				! count(1)
  101 continue				! count(2)
      end

C Test computed GOTO.
      integer function gt3(i)
      implicit none
      integer i
      goto (101, 102, 103, 104), i	! count(2)
      gt3 = 8				! count(1)
					! branch(100)
      goto 105				! count(1)
					! branch(end)
  101 gt3 = 1024
      goto 105
  102 gt3 = 2048
      goto 105
  103 gt3 = 16				! count(1)
					! branch(100)
      goto 105				! count(1)
					! branch(end)
  104 gt3 = 4096
      goto 105
  105 gt3 = gt3 * 2			! count(2)
      end

C Test assigned GOTO.
      integer function gt4(i)
      implicit none
      integer i
      integer label
      assign 101 to label		! count(3)
      if (i .eq. 2) assign 102 to label	! count(3)
      if (i .eq. 3) assign 103 to label	! count(3)
      goto label, (101, 102, 103)	! count(3)
  101 gt4 = 1				! count(1)
      goto 104				! count(1)
  102 gt4 = 2				! count(1)
      goto 104				! count(1)
  103 gt4 = 4				! count(1)
  104 gt4 = gt4 * 2			! count(3)
      end

C Test arithmetic IF (bundled with the GOTO variants).
      integer function gt5(i)
      implicit none
      integer i
      gt5 = 1				! count(3)
					! branch(67 50)
      if (i) 101, 102, 103		! count(3)
					! branch(end)
  101 gt5 = 2				! count(1)
      goto 104				! count(1)
  102 gt5 = 4				! count(1)
      goto 104				! count(1)
  103 gt5 = 8				! count(1)
  104 continue				! count(3)
      end

C Run all of the loop tests and check results against expected values.
      integer function lpall()
      implicit none
      integer loop1, loop2
      integer loopval

      lpall = 1				! count(1)
      loopval = 0			! count(1)
					! returns(100)
      loopval = loopval + loop1(1,0)	! count(1)
					! returns(100)
      loopval = loopval + loop1(1,2)	! count(1)
					! returns(100)
      loopval = loopval + loop1(1,7)	! count(1)
					! returns(end)
      if (loopval .ne. 12) then		! count(1)
         print *,"lpall part 1:  ", loopval, 12
         lpall = 0
      end if

      loopval = 0				! count(1)
						! returns(100)
      loopval = loopval + loop2(1,0,0,0)	! count(1)
						! returns(100)
      loopval = loopval + loop2(1,1,0,0)	! count(1)
						! returns(100)
      loopval = loopval + loop2(1,1,3,0)	! count(1)
						! returns(100)
      loopval = loopval + loop2(1,1,3,1)	! count(1)
						! returns(100)
      loopval = loopval + loop2(1,3,1,5)	! count(1)
						! returns(100)
      loopval = loopval + loop2(1,3,7,3)	! count(1)
						! returns(end)
      if (loopval .ne. 87) then			! count(1)
         print *,"lpall part 2:  ", loopval, 87
         lpall = 0
      end if
      end

C Test a simple DO loop.
      integer function loop1(r,n)
      implicit none
      integer r,n,i

      loop1 = r				! count(3)
					! branch(75)
      do i=1,n
					! branch(end)
         loop1 = loop1 + 1		! count(9)
      end do
      end

C Test nested DO loops.
      integer function loop2(r, l, m, n)
      implicit none
      integer r,l,m,n
      integer i,j,k
      loop2 = r				! count(6)
					! branch(60)
      do i=1,l
					! branch(77)
         do j=1,m
					! branch(73)
            do k=1,n
					! branch(end)
               loop2 = loop2 + 1	! count(81)
            end do
         end do
      end do
      end

C Test various combinations of IF-THEN-ELSE and check results against
C expected values.
      integer function ieall()
      implicit none
      integer ie1, ie2, ie3
      integer ieval
      ieall = 1				! count(1)
      ieval = 0				! count(1)
      
      ieval = ieval + ie1(0,2)		! count(1)
      ieval = ieval + ie1(0,0)		! count(1)
      ieval = ieval + ie1(1,2)		! count(1)
      ieval = ieval + ie1(10,2)		! count(1)
      ieval = ieval + ie1(11,11)	! count(1)
      if (ieval .ne. 31) then		! count(1)
         print *,"ieall part 1:  ", ieval, 31
         ieall = 0
      end if

      ieval = 0	
      ieval = ieval + ie2(0)		! count(1)
      ieval = ieval + ie2(2)		! count(1)
      ieval = ieval + ie2(2)		! count(1)
      ieval = ieval + ie2(2)		! count(1)
      ieval = ieval + ie2(3)		! count(1)
      ieval = ieval + ie2(3)		! count(1)
      if (ieval .ne. 23) then		! count(1)
         print *,"ieall part 2:  ", ieval, 23
         ieall = 0
      end if

      ieval = 0
      ieval = ieval + ie3(11,19)	! count(1)
      ieval = ieval + ie3(25,27)	! count(1)
      ieval = ieval + ie3(11,22)	! count(1)
      ieval = ieval + ie3(11,10)	! count(1)
      ieval = ieval + ie3(21,32)	! count(1)
      ieval = ieval + ie3(21,20)	! count(1)
      ieval = ieval + ie3(1,2)		! count(1)
      ieval = ieval + ie3(32,31)	! count(1)
      ieval = ieval + ie3(3,0)		! count(1)
      ieval = ieval + ie3(0,47)		! count(1)
      ieval = ieval + ie3(65,65)	! count(1)
      if (ieval .ne. 246) then		! count(1)
         print *,"ieall part 3:  ", ieval, 246
         ieall = 0
      end if
      end

C Test IF-THEN-ELSE.
      integer function ie1(i,j)
      implicit none
      integer i,j
      integer foo

      ie1 = 0				! count(5)
					! branch(40)
      if (i .ne. 0) then		! count(5)
					! branch(0)
         if (j .ne. 0) then		! count(3)
					! branch(end)
            ie1 = foo(4)		! count(3)
         else
            ie1 = foo(1024)
         end if
      else
					! branch(50)
         if (j .ne. 0) then		! count(2)
					! branch(end)
            ie1 = foo(1)		! count(1)
         else
            ie1 = foo(2)		! count(1)
         end if
      end if
					! branch(80)
      if (i .gt. j) then		! count(5)
					! branch(end)
         ie1 = foo(ie1*2)
      end if
					! branch(80)
      if (i .gt. 10) then		! count(5)
					! branch(0)
         if (j .gt. 10) then		! count(1)
					! branch(end)
            ie1 = foo(ie1*4)		! count(1)
         end if
      end if
      end

C Test a series of simple IF-THEN statements.
      integer function ie2(i)
      implicit none
      integer i
      integer foo
      ie2 = 0				! count(6)

					! branch(83)
      if (i .eq. 0) then		! count(6)
					! branch(end)
         ie2 = foo(1)			! count(1)
      end if
					! branch(100)
      if (i .eq. 1) then		! count(6)
					! branch(end)
         ie2 = foo(1024)
      end if
					! branch(50)
      if (i .eq. 2) then		! count(6)
					! branch(end)
         ie2 = foo(2)			! count(3)
      end if
					! branch(67)
      if (i .eq. 3) then		! count(6)
					! branch(end)
         ie2 = foo(8)			! count(2)
      end if
					! branch(100)
      if (i .eq. 4) then		! count(6)
					! branch(end)
         ie2 = foo(2048)
      end if

      end

C Test nested IF statements and IF with compound expressions.
      integer function ie3(i,j)
      implicit none
      integer i,j
      integer foo

      ie3 = 1				! count(11)
					! branch(27 50 75)
      if ((i .gt. 10) .and. (j .gt. i) .and. (j .lt. 20)) then ! count(11)
					! branch(end)
         ie3 = foo(16)			! count(1)
      end if
					! branch(55)
      if (i .gt. 20) then		! count(11)
					! branch(60)
         if (j .gt. i) then		! count(5)
					! branch(50)
            if (j .lt. 30) then		! count(2)
					! branch(end)
               ie3 = foo(32)		! count(1)
            end if
         end if
      end if
					! branch(9 10 11)
      if ((i .eq. 3) .or. (j .eq. 47) .or. (i .eq.j)) then ! count(11)
					! branch(end)
         ie3 = foo(64)			! count(3)
      end if
      end
C
C { dg-final { run-gcov -b gcov-1.f } }
