| ! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s |
| ! Tests rules of 15.5.5.2 for generics and explicit intrinsics |
| ! competing at various scoping levels. |
| module m1 |
| private |
| public abs |
| interface abs |
| module procedure :: abs_int_redef, abs_noargs |
| end interface |
| contains |
| integer function abs_int_redef(j) |
| integer, intent(in) :: j |
| abs_int_redef = j |
| end function |
| integer function abs_noargs() |
| abs_noargs = 0 |
| end function |
| end module |
| |
| module m2 |
| private |
| public abs |
| interface abs |
| module procedure abs_real_redef |
| end interface |
| contains |
| real function abs_real_redef(x) |
| real, intent(in) :: x |
| abs_real_redef = x |
| end function |
| end module |
| |
| module m3 |
| use m1, only: abs |
| implicit none |
| contains |
| subroutine test1 |
| use m2, only: abs |
| !CHECK: abs_int_redef( |
| print *, abs(1) |
| !CHECK: abs_real_redef( |
| print *, abs(1.) |
| !CHECK: 1.41421353816986083984375_4 |
| print *, abs((1,1)) |
| !CHECK: abs_noargs( |
| print *, abs() |
| end subroutine |
| subroutine test2 |
| intrinsic abs ! override some of module's use of m1 |
| block |
| use m2, only: abs |
| !CHECK: 1_4 |
| print *, abs(1) |
| !CHECK: abs_real_redef( |
| print *, abs(1.) |
| !CHECK: 1.41421353816986083984375_4 |
| print *, abs((1,1)) |
| !CHECK: abs_noargs( |
| print *, abs() |
| end block |
| end subroutine |
| subroutine test3 |
| interface abs |
| module procedure abs_complex_redef ! extend module's use of m1 |
| end interface |
| !CHECK: abs_int_redef( |
| print *, abs(1) |
| !CHECK: 1._4 |
| print *, abs(1.) |
| !CHECK: abs_complex_redef( |
| print *, abs((1,1)) |
| !CHECK: abs_noargs( |
| print *, abs() |
| block |
| intrinsic abs ! override the extension |
| !CHECK: 1.41421353816986083984375_4 |
| print *, abs((1,1)) |
| end block |
| end subroutine |
| real function abs_complex_redef(z) |
| complex, intent(in) :: z |
| abs_complex_redef = z |
| end function |
| subroutine test4 |
| !CHECK: abs( |
| print *, abs(1) |
| contains |
| integer function abs(n) ! override module's use of m1 |
| integer, intent(in) :: n |
| abs = n |
| end function |
| end subroutine |
| end module |
| |
| module m4 |
| contains |
| integer function abs(n) |
| integer, intent(in) :: n |
| abs = n |
| end function |
| subroutine test5 |
| interface abs |
| module procedure abs ! same name, host-associated |
| end interface |
| !CHECK: abs( |
| print *, abs(1) |
| end subroutine |
| end module |