aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/overload_5.f90
blob: f8c93af35182b4975ec6fc670540f1bb6bccaca6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
! { dg-do run }
! PR fortran/109641
!
! Check overloading of intrinsic binary operators for numeric operands
! Reported by Adelson Oliveira

MODULE TESTEOP
  IMPLICIT NONE
  INTERFACE OPERATOR(.MULT.)
    MODULE PROCEDURE MULTr4
    MODULE PROCEDURE MULTc4
  END INTERFACE
  INTERFACE OPERATOR(*)
    MODULE PROCEDURE MULTr4
    MODULE PROCEDURE MULTc4
  END INTERFACE
  INTERFACE OPERATOR(==)
    MODULE PROCEDURE MULTr4
    MODULE PROCEDURE MULTc4
    MODULE PROCEDURE MULTr8
  END INTERFACE
  INTERFACE OPERATOR(<)
    MODULE PROCEDURE MULTc4
    MODULE PROCEDURE MULTi4
  END INTERFACE
  INTERFACE OPERATOR(**)
    MODULE PROCEDURE MULTc4
    MODULE PROCEDURE MULTi4
  END INTERFACE
  interface copy
     MODULE PROCEDURE copy
  end interface copy
CONTAINS
  elemental function copy (z)
    complex, intent(in) :: z
    complex             :: copy
    copy = z
  end function copy
  FUNCTION MULTr4(v,m)
    REAL,    INTENT(IN) :: v(:)
    REAL,    INTENT(IN) :: m(:,:)
    REAL                :: MULTr4(SIZE(m,DIM=1),SIZE(m,DIM=2))
    INTEGER             :: i
    FORALL(i=1:SIZE(v)) MULTr4(:,i)=m(:,i)*v(i)
  END FUNCTION MULTr4
  FUNCTION MULTr8(v,m)
    REAL,             INTENT(IN) :: v(:)
    double precision, INTENT(IN) :: m(:,:)
    double precision             :: MULTr8(SIZE(m,DIM=1),SIZE(m,DIM=2))
    INTEGER             :: i
    FORALL(i=1:SIZE(v)) MULTr8(:,i)=m(:,i)*v(i)
  END FUNCTION MULTr8
  FUNCTION MULTc4(v,m)
    REAL,    INTENT(IN) :: v(:)
    COMPLEX, INTENT(IN) :: m(:,:)
    COMPLEX             :: MULTc4(SIZE(m,DIM=1),SIZE(m,DIM=2))
    INTEGER             :: i
    FORALL(i=1:SIZE(v)) MULTc4(:,i)=m(:,i)*v(i)
  END FUNCTION MULTc4
  FUNCTION MULTi4(v,m)
    REAL,    INTENT(IN) :: v(:)
    integer, INTENT(IN) :: m(:,:)
    REAL                :: MULTi4(SIZE(m,DIM=1),SIZE(m,DIM=2))
    INTEGER             :: i
    FORALL(i=1:SIZE(v)) MULTi4(:,i)=m(:,i)*v(i)
  END FUNCTION MULTi4
END MODULE TESTEOP
PROGRAM TESTE
  USE TESTEOP
  implicit none
  type t
     complex :: c(3,3)
  end type t
  real,    parameter   :: vv(3)   = 42.
  complex, parameter   :: zz(3,3) = (1.0,0.0)
  integer, parameter   :: kk(3,3) = 2
  double precision     :: dd(3,3) = 3.d0
  COMPLEX, ALLOCATABLE :: m(:,:),r(:,:), s(:,:)
  REAL,    ALLOCATABLE :: v(:)
  type(t)              :: z(1) = t(zz)
  ALLOCATE(v(3),m(3,3),r(3,3),s(3,3))
  v = vv
  m = zz
  ! Original bug report
  r=v.MULT.m ! Reference
  s=v*m
  if (any (r /= s)) stop 1
  if (.not. all (r == s)) stop 2
  ! Check other binary intrinsics
  s=v==m
  if (any (r /= s)) stop 3
  s=v==copy(m)
  if (any (r /= s)) stop 4
  s=v==zz
  if (any (r /= s)) stop 5
  s=v==copy(zz)
  if (any (r /= s)) stop 6
  s=vv==m
  if (any (r /= s)) stop 7
  s=vv==copy(m)
  if (any (r /= s)) stop 8
  s=vv==zz
  if (any (r /= s)) stop 9
  s=vv==copy(zz)
  if (any (r /= s)) stop 10
  ! check if .eq. same operator as == etc.
  s=v.eq.m
  if (any (r /= s)) stop 11
  s=v.lt.z(1)%c
  if (any (r /= s)) stop 12
  s=v<((z(1)%c))
  if (any (r /= s)) stop 13
  if (.not. all (     1.   < (vv**kk))) stop 14
  if (.not. all (     1.   < (vv< kk))) stop 15
  if (.not. all ((42.,0.) == (v < m ))) stop 16
  if (.not. all ((42.,0.) == (v** m ))) stop 17
  if (.not. all ( 126.d0  == (vv==dd))) stop 18
END PROGRAM TESTE