| ! { dg-do compile } |
| |
| ! Type-bound procedures |
| ! Checks for correct errors with invalid OPERATOR/ASSIGNMENT usage. |
| |
| MODULE m |
| IMPLICIT NONE |
| |
| TYPE t |
| CONTAINS |
| PROCEDURE, PASS :: onearg |
| PROCEDURE, PASS :: onearg_alt => onearg |
| PROCEDURE, PASS :: onearg_alt2 => onearg |
| PROCEDURE, NOPASS :: nopassed => onearg |
| PROCEDURE, PASS :: threearg |
| PROCEDURE, PASS :: sub |
| PROCEDURE, PASS :: sub2 |
| PROCEDURE, PASS :: func |
| |
| ! These give errors at the targets' definitions. |
| GENERIC :: OPERATOR(.AND.) => sub2 |
| GENERIC :: OPERATOR(*) => onearg |
| GENERIC :: ASSIGNMENT(=) => func |
| |
| GENERIC :: OPERATOR(.UOPA.) => sub ! { dg-error "must be a FUNCTION" } |
| GENERIC :: OPERATOR(.UOPB.) => threearg ! { dg-error "at most, two arguments" } |
| ! We can't check for the 'at least one argument' error, because in this case |
| ! the procedure must be NOPASS and that other error is issued. But of |
| ! course this should be alright. |
| |
| GENERIC :: OPERATOR(.UNARY.) => onearg_alt |
| GENERIC, PRIVATE :: OPERATOR(.UNARY.) => onearg_alt2 ! { dg-error "must have the same access" } |
| |
| GENERIC :: OPERATOR(.UNARYPRIME.) => nopassed ! { dg-error "can't be NOPASS" } |
| GENERIC :: OPERATOR(-) => nopassed ! { dg-error "can't be NOPASS" } |
| END TYPE t |
| |
| CONTAINS |
| |
| INTEGER FUNCTION onearg (me) ! { dg-error "wrong number of arguments" } |
| CLASS(t), INTENT(IN) :: me |
| onearg = 5 |
| END FUNCTION onearg |
| |
| INTEGER FUNCTION threearg (a, b, c) |
| CLASS(t), INTENT(IN) :: a, b, c |
| threearg = 42 |
| END FUNCTION threearg |
| |
| LOGICAL FUNCTION func (me, b) ! { dg-error "must be a SUBROUTINE" } |
| CLASS(t), INTENT(OUT) :: me |
| CLASS(t), INTENT(IN) :: b |
| func = .TRUE. |
| END FUNCTION func |
| |
| SUBROUTINE sub (a) |
| CLASS(t), INTENT(IN) :: a |
| END SUBROUTINE sub |
| |
| SUBROUTINE sub2 (a, x) ! { dg-error "must be a FUNCTION" } |
| CLASS(t), INTENT(IN) :: a |
| INTEGER, INTENT(IN) :: x |
| END SUBROUTINE sub2 |
| |
| END MODULE m |