File: recursive_reference_1.f90

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (50 lines) | stat: -rw-r--r-- 1,455 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
! { dg-do compile }
! Tests the patch for PR27613, in which directly recursive, scalar
! functions were generating an "unclassifiable statement" error
! for the recursive statement(s).  This was subsequently determined
! to be wrong code and the error on 'bad_stuff' was removed.
! See 12.5.2.1 of the standard and PR30876.
!
! Based on PR testcase by Nicolas Bock  <nicolasbock@gmail.com>
!
program test
  if (original_stuff(1) .ne. 5) STOP 1
  if (scalar_stuff(-4) .ne. 10) STOP 2
  if (any (array_stuff((/-19,-30/)) .ne. (/25,25/))) STOP 3
contains
  recursive function original_stuff(n)
    integer :: original_stuff
    integer :: n
    original_stuff = 1
    if(n < 5) then
      original_stuff = original_stuff + original_stuff (n+1) ! { dg-error "name of a recursive function" }
    endif
  end function original_stuff

  recursive function scalar_stuff(n) result (tmp)
    integer :: tmp
    integer :: n
    tmp = 1
    if(n < 5) then
      tmp = tmp + scalar_stuff (n+1)
    endif
  end function scalar_stuff

  recursive function array_stuff(n) result (tmp)
    integer :: tmp (2)
    integer :: n (2)
    tmp = 1
    if(maxval (n) < 5) then
      tmp = tmp + array_stuff (n+1)
    endif
  end function array_stuff

  recursive function bad_stuff(n)
    integer :: bad_stuff (2)
    integer :: n(2)
    bad_stuff = 1
    if(maxval (n) < 5) then
      bad_stuff = bad_stuff + bad_stuff (n+1)
    endif
  end function bad_stuff
end program test