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