| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Test 15.5.2.5 constraints and restrictions for POINTER & ALLOCATABLE |
| ! arguments when both sides of the call have the same attributes. |
| |
| module m |
| |
| type :: t |
| end type |
| type, extends(t) :: t2 |
| end type |
| type :: pdt(n) |
| integer, len :: n |
| end type |
| |
| type(t), pointer :: mp(:), mpmat(:,:) |
| type(t), allocatable :: ma(:), mamat(:,:) |
| class(t), pointer :: pp(:) |
| class(t), allocatable :: pa(:) |
| class(t2), pointer :: pp2(:) |
| class(t2), allocatable :: pa2(:) |
| class(*), pointer :: up(:) |
| class(*), allocatable :: ua(:) |
| !ERROR: An assumed (*) type parameter may be used only for a (non-statement function) dummy argument, associate name, character named constant, or external function result |
| type(pdt(*)), pointer :: amp(:) |
| !ERROR: An assumed (*) type parameter may be used only for a (non-statement function) dummy argument, associate name, character named constant, or external function result |
| type(pdt(*)), allocatable :: ama(:) |
| type(pdt(:)), pointer :: dmp(:) |
| type(pdt(:)), allocatable :: dma(:) |
| type(pdt(1)), pointer :: nmp(:) |
| type(pdt(1)), allocatable :: nma(:) |
| |
| contains |
| |
| subroutine smp(x) |
| type(t), pointer :: x(:) |
| end subroutine |
| subroutine sma(x) |
| type(t), allocatable :: x(:) |
| end subroutine |
| subroutine spp(x) |
| class(t), pointer :: x(:) |
| end subroutine |
| subroutine spa(x) |
| class(t), allocatable :: x(:) |
| end subroutine |
| subroutine sup(x) |
| class(*), pointer :: x(:) |
| end subroutine |
| subroutine sua(x) |
| class(*), allocatable :: x(:) |
| end subroutine |
| subroutine samp(x) |
| type(pdt(*)), pointer :: x(:) |
| end subroutine |
| subroutine sama(x) |
| type(pdt(*)), allocatable :: x(:) |
| end subroutine |
| subroutine sdmp(x) |
| type(pdt(:)), pointer :: x(:) |
| end subroutine |
| subroutine sdma(x) |
| type(pdt(:)), allocatable :: x(:) |
| end subroutine |
| subroutine snmp(x) |
| type(pdt(1)), pointer :: x(:) |
| end subroutine |
| subroutine snma(x) |
| type(pdt(1)), allocatable :: x(:) |
| end subroutine |
| |
| subroutine test |
| call smp(mp) ! ok |
| call sma(ma) ! ok |
| call spp(pp) ! ok |
| call spa(pa) ! ok |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so |
| call smp(pp) |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so |
| call sma(pa) |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so |
| call spp(mp) |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is polymorphic, both must be so |
| call spa(ma) |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is unlimited polymorphic, both must be so |
| call sup(pp) |
| !ERROR: If a POINTER or ALLOCATABLE dummy or actual argument is unlimited polymorphic, both must be so |
| call sua(pa) |
| !ERROR: Actual argument type 'CLASS(*)' is not compatible with dummy argument type 'CLASS(t)' |
| !ERROR: Pointer type must be unlimited polymorphic or non-extensible derived type when target is unlimited polymorphic |
| call spp(up) |
| !ERROR: Actual argument type 'CLASS(*)' is not compatible with dummy argument type 'CLASS(t)' |
| call spa(ua) |
| !ERROR: POINTER or ALLOCATABLE dummy and actual arguments must have the same declared type and kind |
| call spp(pp2) |
| !ERROR: POINTER or ALLOCATABLE dummy and actual arguments must have the same declared type and kind |
| call spa(pa2) |
| !ERROR: Rank of dummy argument is 1, but actual argument has rank 2 |
| !ERROR: Pointer has rank 1 but target has rank 2 |
| call smp(mpmat) |
| !ERROR: Rank of dummy argument is 1, but actual argument has rank 2 |
| call sma(mamat) |
| call sdmp(dmp) ! ok |
| call sdma(dma) ! ok |
| call snmp(nmp) ! ok |
| call snma(nma) ! ok |
| call samp(nmp) ! ok |
| call sama(nma) ! ok |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call sdmp(nmp) |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call sdma(nma) |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call snmp(dmp) |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call snma(dma) |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call samp(dmp) |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call sama(dma) |
| end subroutine |
| |
| end module |
| |
| module m2 |
| |
| !ERROR: Procedure 't3' may not be ALLOCATABLE without an explicit interface |
| character(len=10), allocatable :: t1, t2, t3, t4 |
| !ERROR: Procedure 't6' may not be ALLOCATABLE without an explicit interface |
| character(len=:), allocatable :: t5, t6, t7, t8(:) |
| |
| character(len=10), pointer :: p1 |
| character(len=:), pointer :: p2 |
| |
| integer, allocatable :: x(:) |
| |
| contains |
| |
| subroutine sma(a) |
| character(len=:), allocatable, intent(in) :: a |
| end |
| |
| subroutine sma2(a) |
| character(len=10), allocatable, intent(in) :: a |
| end |
| |
| subroutine smp(p) |
| character(len=:), pointer, intent(in) :: p |
| end |
| |
| subroutine smp2(p) |
| character(len=10), pointer, intent(in) :: p |
| end |
| |
| subroutine smb(b) |
| integer, allocatable, intent(in) :: b(:) |
| end |
| |
| function return_deferred_length_ptr() |
| character(len=:), pointer :: return_deferred_length_ptr |
| end function |
| |
| function return_explicit_length_ptr(n) |
| integer :: n |
| character(len=n), pointer :: return_explicit_length_ptr |
| end function |
| |
| subroutine test() |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call sma(t1) |
| |
| call sma2(t1) ! ok |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call smp(p1) |
| |
| call smp2(p1) ! ok |
| |
| call smp(return_deferred_length_ptr()) ! ok |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call smp2(return_deferred_length_ptr()) |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call smp(return_explicit_length_ptr(10)) |
| |
| call smp2(return_explicit_length_ptr(10)) ! ok |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t2(:)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t3(1)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t4(1:2)) |
| |
| call sma(t5) ! ok |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call sma2(t5) |
| |
| call smp(p2) ! ok |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call smp2(p2) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t5(:)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t6(1)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t7(1:2)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'a=' must be associated with an ALLOCATABLE actual argument |
| call sma(t8(1)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument |
| call smb(x(:)) |
| |
| !ERROR: Rank of dummy argument is 1, but actual argument has rank 0 |
| !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument |
| call smb(x(2)) |
| |
| !ERROR: ALLOCATABLE dummy argument 'b=' must be associated with an ALLOCATABLE actual argument |
| call smb(x(1:2)) |
| |
| end subroutine |
| |
| end module |
| |
| module test |
| type t(l) |
| integer, len :: l |
| character(l) :: c |
| end type |
| |
| contains |
| |
| subroutine bar(p) |
| type(t(:)), allocatable :: p(:) |
| end subroutine |
| |
| subroutine foo |
| type(t(10)), allocatable :: p(:) |
| |
| !ERROR: Dummy and actual arguments must defer the same type parameters when POINTER or ALLOCATABLE |
| call bar(p) |
| |
| end subroutine |
| |
| end module |