1! { dg-do compile } 2 3! Type-bound procedures 4! Check for errors with operator calls. 5 6MODULE m 7 IMPLICIT NONE 8 9 TYPE myint 10 INTEGER :: value 11 CONTAINS 12 PROCEDURE, PASS :: add_int 13 PROCEDURE, PASS :: assign_int 14 GENERIC, PRIVATE :: OPERATOR(.PLUS.) => add_int 15 GENERIC, PRIVATE :: OPERATOR(+) => add_int 16 GENERIC, PRIVATE :: ASSIGNMENT(=) => assign_int 17 END TYPE myint 18 19 TYPE myreal 20 REAL :: value 21 CONTAINS 22 PROCEDURE, PASS :: add_real 23 PROCEDURE, PASS :: assign_real 24 GENERIC :: OPERATOR(.PLUS.) => add_real 25 GENERIC :: OPERATOR(+) => add_real 26 GENERIC :: ASSIGNMENT(=) => assign_real 27 END TYPE myreal 28 29CONTAINS 30 31 PURE TYPE(myint) FUNCTION add_int (a, b) 32 CLASS(myint), INTENT(IN) :: a 33 INTEGER, INTENT(IN) :: b 34 add_int = myint (a%value + b) 35 END FUNCTION add_int 36 37 SUBROUTINE assign_int (dest, from) 38 CLASS(myint), INTENT(OUT) :: dest 39 INTEGER, INTENT(IN) :: from 40 dest%value = from 41 END SUBROUTINE assign_int 42 43 TYPE(myreal) FUNCTION add_real (a, b) 44 CLASS(myreal), INTENT(IN) :: a 45 REAL, INTENT(IN) :: b 46 add_real = myreal (a%value + b) 47 END FUNCTION add_real 48 49 SUBROUTINE assign_real (dest, from) 50 CLASS(myreal), INTENT(OUT) :: dest 51 REAL, INTENT(IN) :: from 52 dest%value = from 53 END SUBROUTINE assign_real 54 55 SUBROUTINE in_module () 56 TYPE(myint) :: x 57 x = 0 ! { dg-bogus "Can't convert" } 58 x = x + 42 ! { dg-bogus "Operands of" } 59 x = x .PLUS. 5 ! { dg-bogus "Unknown operator" } 60 END SUBROUTINE in_module 61 62 PURE SUBROUTINE iampure () 63 TYPE(myint) :: x 64 65 x = x + 42 ! { dg-bogus "to a impure procedure" } 66 x = x .PLUS. 5 ! { dg-bogus "to a impure procedure" } 67 END SUBROUTINE iampure 68 69END MODULE m 70 71PURE SUBROUTINE iampure2 () 72 USE m 73 IMPLICIT NONE 74 TYPE(myreal) :: x 75 76 x = 0.0 ! { dg-error "is not PURE" } 77 x = x + 42.0 ! { dg-error "impure function" } 78 x = x .PLUS. 5.0 ! { dg-error "impure function" } 79END SUBROUTINE iampure2 80 81PROGRAM main 82 USE m 83 IMPLICIT NONE 84 TYPE(myint) :: x 85 86 x = 0 ! { dg-error "Can't convert" } 87 x = x + 42 ! { dg-error "Operands of" } 88 x = x .PLUS. 5 ! { dg-error "Unknown operator" } 89END PROGRAM main 90