OSDN Git Service

PR debug/43329
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gfortran.dg / typebound_operator_4.f03
1 ! { dg-do compile }
2
3 ! Type-bound procedures
4 ! Check for errors with operator calls.
5
6 MODULE 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
29 CONTAINS
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   PURE 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 = 0 ! { dg-bogus "is not PURE" }
66     x = x + 42 ! { dg-bogus "to a non-PURE procedure" }
67     x = x .PLUS. 5 ! { dg-bogus "to a non-PURE procedure" }
68   END SUBROUTINE iampure
69
70 END MODULE m
71
72 PURE SUBROUTINE iampure2 ()
73   USE m
74   IMPLICIT NONE
75   TYPE(myreal) :: x
76
77   x = 0.0 ! { dg-error "is not PURE" }
78   x = x + 42.0 ! { dg-error "to a non-PURE procedure" }
79   x = x .PLUS. 5.0 ! { dg-error "to a non-PURE procedure" }
80 END SUBROUTINE iampure2
81
82 PROGRAM main
83   USE m
84   IMPLICIT NONE
85   TYPE(myint) :: x
86
87   x = 0 ! { dg-error "Can't convert" }
88   x = x + 42 ! { dg-error "Operands of" }
89   x = x .PLUS. 5 ! { dg-error "Unknown operator" }
90 END PROGRAM main
91
92 ! { dg-final { cleanup-modules "m" } }