]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gfortran.dg/typebound_operator_4.f03
2018-06-09 Steven G. Kargl <kargl@gcc.gnu.org>
[thirdparty/gcc.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 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
69 END MODULE m
70
71 PURE 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" }
79 END SUBROUTINE iampure2
80
81 PROGRAM 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 "binary intrinsic numeric operator" }
88 x = x .PLUS. 5 ! { dg-error "Unknown operator" }
89 END PROGRAM main