blob: dd54e66881b619f96dc0964821433fb7529c1324 [file] [log] [blame]
! { dg-do compile }
! Type-bound procedures
! Compiling and errors with GENERIC binding declarations.
! Bindings with NOPASS.
MODULE m
IMPLICIT NONE
TYPE somet
CONTAINS
PROCEDURE, NOPASS :: p1 => intf1
PROCEDURE, NOPASS :: p1a => intf1a
PROCEDURE, NOPASS :: p2 => intf2
PROCEDURE, NOPASS :: p3 => intf3
PROCEDURE, NOPASS :: subr
GENERIC :: gen1 => p1a ! { dg-error "are ambiguous" }
GENERIC, PUBLIC :: gen1 => p1, p2
GENERIC :: gen1 => p3 ! Implicitly PUBLIC.
GENERIC, PRIVATE :: gen2 => p1
GENERIC :: gen2 => p2 ! { dg-error "same access" }
GENERIC :: gen1 => p1 ! { dg-error "already defined as specific binding" }
GENERIC, PASS :: gen3 => p1 ! { dg-error "Expected access-specifier" }
GENERIC :: p1 => p1 ! { dg-error "already a non-generic procedure" }
PROCEDURE, NOPASS :: gen1 => intf1 ! { dg-error "already a procedure" }
GENERIC :: gen3 => ! { dg-error "specific binding" }
GENERIC :: gen4 => p1 x ! { dg-error "Junk after" }
GENERIC :: gen5 => p_notthere ! { dg-error "Undefined specific binding" }
GENERIC :: gen6 => p1
GENERIC :: gen7 => gen6 ! { dg-error "must target a specific binding" }
GENERIC :: gensubr => p2 ! { dg-error "mixed FUNCTION/SUBROUTINE" }
GENERIC :: gensubr => subr
END TYPE somet
TYPE supert
CONTAINS
PROCEDURE, NOPASS :: p1 => intf1
PROCEDURE, NOPASS :: p1a => intf1a
PROCEDURE, NOPASS :: p2 => intf2
PROCEDURE, NOPASS :: p3 => intf3
PROCEDURE, NOPASS :: sub1 => subr
GENERIC :: gen1 => p1, p2
GENERIC :: gen1 => p3
GENERIC :: gen2 => p1
GENERIC :: gensub => sub1
END TYPE supert
TYPE, EXTENDS(supert) :: t
CONTAINS
GENERIC :: gen2 => p1a ! { dg-error "are ambiguous" }
GENERIC :: gen2 => p3
GENERIC :: p1 => p2 ! { dg-error "cannot overwrite specific" }
GENERIC :: gensub => p2 ! { dg-error "mixed FUNCTION/SUBROUTINE" }
PROCEDURE, NOPASS :: gen1 => intf1 ! { dg-error "Cannot overwrite GENERIC" }
END TYPE t
CONTAINS
INTEGER FUNCTION intf1 (a, b)
IMPLICIT NONE
INTEGER :: a, b
intf1 = 42
END FUNCTION intf1
INTEGER FUNCTION intf1a (a, b)
IMPLICIT NONE
INTEGER :: a, b
intf1a = 42
END FUNCTION intf1a
INTEGER FUNCTION intf2 (a, b)
IMPLICIT NONE
REAL :: a, b
intf2 = 42.0
END FUNCTION intf2
LOGICAL FUNCTION intf3 ()
IMPLICIT NONE
intf3 = .TRUE.
END FUNCTION intf3
SUBROUTINE subr (x)
IMPLICIT NONE
INTEGER :: x
END SUBROUTINE subr
END MODULE m