fix pr/45972
[official-gcc.git] / gcc / testsuite / gfortran.dg / where_operator_assign_1.f90
blobc2b4abf851892c85f2996e31853be6492c62ba54
1 ! { dg-do compile }
2 ! Tests the fix for PR30407, in which operator assignments did not work
3 ! in WHERE blocks or simple WHERE statements. This is the test provided
4 ! by the reporter.
6 ! Contributed by Dominique d'Humieres <dominiq@lps.ens.fr>
7 !==============================================================================
9 MODULE kind_mod
11 IMPLICIT NONE
13 PRIVATE
15 INTEGER, PUBLIC, PARAMETER :: I4=SELECTED_INT_KIND(9)
16 INTEGER, PUBLIC, PARAMETER :: TF=KIND(.TRUE._I4)
18 END MODULE kind_mod
20 !==============================================================================
22 MODULE pointer_mod
24 USE kind_mod, ONLY : I4
26 IMPLICIT NONE
28 PRIVATE
30 TYPE, PUBLIC :: pvt
31 INTEGER(I4), POINTER, DIMENSION(:) :: vect
32 END TYPE pvt
34 INTERFACE ASSIGNMENT(=)
35 MODULE PROCEDURE p_to_p
36 END INTERFACE
38 PUBLIC :: ASSIGNMENT(=)
40 CONTAINS
42 !---------------------------------------------------------------------------
44 PURE ELEMENTAL SUBROUTINE p_to_p(a1, a2)
45 IMPLICIT NONE
46 TYPE(pvt), INTENT(OUT) :: a1
47 TYPE(pvt), INTENT(IN) :: a2
48 a1%vect = a2%vect
49 END SUBROUTINE p_to_p
51 !---------------------------------------------------------------------------
53 END MODULE pointer_mod
55 !==============================================================================
57 PROGRAM test_prog
59 USE pointer_mod, ONLY : pvt, ASSIGNMENT(=)
61 USE kind_mod, ONLY : I4, TF
63 IMPLICIT NONE
65 INTEGER(I4), DIMENSION(12_I4), TARGET :: ia
66 LOGICAL(TF), DIMENSION(2_I4,3_I4) :: la
67 TYPE(pvt), DIMENSION(6_I4) :: pv
68 INTEGER(I4) :: i
70 ! Initialisation...
71 la(:,1_I4:3_I4:2_I4)=.TRUE._TF
72 la(:,2_I4)=.FALSE._TF
74 DO i=1_I4,6_I4
75 pv(i)%vect => ia((2_I4*i-1_I4):(2_I4*i))
76 END DO
78 ia=0_I4
80 DO i=1_I4,3_I4
81 WHERE(la((/1_I4,2_I4/),i))
82 pv((2_I4*i-1_I4):(2_I4*i))= iaef((/(2_I4*i-1_I4),(2_I4*i)/))
83 ELSEWHERE
84 pv((2_I4*i-1_I4):(2_I4*i))= iaef((/0_I4,0_I4/))
85 END WHERE
86 END DO
88 if (any (ia .ne. (/1,-1,2,-2,0,0,0,0,5,-5,6,-6/))) call abort ()
90 CONTAINS
92 TYPE(pvt) ELEMENTAL FUNCTION iaef(index) RESULT(ans)
94 USE kind_mod, ONLY : I4
95 USE pointer_mod, ONLY : pvt, ASSIGNMENT(=)
97 IMPLICIT NONE
99 INTEGER(I4), INTENT(IN) :: index
101 ALLOCATE(ans%vect(2_I4))
102 ans%vect=(/index,-index/)
104 END FUNCTION iaef
106 END PROGRAM test_prog
108 ! { dg-final { cleanup-modules "kind_mod pointer_mod" } }