| ! { 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 "can't overwrite specific" } |
| GENERIC :: gensub => p2 ! { dg-error "mixed FUNCTION/SUBROUTINE" } |
| |
| PROCEDURE, NOPASS :: gen1 => intf1 ! { dg-error "Can't 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 |