| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| integer :: y |
| procedure() :: a |
| procedure(real) :: b |
| call a ! OK - can be function or subroutine |
| !ERROR: Cannot call subroutine 'a' like a function |
| c = a() |
| !ERROR: Cannot call function 'b' like a subroutine |
| call b |
| !ERROR: Cannot call function 'y' like a subroutine |
| call y |
| call x |
| !ERROR: Cannot call subroutine 'x' like a function |
| z = x() |
| end |
| |
| subroutine s |
| !ERROR: Cannot call function 'f' like a subroutine |
| call f |
| !ERROR: Cannot call subroutine 's' like a function |
| i = s() |
| contains |
| function f() |
| end |
| end |
| |
| subroutine s2 |
| ! subroutine vs. function is determined by use |
| external :: a, b |
| call a() |
| !ERROR: Cannot call subroutine 'a' like a function |
| x = a() |
| x = b() |
| !ERROR: Cannot call function 'b' like a subroutine |
| call b() |
| end |
| |
| subroutine s3 |
| ! subroutine vs. function is determined by use, even in internal subprograms |
| external :: a |
| procedure() :: b |
| contains |
| subroutine s3a() |
| x = a() |
| call b() |
| end |
| subroutine s3b() |
| !ERROR: Cannot call function 'a' like a subroutine |
| call a() |
| !ERROR: Cannot call subroutine 'b' like a function |
| x = b() |
| end |
| end |
| |
| module m1 |
| !Function vs subroutine in a module is resolved to a subroutine if |
| !no other information. |
| external :: exts, extf, extunk |
| procedure() :: procs, procf, procunk |
| contains |
| subroutine s |
| call exts() |
| call procs() |
| x = extf() |
| x = procf() |
| end |
| end |
| |
| module m2 |
| use m1 |
| contains |
| subroutine test |
| call exts() ! ok |
| call procs() ! ok |
| call extunk() ! ok |
| call procunk() ! ok |
| x = extf() ! ok |
| x = procf() ! ok |
| !ERROR: Cannot call subroutine 'extunk' like a function |
| !ERROR: Function result characteristics are not known |
| x = extunk() |
| !ERROR: Cannot call subroutine 'procunk' like a function |
| !ERROR: Function result characteristics are not known |
| x = procunk() |
| end |
| end |
| |
| module modulename |
| end |
| |
| ! Call to entity in global scope, even with IMPORT, NONE |
| subroutine s4 |
| block |
| import, none |
| integer :: i |
| !ERROR: 'modulename' is not a callable procedure |
| call modulename() |
| end block |
| end |
| |
| ! Call to entity in global scope, even with IMPORT, NONE |
| subroutine s5 |
| block |
| import, none |
| integer :: i |
| i = foo() |
| !ERROR: Cannot call function 'foo' like a subroutine |
| call foo() |
| end block |
| end |
| |
| subroutine s6 |
| call a6() |
| end |
| !ERROR: 'a6' was previously called as a subroutine |
| function a6() |
| a6 = 0.0 |
| end |
| |
| subroutine s7 |
| x = a7() |
| end |
| !ERROR: 'a7' was previously called as a function |
| subroutine a7() |
| end |
| |
| !OK: use of a8 and b8 is consistent |
| subroutine s8 |
| call a8() |
| x = b8() |
| end |
| subroutine a8() |
| end |
| function b8() |
| b8 = 0.0 |
| end |
| |
| subroutine s9 |
| type t |
| procedure(), nopass, pointer :: p1, p2 |
| end type |
| type(t) x |
| print *, x%p1() |
| call x%p2 |
| !ERROR: Cannot call function 'p1' like a subroutine |
| call x%p1 |
| !ERROR: Cannot call subroutine 'p2' like a function |
| print *, x%p2() |
| end subroutine |
| |
| subroutine s10 |
| call a10 |
| !ERROR: Actual argument for 'a=' may not be a procedure |
| print *, abs(a10) |
| end |
| |
| subroutine s11 |
| real, pointer :: p(:) |
| !ERROR: A NULL() pointer is not allowed for 'a=' intrinsic argument |
| print *, rank(null()) |
| print *, rank(null(mold=p)) ! ok |
| end |