| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Test specification expressions |
| |
| module m |
| type :: t(n) |
| integer, len :: n = 1 |
| character(len=n) :: c |
| end type |
| interface |
| integer function foo() |
| end function |
| pure real function realfunc(x) |
| real, intent(in) :: x |
| end function |
| pure integer function hasProcArg(p) |
| import realfunc |
| procedure(realfunc) :: p |
| optional :: p |
| end function |
| end interface |
| integer :: coarray[*] |
| contains |
| pure integer function modulefunc1(n) |
| integer, value :: n |
| modulefunc1 = n |
| end function |
| subroutine test(out, optional) |
| !ERROR: Invalid specification expression: reference to impure function 'foo' |
| type(t(foo())) :: x1 |
| integer :: local |
| !ERROR: Invalid specification expression: reference to local entity 'local' |
| type(t(local)) :: x2 |
| !ERROR: The internal function 'internal' may not be referenced in a specification expression |
| type(t(internal(0))) :: x3 |
| integer, intent(out) :: out |
| !ERROR: Invalid specification expression: reference to INTENT(OUT) dummy argument 'out' |
| type(t(out)) :: x4 |
| integer, intent(in), optional :: optional |
| !ERROR: Invalid specification expression: reference to OPTIONAL dummy argument 'optional' |
| type(t(optional)) :: x5 |
| !ERROR: Invalid specification expression: reference to function 'hasprocarg' with dummy procedure argument 'p' |
| type(t(hasProcArg())) :: x6 |
| !ERROR: Invalid specification expression: coindexed reference |
| type(t(coarray[1])) :: x7 |
| type(t(kind(foo()))) :: x101 ! ok |
| type(t(modulefunc1(0))) :: x102 ! ok |
| type(t(modulefunc2(0))) :: x103 ! ok |
| contains |
| pure integer function internal(n) |
| integer, value :: n |
| internal = n |
| end function |
| end subroutine |
| pure integer function modulefunc2(n) |
| integer, value :: n |
| modulefunc2 = n |
| end function |
| end module |