xref: /llvm-project/flang/test/Evaluate/fold-findloc.f90 (revision 82e1e412e3249e15908c3f916eeaa04b96d4b453)
1! RUN: %python %S/test_folding.py %s %flang_fc1
2! Tests folding of FINDLOC, MAXLOC, & MINLOC
3module m1
4  integer, parameter :: ia1(2:6) = [1, 2, 3, 2, 1]
5  integer, parameter :: ia2(2:3,2:4) = reshape([1, 2, 3, 3, 2, 1], shape(ia2))
6  integer, parameter :: ia3(2,0,2) = 0 ! middle dimension has zero extent
7  real, parameter :: nan = real(z'7FC00000')
8  real, parameter :: nans(*) = [nan, nan]
9  real, parameter :: someNans(*) = [nan, 0.]
10
11  logical, parameter :: test_fi1a = all(findloc(ia1, 1) == 1)
12  logical, parameter :: test_fi1ar = rank(findloc(ia1, 1)) == 1
13  logical, parameter :: test_fi1ak = kind(findloc(ia1, 1, kind=2)) == 2
14  logical, parameter :: test_fi1ad = findloc(ia1, 1, dim=1) == 1
15  logical, parameter :: test_fi1adr = rank(findloc(ia1, 1, dim=1)) == 0
16  logical, parameter :: test_fi1b = all(findloc(ia1, 1, back=.true.) == 5)
17  logical, parameter :: test_fi1c = all(findloc(ia1, 2, mask=[.false., .false., .true., .true., .true.]) == 4)
18
19  logical, parameter :: test_fi2a = all(findloc(ia2, 1) == [1, 1])
20  logical, parameter :: test_fi2ar = rank(findloc(ia2, 1)) == 1
21  logical, parameter :: test_fi2b = all(findloc(ia2, 1, back=.true.) == [2, 3])
22  logical, parameter :: test_fi2c = all(findloc(ia2, 2, mask=reshape([.false., .false., .true., .true., .true., .false.], shape(ia2))) == [1, 3])
23  logical, parameter :: test_fi2d = all(findloc(ia2, 1, dim=1) == [1, 0, 2])
24  logical, parameter :: test_fi2e = all(findloc(ia2, 1, dim=2) == [1, 3])
25
26  logical, parameter :: test_xi1a = all(maxloc(ia1) == 3)
27  logical, parameter :: test_xi1ar = rank(maxloc(ia1)) == 1
28  logical, parameter :: test_xi1ak = kind(maxloc(ia1, kind=2)) == 2
29  logical, parameter :: test_xi1ad = maxloc(ia1, dim=1) == 3
30  logical, parameter :: test_xi1adr = rank(maxloc(ia1, dim=1)) == 0
31  logical, parameter :: test_xi1b = all(maxloc(ia1, back=.true.) == 3)
32  logical, parameter :: test_xi1c = all(maxloc(ia1, mask=[.false., .true., .false., .true., .true.]) == 2)
33  logical, parameter :: test_xi1d = all(maxloc(ia1, mask=[.false., .true., .false., .true., .true.], back=.true.) == 4)
34
35  logical, parameter :: test_xi2a = all(maxloc(ia2) == [1, 2])
36  logical, parameter :: test_xi2ar = rank(maxloc(ia2)) == 1
37  logical, parameter :: test_xi2b = all(maxloc(ia2, back=.true.) == [2, 2])
38  logical, parameter :: test_xi2c = all(maxloc(ia2, mask=reshape([.false., .true., .true., .true., .true., .true.], shape(ia2))) == [1, 2])
39  logical, parameter :: test_xi2d = all(maxloc(ia2, mask=reshape([.false., .true., .true., .true., .true., .true.], shape(ia2)), back=.true.) == [2, 2])
40  logical, parameter :: test_xi2e = all(maxloc(ia2, dim=1) == [2, 1, 1])
41  logical, parameter :: test_xi2f = all(maxloc(ia2, dim=1, back=.true.) == [2, 2, 1])
42  logical, parameter :: test_xi2g = all(maxloc(ia2, dim=2) == [2, 2])
43
44  logical, parameter :: test_ni1a = all(minloc(ia1) == 1)
45  logical, parameter :: test_ni1ar = rank(minloc(ia1)) == 1
46  logical, parameter :: test_ni1ak = kind(minloc(ia1, kind=2)) == 2
47  logical, parameter :: test_ni1ad = minloc(ia1, dim=1) == 1
48  logical, parameter :: test_ni1adr = rank(minloc(ia1, dim=1)) == 0
49  logical, parameter :: test_ni1b = all(minloc(ia1, back=.true.) == 5)
50  logical, parameter :: test_ni1c = all(minloc(ia1, mask=[.false., .true., .true., .true., .false.]) == 2)
51  logical, parameter :: test_ni1d = all(minloc(ia1, mask=[.false., .true., .true., .true., .false.], back=.true.) == 4)
52
53  logical, parameter :: test_ni2a = all(minloc(ia2) == [1, 1])
54  logical, parameter :: test_ni2ar = rank(minloc(ia2)) == 1
55  logical, parameter :: test_ni2b = all(minloc(ia2, back=.true.) == [2, 3])
56  logical, parameter :: test_ni2c = all(minloc(ia2, mask=reshape([.false., .true., .true., .false., .true., .false.], shape(ia2))) == [2, 1])
57  logical, parameter :: test_ni2d = all(minloc(ia2, mask=reshape([.false., .true., .true., .false., .true., .false.], shape(ia2)), back=.true.) == [1, 3])
58  logical, parameter :: test_ni2e = all(minloc(ia2, dim=1) == [1, 1, 2])
59  logical, parameter :: test_ni2f = all(minloc(ia2, dim=1, back=.true.) == [1, 2, 2])
60  logical, parameter :: test_ni2g = all(minloc(ia2, dim=2) == [1, 3])
61
62  logical, parameter :: test_xi3a = all(maxloc(ia3) == [0,0,0])
63  logical, parameter :: test_xi3b = all(maxloc(ia3, back=.true.) == [0,0,0])
64  logical, parameter :: test_xi3c = all(maxloc(ia3, dim=2) == reshape([0,0,0,0],shape=[2,2]))
65  logical, parameter :: test_xi3d = all(maxloc(ia3, dim=2, back=.true.) == reshape([0,0,0,0],shape=[2,2]))
66
67  character(1), parameter :: a(4) = ['a', 'b', 'a', 'b']
68  logical, parameter :: test_char1 = all(maxloc(a).eq.[2])
69  logical, parameter :: test_char2 = all(minloc(a).eq.[1])
70  logical, parameter :: test_char3 = all(maxloc(a, back=.true.).eq.[4])
71  logical, parameter :: test_char4 = all(minloc(a, back=.true.).eq.[3])
72
73  ! Check with scalar MASK=
74  logical, parameter:: test_mia1_mt  = all(minloc(ia1, mask=.true.) == 1)
75  logical, parameter:: test_mia1_mtd = all(minloc(ia1, mask=.true., dim=1) == [1])
76  logical, parameter:: test_xia1_mt  = all(maxloc(ia1, mask=.true.) == 3)
77  logical, parameter:: test_xia1_mtd = all(maxloc(ia1, mask=.true., dim=1) == [3])
78  logical, parameter:: test_fia1_mt  = all(findloc(ia1, 1, mask=.true.) == 1)
79  logical, parameter:: test_fia1_mtd = all(findloc(ia1, 1, mask=.true., dim=1) == [1])
80  logical, parameter:: test_fia2_mtd1 = all(findloc(ia2, 1, dim=1, mask=.true.) == [1, 0, 2])
81  logical, parameter:: test_fia2_mtd2 = all(findloc(ia2, 1, dim=2, mask=.true.) == [1, 3])
82
83  logical, parameter:: test_mia1_mf  = all(minloc(ia1, mask=.false.) == 0)
84  logical, parameter:: test_mia1_mfd = all(minloc(ia1, mask=.false., dim=1) == [0])
85  logical, parameter:: test_xia1_mf  = all(maxloc(ia1, mask=.false.) == 0)
86  logical, parameter:: test_xia1_mfd = all(maxloc(ia1, mask=.false., dim=1) == [0])
87  logical, parameter:: test_fia1_mf  = all(findloc(ia1, 1, mask=.false.) == 0)
88  logical, parameter:: test_fia1_mfd = all(findloc(ia1, 1, mask=.false., dim=1) == [0])
89  logical, parameter:: test_fia2_mfd1 = all(findloc(ia2, 1, dim=1, mask=.false.) == [0, 0, 0])
90  logical, parameter:: test_fia2_mfd2 = all(findloc(ia2, 1, dim=2, mask=.false.) == [0, 0])
91
92  logical, parameter :: test_nan1 = maxloc(nans,1) == 1
93  logical, parameter :: test_nan2 = maxloc(nans,1,back=.true.) == 2
94  logical, parameter :: test_nan3 = minloc(nans,1) == 1
95  logical, parameter :: test_nan4 = minloc(nans,1,back=.true.) == 2
96  logical, parameter :: test_nan5 = maxloc(someNans,1) == 2
97  logical, parameter :: test_nan6 = maxloc(someNans,1,back=.true.) == 2
98  logical, parameter :: test_nan7 = minloc(someNans,1) == 2
99  logical, parameter :: test_nan8 = minloc(someNans,1,back=.true.) == 2
100end module
101