OSDN Git Service

PR libfortran/18271
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gfortran.dg / reduction.f90
1 ! { dg-do run }
2 ! PR 16946
3 ! Not all allowed combinations of arguments for MAXVAL, MINVAL,
4 ! PRODUCT and SUM were supported.
5 program reduction_mask
6   implicit none
7   logical :: equal(3)
8   
9   integer, parameter :: res(4*9) = (/ 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, &
10        1, 1, 1, 1, 1, 6, 6, 6, 2, 2, 2, 2, 2, 2, 6, 6, 6, 3, 3, 3, 3, 3, 3 /)
11   integer :: val(4*9)
12   complex :: cval(2*9), cin(3)
13   
14   equal = (/ .true., .true., .false. /)
15   
16   ! use all combinations of the dim and mask arguments for the
17   ! reduction intrinsics
18   val( 1) = maxval((/ 1, 2, 3 /))
19   val( 2) = maxval((/ 1, 2, 3 /), 1)
20   val( 3) = maxval((/ 1, 2, 3 /), dim=1)
21   val( 4) = maxval((/ 1, 2, 3 /), equal)
22   val( 5) = maxval((/ 1, 2, 3 /), mask=equal)
23   val( 6) = maxval((/ 1, 2, 3 /), 1, equal)
24   val( 7) = maxval((/ 1, 2, 3 /), 1, mask=equal)
25   val( 8) = maxval((/ 1, 2, 3 /), dim=1, mask=equal)
26   val( 9) = maxval((/ 1, 2, 3 /), mask=equal, dim=1)
27        
28   val(10) = minval((/ 1, 2, 3 /))
29   val(11) = minval((/ 1, 2, 3 /), 1)
30   val(12) = minval((/ 1, 2, 3 /), dim=1)
31   val(13) = minval((/ 1, 2, 3 /), equal)
32   val(14) = minval((/ 1, 2, 3 /), mask=equal)
33   val(15) = minval((/ 1, 2, 3 /), 1, equal)
34   val(16) = minval((/ 1, 2, 3 /), 1, mask=equal)
35   val(17) = minval((/ 1, 2, 3 /), dim=1, mask=equal)
36   val(18) = minval((/ 1, 2, 3 /), mask=equal, dim=1)
37        
38   val(19) = product((/ 1, 2, 3 /))
39   val(20) = product((/ 1, 2, 3 /), 1)
40   val(21) = product((/ 1, 2, 3 /), dim=1)
41   val(22) = product((/ 1, 2, 3 /), equal)
42   val(23) = product((/ 1, 2, 3 /), mask=equal)
43   val(24) = product((/ 1, 2, 3 /), 1, equal)
44   val(25) = product((/ 1, 2, 3 /), 1, mask=equal)
45   val(26) = product((/ 1, 2, 3 /), dim=1, mask=equal)
46   val(27) = product((/ 1, 2, 3 /), mask=equal, dim=1)
47        
48   val(28) = sum((/ 1, 2, 3 /))
49   val(29) = sum((/ 1, 2, 3 /), 1)
50   val(30) = sum((/ 1, 2, 3 /), dim=1)
51   val(31) = sum((/ 1, 2, 3 /), equal)
52   val(32) = sum((/ 1, 2, 3 /), mask=equal)
53   val(33) = sum((/ 1, 2, 3 /), 1, equal)
54   val(34) = sum((/ 1, 2, 3 /), 1, mask=equal)
55   val(35) = sum((/ 1, 2, 3 /), dim=1, mask=equal)
56   val(36) = sum((/ 1, 2, 3 /), mask=equal, dim=1)
57   
58   if (any (val /= res)) call abort
59
60   ! Tests for complex arguments. These were broken by the original fix.
61
62   cin = cmplx((/1,2,3/))
63
64   cval(1) = product(cin)
65   cval(2) = product(cin, 1)
66   cval(3) = product(cin, dim=1)
67   cval(4) = product(cin, equal)
68   cval(5) = product(cin, mask=equal)
69   cval(6) = product(cin, 1, equal)
70   cval(7) = product(cin, 1, mask=equal)
71   cval(8) = product(cin, dim=1, mask=equal)
72   cval(9) = product(cin, mask=equal, dim=1)
73        
74   cval(10) = sum(cin)
75   cval(11) = sum(cin, 1)
76   cval(12) = sum(cin, dim=1)
77   cval(13) = sum(cin, equal)
78   cval(14) = sum(cin, mask=equal)
79   cval(15) = sum(cin, 1, equal)
80   cval(16) = sum(cin, 1, mask=equal)
81   cval(17) = sum(cin, dim=1, mask=equal)
82   cval(18) = sum(cin, mask=equal, dim=1)
83
84   if (any (cval /= cmplx(res(19:36)))) call abort
85 end program reduction_mask