blob: c80deed4ae3e53cdf037795b7fdc2e62b00e7c9c [file] [log] [blame]
! { dg-do compile }
! Type-bound procedures
! Test for errors in specific bindings, during resolution.
MODULE othermod
IMPLICIT NONE
CONTAINS
REAL FUNCTION proc_noarg ()
IMPLICIT NONE
END FUNCTION proc_noarg
END MODULE othermod
MODULE testmod
USE othermod
IMPLICIT NONE
INTEGER :: noproc
PROCEDURE() :: proc_nointf
INTERFACE
SUBROUTINE proc_intf ()
END SUBROUTINE proc_intf
END INTERFACE
ABSTRACT INTERFACE
SUBROUTINE proc_abstract_intf ()
END SUBROUTINE proc_abstract_intf
END INTERFACE
TYPE supert
CONTAINS
PROCEDURE, NOPASS :: super_overrid => proc_sub_noarg
PROCEDURE, NOPASS, NON_OVERRIDABLE :: super_nonoverrid => proc_sub_noarg
END TYPE supert
TYPE, EXTENDS(supert) :: t
CONTAINS
! Bindings that should succeed
PROCEDURE, NOPASS :: p0 => proc_noarg
PROCEDURE, PASS :: p1 => proc_arg_first
PROCEDURE proc_arg_first
PROCEDURE, PASS(me) :: p2 => proc_arg_middle
PROCEDURE, PASS(me), NON_OVERRIDABLE :: p3 => proc_arg_last
PROCEDURE, NOPASS :: p4 => proc_nome
PROCEDURE, NOPASS :: p5 => proc_intf
PROCEDURE, NOPASS :: super_overrid => proc_sub_noarg
! Bindings that should not succeed
PROCEDURE :: e0 => undefined ! { dg-error "has no IMPLICIT|module procedure" }
PROCEDURE, PASS :: e1 => proc_noarg ! { dg-error "at least one argument" }
PROCEDURE :: e2 => proc_noarg ! { dg-error "at least one argument" }
PROCEDURE, PASS(me) :: e3 => proc_nome ! { dg-error "no argument 'me'" }
PROCEDURE, PASS(me) :: e4 => proc_mewrong ! { dg-error "Non-polymorphic passed-object dummy argument" }
PROCEDURE, PASS :: e5 => proc_mewrong ! { dg-error "Non-polymorphic passed-object dummy argument" }
PROCEDURE :: e6 => noproc ! { dg-error "module procedure" }
PROCEDURE :: e7 => proc_nointf ! { dg-error "explicit interface" }
PROCEDURE, NOPASS :: e8 => proc_abstract_intf ! { dg-error "explicit interface" }
PROCEDURE :: super_nonoverrid => proc_arg_first ! { dg-error "NON_OVERRIDABLE" }
END TYPE t
CONTAINS
SUBROUTINE proc_arg_first (me, x)
IMPLICIT NONE
CLASS(t) :: me
REAL :: x
END SUBROUTINE proc_arg_first
INTEGER FUNCTION proc_arg_middle (x, me, y)
IMPLICIT NONE
REAL :: x, y
CLASS(t) :: me
END FUNCTION proc_arg_middle
SUBROUTINE proc_arg_last (x, me)
IMPLICIT NONE
CLASS(t) :: me
REAL :: x
END SUBROUTINE proc_arg_last
SUBROUTINE proc_nome (arg, x, y)
IMPLICIT NONE
TYPE(t) :: arg
REAL :: x, y
END SUBROUTINE proc_nome
SUBROUTINE proc_mewrong (me, x)
IMPLICIT NONE
REAL :: x
INTEGER :: me
END SUBROUTINE proc_mewrong
SUBROUTINE proc_sub_noarg ()
END SUBROUTINE proc_sub_noarg
END MODULE testmod
PROGRAM main
IMPLICIT NONE
TYPE t
CONTAINS
PROCEDURE, NOPASS :: proc_no_module ! { dg-error "module procedure" }
END TYPE t
CONTAINS
SUBROUTINE proc_no_module ()
END SUBROUTINE proc_no_module
END PROGRAM main