xref: /llvm-project/flang/test/Semantics/resolve108.f90 (revision 502e7690c3c9698a6982a490f6bf92b0fd24d10f)
193b0638eSPeter Klausler! RUN: %python %S/test_errors.py %s %flang_fc1
293b0638eSPeter Klausler! Tests attempts at forward references to local names in a FUNCTION prefix
393b0638eSPeter Klausler
493b0638eSPeter Klausler! This case is not an error, but will elicit bogus errors if the
593b0638eSPeter Klausler! result type of the function is badly resolved.
693b0638eSPeter Klauslermodule m1
793b0638eSPeter Klausler  type t1
893b0638eSPeter Klausler    sequence
993b0638eSPeter Klausler    integer not_m
1093b0638eSPeter Klausler  end type
1193b0638eSPeter Klausler contains
1293b0638eSPeter Klausler  type(t1) function foo(n)
1393b0638eSPeter Klausler    integer, intent(in) :: n
1493b0638eSPeter Klausler    type t1
1593b0638eSPeter Klausler      sequence
1693b0638eSPeter Klausler      integer m
1793b0638eSPeter Klausler    end type
1893b0638eSPeter Klausler    foo%m = n
1993b0638eSPeter Klausler  end function
2093b0638eSPeter Klauslerend module
2193b0638eSPeter Klausler
2293b0638eSPeter Klauslersubroutine s1
2393b0638eSPeter Klausler  use :: m1, only: foo
2493b0638eSPeter Klausler  type t1
2593b0638eSPeter Klausler    sequence
2693b0638eSPeter Klausler    integer m
2793b0638eSPeter Klausler  end type
2893b0638eSPeter Klausler  type(t1) x
2993b0638eSPeter Klausler  x = foo(234)
3093b0638eSPeter Klausler  print *, x
3193b0638eSPeter Klauslerend subroutine
3293b0638eSPeter Klausler
3393b0638eSPeter Klauslermodule m2
3493b0638eSPeter Klausler  integer, parameter :: k = kind(1.e0)
3593b0638eSPeter Klausler contains
3693b0638eSPeter Klausler  real(kind=k) function foo(n)
3793b0638eSPeter Klausler    integer, parameter :: k = kind(1.d0)
3893b0638eSPeter Klausler    integer, intent(in) :: n
3993b0638eSPeter Klausler    foo = n
4093b0638eSPeter Klausler  end function
4193b0638eSPeter Klauslerend module
4293b0638eSPeter Klausler
4393b0638eSPeter Klauslersubroutine s2
4493b0638eSPeter Klausler  use :: m2, only: foo
4593b0638eSPeter Klausler  !If we got the type of foo right, this declaration will fail
4693b0638eSPeter Klausler  !due to an attempted division by zero.
47*502e7690SPeter Klausler  !WARNING: INTEGER(4) division by zero
4893b0638eSPeter Klausler  !ERROR: Must be a constant value
496111ddedSPeter Klausler  integer, parameter :: test = 1 / (kind(foo(1)) - kind(1.d0))
5093b0638eSPeter Klauslerend subroutine
5193b0638eSPeter Klausler
5293b0638eSPeter Klauslermodule m3
536111ddedSPeter Klausler  real(kind=kind(1.0e0)) :: x
5493b0638eSPeter Klausler contains
5593b0638eSPeter Klausler  real(kind=kind(x)) function foo(x)
5693b0638eSPeter Klausler    real(kind=kind(1.0d0)) x
57*502e7690SPeter Klausler    !WARNING: INTEGER(4) division by zero
586111ddedSPeter Klausler    !ERROR: Must be a constant value
596111ddedSPeter Klausler    integer, parameter :: test = 1 / (kind(foo) - kind(1.d0))
6093b0638eSPeter Klausler    foo = n
6193b0638eSPeter Klausler  end function
6293b0638eSPeter Klauslerend module
6393b0638eSPeter Klausler
6493b0638eSPeter Klauslermodule m4
6593b0638eSPeter Klausler contains
6693b0638eSPeter Klausler  real(n) function foo(x)
676111ddedSPeter Klausler    !ERROR: 'foo' is not an object that can appear in an expression
6893b0638eSPeter Klausler    integer, parameter :: n = kind(foo)
6993b0638eSPeter Klausler    real(n), intent(in) :: x
706111ddedSPeter Klausler    !ERROR: 'x' is not an object that can appear in an expression
7193b0638eSPeter Klausler    foo = x
7293b0638eSPeter Klausler  end function
7393b0638eSPeter Klauslerend module
74