1! { dg-do run }
2! { dg-options "-fno-inline" }
3!
4! SUM as initialization expression.
5!
6! This test compares results of simplifier of SUM 
7! with the corresponding inlined or library routine(s).
8!
9
10  IMPLICIT NONE
11
12  INTEGER, PARAMETER :: imatrix(2,4) = RESHAPE ([ 1, 2, 3, 4, 5, 6, 7, 8 ], [2, 4] )
13  INTEGER, PARAMETER :: imatrix_sum = SUM (imatrix)
14  INTEGER, PARAMETER :: imatrix_sum_d1(4) = SUM (imatrix, dim=1)
15  INTEGER, PARAMETER :: imatrix_sum_d2(2) = SUM (imatrix, dim=2)
16  LOGICAL, PARAMETER :: i_equal_sum = ALL ([SUM( imatrix_sum_d1 ) ==  SUM ( imatrix_sum_d2 ), &
17                                            SUM( imatrix_sum_d1 ) == imatrix_sum])
18  LOGICAL, PARAMETER :: i_empty_sum = SUM(imatrix, mask=.FALSE.) == 0
19
20  REAL, PARAMETER :: rmatrix(2,4) = RESHAPE ([ 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 ], [2, 4] )
21  REAL, PARAMETER :: rmatrix_sum = SUM (rmatrix)
22  REAL, PARAMETER :: rmatrix_sum_d1(4) = SUM (rmatrix, dim=1)
23  REAL, PARAMETER :: rmatrix_sum_d2(2) = SUM (rmatrix, dim=2)
24  LOGICAL, PARAMETER :: r_equal_sum = ALL ([SUM( rmatrix_sum_d1 ) ==  SUM ( rmatrix_sum_d2 ), &
25                                            SUM( rmatrix_sum_d1 ) == rmatrix_sum])
26  LOGICAL, PARAMETER :: r_empty_sum = SUM(rmatrix, mask=.FALSE.) == 0.0
27
28  IF (.NOT. ALL ([i_equal_sum, i_empty_sum])) CALL abort()
29  IF (.NOT. ALL ([r_equal_sum, r_empty_sum])) CALL abort()
30
31  CALL ilib (imatrix, imatrix_sum)
32  CALL ilib_with_dim (imatrix, 1, imatrix_sum_d1)
33  CALL ilib_with_dim (imatrix, 2, imatrix_sum_d2)
34  CALL rlib (rmatrix, rmatrix_sum)
35  CALL rlib_with_dim (rmatrix, 1, rmatrix_sum_d1)
36  CALL rlib_with_dim (rmatrix, 2, rmatrix_sum_d2)
37
38CONTAINS
39  SUBROUTINE ilib (array, result)
40    INTEGER, DIMENSION(:,:), INTENT(in) :: array
41    INTEGER, INTENT(in) :: result
42    IF (SUM(array) /= result) CALL abort()
43  END SUBROUTINE
44
45  SUBROUTINE ilib_with_dim (array, dim, result)
46    INTEGER, DIMENSION(:,:), INTENT(in) :: array
47    INTEGER, INTENT(iN)                 :: dim
48    INTEGER, DIMENSION(:), INTENT(in)   :: result
49    IF (ANY (SUM (array, dim=dim) /= result)) CALL abort()
50  END SUBROUTINE
51
52  SUBROUTINE rlib (array, result)
53    REAL, DIMENSION(:,:), INTENT(in) :: array
54    REAL, INTENT(in) :: result
55    IF (ABS(SUM(array) - result) > 4e-6) CALL abort()
56  END SUBROUTINE
57
58  SUBROUTINE rlib_with_dim (array, dim, result)
59    REAL, DIMENSION(:,:), INTENT(in) :: array
60    INTEGER, INTENT(iN)              :: dim
61    REAL, DIMENSION(:), INTENT(in)   :: result
62    IF (ANY (ABS(SUM (array, dim=dim) - result) > 4e-6)) CALL abort()
63  END SUBROUTINE
64END
65
66
67