aarch64: Add vector floating point extend pattern [PR113880, PR113869]
[official-gcc.git] / gcc / testsuite / gfortran.dg / typebound_operator_4.f03
blob3dc3cae3156197216d314acc1658f36f61d5c664
1 ! { dg-do compile }
3 ! Type-bound procedures
4 ! Check for errors with operator calls.
6 MODULE m
7   IMPLICIT NONE
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
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
29 CONTAINS
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
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
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
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
55   SUBROUTINE in_module ()
56     TYPE(myint) :: x
57     x = 0 ! { dg-bogus "Cannot convert" }
58     x = x + 42 ! { dg-bogus "Operands of" }
59     x = x .PLUS. 5 ! { dg-bogus "Unknown operator" }
60   END SUBROUTINE in_module
62   PURE SUBROUTINE iampure ()
63     TYPE(myint) :: x
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
69 END MODULE m
71 PURE SUBROUTINE iampure2 ()
72   USE m
73   IMPLICIT NONE
74   TYPE(myreal) :: x
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
81 PROGRAM main
82   USE m
83   IMPLICIT NONE
84   TYPE(myint) :: x
86   x = 0 ! { dg-error "Cannot convert" }
87   x = x + 42 ! { dg-error "binary intrinsic numeric operator" }
88   x = x .PLUS. 5 ! { dg-error "Unknown operator" }
89 END PROGRAM main