xref: /llvm-project/flang/test/Evaluate/folding03.f90 (revision 0e05ab6745e7c2c24ec163d1cdf6309b21621d70)
1! RUN: %python %S/test_folding.py %s %flang_fc1
2! Test operation folding edge case (both expected value and messages)
3! These tests make assumptions regarding real(4) and integer(4) extrema.
4
5#define TEST_ISNAN(v) logical, parameter :: test_##v =.NOT.(v.EQ.v)
6
7module integer_tests
8  integer(4), parameter :: i4_pmax = 2147483647_4
9  ! Fortran grammar rule R605 prevents from writing -2147483648_4 in an
10  ! expression because literal-constant are not signed so this would parse
11  ! to -(2147483648_4) and 2147483648_4 is not accepted as a literal-constant.
12  ! However, one can reach this value with operations.
13  integer(4), parameter :: i4_nmax = -2147483647_4 - 1_4
14
15  ! Integer division by zero are not tested here because they are handled as fatal
16  ! errors in constants.
17
18  !WARN: warning: INTEGER(4) negation overflowed
19  logical, parameter :: test_overflow_unary_minus1 = (-i4_nmax).EQ.i4_nmax
20  logical, parameter :: test_no_overflow_unary_minus1 = (-i4_pmax).EQ.(i4_nmax+1_4)
21  logical, parameter :: test_no_overflow_unary_plus1 = (+i4_pmax).EQ.i4_pmax
22  logical, parameter :: test_no_overflow_unary_plus2 = (+i4_nmax).EQ.i4_nmax
23
24  !WARN: warning: INTEGER(4) addition overflowed
25  logical, parameter :: test_overflow_add1 = (i4_pmax+1_4).EQ.i4_nmax
26  !WARN: warning: INTEGER(4) addition overflowed
27  logical, parameter :: test_overflow_add2 = (i4_nmax + (-1_4)).EQ.i4_pmax
28  !WARN: warning: INTEGER(4) addition overflowed
29  logical, parameter :: test_overflow_add3 = (i4_pmax + i4_pmax).EQ.(-2_4)
30  !WARN: warning: INTEGER(4) addition overflowed
31  logical, parameter :: test_overflow_add4 = (i4_nmax + i4_nmax).EQ.(0_4)
32  logical, parameter :: test_no_overflow_add1 = (i4_pmax + 0_4).EQ.i4_pmax
33  logical, parameter :: test_no_overflow_add2 = (i4_nmax + (-0_4)).EQ.i4_nmax
34  logical, parameter :: test_no_overflow_add3 = (i4_pmax + i4_nmax).EQ.(-1_4)
35  logical, parameter :: test_no_overflow_add4 = (i4_nmax + i4_pmax).EQ.(-1_4)
36
37  !WARN: warning: INTEGER(4) subtraction overflowed
38  logical, parameter :: test_overflow_sub1 = (i4_nmax - 1_4).EQ.i4_pmax
39  !WARN: warning: INTEGER(4) subtraction overflowed
40  logical, parameter :: test_overflow_sub2 = (i4_pmax - (-1_4)).EQ.i4_nmax
41  !WARN: warning: INTEGER(4) subtraction overflowed
42  logical, parameter :: test_overflow_sub3 = (i4_nmax - i4_pmax).EQ.(1_4)
43  !WARN: warning: INTEGER(4) subtraction overflowed
44  logical, parameter :: test_overflow_sub4 = (i4_pmax - i4_nmax).EQ.(-1_4)
45  logical, parameter :: test_no_overflow_sub1 = (i4_nmax - 0_4).EQ.i4_nmax
46  logical, parameter :: test_no_overflow_sub2 = (i4_pmax - (-0_4)).EQ.i4_pmax
47  logical, parameter :: test_no_overflow_sub3 = (i4_nmax - i4_nmax).EQ.0_4
48  logical, parameter :: test_no_overflow_sub4 = (i4_pmax - i4_pmax).EQ.0_4
49
50
51  !WARN: warning: INTEGER(4) multiplication overflowed
52  logical, parameter :: test_overflow_mult1 = (i4_pmax*2_4).EQ.(-2_4)
53  !WARN: warning: INTEGER(4) multiplication overflowed
54  logical, parameter :: test_overflow_mult2 = (i4_nmax*2_4).EQ.(0_4)
55  !WARN: warning: INTEGER(4) multiplication overflowed
56  logical, parameter :: test_overflow_mult3 = (i4_nmax*i4_nmax).EQ.(0_4)
57  !WARN: warning: INTEGER(4) multiplication overflowed
58  logical, parameter :: test_overflow_mult4 = (i4_pmax*i4_pmax).EQ.(1_4)
59
60  !WARN: warning: INTEGER(4) division overflowed
61  logical, parameter :: test_overflow_div1 = (i4_nmax/(-1_4)).EQ.(i4_nmax)
62  logical, parameter :: test_no_overflow_div1 = (i4_nmax/(-2_4)).EQ.(1_4 + i4_pmax/2_4)
63  logical, parameter :: test_no_overflow_div2 = (i4_nmax/i4_nmax).EQ.(1_4)
64
65  !WARN: warning: INTEGER(4) power overflowed
66  logical, parameter :: test_overflow_pow1 = (i4_pmax**2_4).EQ.(1_4)
67  !WARN: warning: INTEGER(4) power overflowed
68  logical, parameter :: test_overflow_pow3 = (i4_nmax**2_4).EQ.(0_4)
69  logical, parameter :: test_no_overflow_pow1 = ((-1_4)**i4_nmax).EQ.(1_4)
70  logical, parameter :: test_no_overflow_pow2 = ((-1_4)**i4_pmax).EQ.(-1_4)
71
72end module
73
74module real_tests
75  ! Test real(4) operation folding on edge cases (inf and NaN)
76
77  real(4), parameter :: r4_pmax = 3.4028235E38
78  real(4), parameter :: r4_nmax = -3.4028235E38
79  !WARN: warning: invalid argument on division
80  real(4), parameter :: r4_nan = 0._4/0._4
81  TEST_ISNAN(r4_nan)
82  !WARN: warning: division by zero
83  real(4), parameter :: r4_pinf = 1._4/0._4
84  !WARN: warning: division by zero
85  real(4), parameter :: r4_ninf = -1._4/0._4
86
87  logical, parameter :: test_r4_nan_parentheses1 = .NOT.(((r4_nan)).EQ.r4_nan)
88  logical, parameter :: test_r4_nan_parentheses2 = .NOT.(((r4_nan)).LT.r4_nan)
89  logical, parameter :: test_r4_nan_parentheses3 = .NOT.(((r4_nan)).GT.r4_nan)
90  logical, parameter :: test_r4_nan_parentheses4 = ((r4_nan)).NE.r4_nan
91  logical, parameter :: test_r4_pinf_parentheses = ((r4_pinf)).EQ.r4_pinf
92  logical, parameter :: test_r4_ninf_parentheses = ((r4_ninf)).EQ.r4_ninf
93
94  ! No warnings expected
95  logical, parameter :: test_r4_negation1 = (-r4_pmax).EQ.r4_nmax
96  logical, parameter :: test_r4_negation2 = (-r4_nmax).EQ.r4_pmax
97  logical, parameter :: test_r4_negation3 = (-r4_pinf).EQ.r4_ninf
98  logical, parameter :: test_r4_negation4 = (-r4_ninf).EQ.r4_pinf
99  logical, parameter :: test_r4_plus1 = (+r4_pmax).EQ.r4_pmax
100  logical, parameter :: test_r4_plus2 = (+r4_nmax).EQ.r4_nmax
101  logical, parameter :: test_r4_plus3 = (+r4_pinf).EQ.r4_pinf
102  logical, parameter :: test_r4_plus4 = (+r4_ninf).EQ.r4_ninf
103  ! NaN propagation , no warnings expected (quiet)
104  real(4), parameter :: r4_nan_minus = (-r4_nan)
105  TEST_ISNAN(r4_nan_minus)
106  real(4), parameter :: r4_nan_plus = (+r4_nan)
107  TEST_ISNAN(r4_nan_plus)
108
109  !WARN: warning: overflow on addition
110  logical, parameter :: test_inf_r4_add9 = (r4_pmax + r4_pmax).eq.(r4_pinf)
111  !WARN: warning: overflow on addition
112  logical, parameter :: test_inf_r4_add10 = (r4_nmax + r4_nmax).eq.(r4_ninf)
113  !WARN: warning: overflow on subtraction
114  logical, parameter :: test_inf_r4_sub9 = (r4_pmax - r4_nmax).eq.(r4_pinf)
115  !WARN: warning: overflow on subtraction
116  logical, parameter :: test_inf_r4_sub10 = (r4_nmax - r4_pmax).eq.(r4_ninf)
117
118  ! No warnings expected below (inf propagation).
119  logical, parameter :: test_inf_r4_add1 = (r4_pinf + r4_pinf).EQ.(r4_pinf)
120  logical, parameter :: test_inf_r4_add2 = (r4_ninf + r4_ninf).EQ.(r4_ninf)
121  logical, parameter :: test_inf_r4_add3 = (r4_pinf + r4_nmax).EQ.(r4_pinf)
122  logical, parameter :: test_inf_r4_add4 = (r4_pinf + r4_pmax).EQ.(r4_pinf)
123  logical, parameter :: test_inf_r4_add5 = (r4_ninf + r4_pmax).EQ.(r4_ninf)
124  logical, parameter :: test_inf_r4_add6 = (r4_ninf + r4_nmax).EQ.(r4_ninf)
125  logical, parameter :: test_inf_r4_add7 = (r4_ninf + 0._4).EQ.(r4_ninf)
126  logical, parameter :: test_inf_r4_add8 = (r4_pinf + 0._4).EQ.(r4_pinf)
127
128  !WARN: warning: invalid argument on subtraction
129  real(4), parameter :: r4_nan_sub1 = r4_pinf - r4_pinf
130  TEST_ISNAN(r4_nan_sub1)
131  !WARN: warning: invalid argument on subtraction
132  real(4), parameter :: r4_nan_sub2 = r4_ninf - r4_ninf
133  TEST_ISNAN(r4_nan_sub2)
134  !WARN: warning: invalid argument on addition
135  real(4), parameter :: r4_nan_add1 = r4_ninf + r4_pinf
136  TEST_ISNAN(r4_nan_add1)
137  !WARN: warning: invalid argument on addition
138  real(4), parameter :: r4_nan_add2 = r4_pinf + r4_ninf
139  TEST_ISNAN(r4_nan_add2)
140
141  ! No warnings expected here (quiet NaN propagation)
142  real(4), parameter :: r4_nan_sub3 = 0._4 - r4_nan
143  TEST_ISNAN(r4_nan_sub3)
144  real(4), parameter :: r4_nan_sub4 = r4_nan - r4_pmax
145  TEST_ISNAN(r4_nan_sub4)
146  real(4), parameter :: r4_nan_sub5 = r4_nan - r4_nmax
147  TEST_ISNAN(r4_nan_sub5)
148  real(4), parameter :: r4_nan_sub6 = r4_nan - r4_nan
149  TEST_ISNAN(r4_nan_sub6)
150  real(4), parameter :: r4_nan_add3 = 0._4 + r4_nan
151  TEST_ISNAN(r4_nan_add3)
152  real(4), parameter :: r4_nan_add4 = r4_nan + r4_pmax
153  TEST_ISNAN(r4_nan_add4)
154  real(4), parameter :: r4_nan_add5 = r4_nmax + r4_nan
155  TEST_ISNAN(r4_nan_add5)
156  real(4), parameter :: r4_nan_add6 = r4_nan + r4_nan
157  TEST_ISNAN(r4_nan_add6)
158
159  !WARN: warning: overflow on multiplication
160  logical, parameter :: test_inf_r4_mult1 = (1.5_4*r4_pmax).eq.(r4_pinf)
161  !WARN: warning: overflow on multiplication
162  logical, parameter :: test_inf_r4_mult2 = (1.5_4*r4_nmax).eq.(r4_ninf)
163  !WARN: warning: overflow on division
164  logical, parameter :: test_inf_r4_div1 = (r4_nmax/(-0.5_4)).eq.(r4_pinf)
165  !WARN: warning: overflow on division
166  logical, parameter :: test_inf_r4_div2 = (r4_pmax/(-0.5_4)).eq.(r4_ninf)
167
168  ! No warnings expected below (inf propagation).
169  logical, parameter :: test_inf_r4_mult3 = (r4_pinf*r4_pinf).EQ.(r4_pinf)
170  logical, parameter :: test_inf_r4_mult4 = (r4_ninf*r4_ninf).EQ.(r4_pinf)
171  logical, parameter :: test_inf_r4_mult5 = (r4_pinf*0.1_4).EQ.(r4_pinf)
172  logical, parameter :: test_inf_r4_mult6 = (r4_ninf*r4_nmax).EQ.(r4_pinf)
173  logical, parameter :: test_inf_r4_div3 = (r4_pinf/0.).EQ.(r4_pinf)
174  logical, parameter :: test_inf_r4_div4 = (r4_ninf/0.).EQ.(r4_ninf)
175  logical, parameter :: test_inf_r4_div5 = (0./r4_pinf).EQ.(0.)
176  logical, parameter :: test_inf_r4_div6 = (0./r4_ninf).EQ.(0.)
177  logical, parameter :: test_inf_r4_div7 = (r4_pinf/r4_pmax).EQ.(r4_pinf)
178  logical, parameter :: test_inf_r4_div8 = (r4_pinf/r4_nmax).EQ.(r4_ninf)
179  logical, parameter :: test_inf_r4_div9 = (r4_nmax/r4_pinf).EQ.(0.)
180  logical, parameter :: test_inf_r4_div10 = (r4_nmax/r4_ninf).EQ.(0.)
181
182  !WARN: warning: invalid argument on division
183  real(4), parameter :: r4_nan_div1 = 0._4/0._4
184  TEST_ISNAN(r4_nan_div1)
185  !WARN: warning: invalid argument on division
186  real(4), parameter :: r4_nan_div2 = r4_ninf/r4_ninf
187  TEST_ISNAN(r4_nan_div2)
188  !WARN: warning: invalid argument on division
189  real(4), parameter :: r4_nan_div3 = r4_ninf/r4_pinf
190  TEST_ISNAN(r4_nan_div3)
191  !WARN: warning: invalid argument on division
192  real(4), parameter :: r4_nan_div4 = r4_pinf/r4_ninf
193  TEST_ISNAN(r4_nan_div4)
194  !WARN: warning: invalid argument on division
195  real(4), parameter :: r4_nan_div5 = r4_pinf/r4_pinf
196  TEST_ISNAN(r4_nan_div5)
197  !WARN: warning: invalid argument on multiplication
198  real(4), parameter :: r4_nan_mult1 = r4_pinf*0._4
199  TEST_ISNAN(r4_nan_mult1)
200  !WARN: warning: invalid argument on multiplication
201  real(4), parameter :: r4_nan_mult2 = 0._4*r4_ninf
202  TEST_ISNAN(r4_nan_mult2)
203
204  ! No warnings expected here (quiet NaN propagation)
205  real(4), parameter :: r4_nan_div6 = 0._4/r4_nan
206  TEST_ISNAN(r4_nan_div6)
207  real(4), parameter :: r4_nan_div7 = r4_nan/r4_nan
208  TEST_ISNAN(r4_nan_div7)
209  real(4), parameter :: r4_nan_div8 = r4_nan/0._4
210  TEST_ISNAN(r4_nan_div8)
211  real(4), parameter :: r4_nan_div9 = r4_nan/1._4
212  TEST_ISNAN(r4_nan_div9)
213  real(4), parameter :: r4_nan_mult3 = r4_nan*1._4
214  TEST_ISNAN(r4_nan_mult3)
215  real(4), parameter :: r4_nan_mult4 = r4_nan*r4_nan
216  TEST_ISNAN(r4_nan_mult4)
217  real(4), parameter :: r4_nan_mult5 = 0._4*r4_nan
218  TEST_ISNAN(r4_nan_mult5)
219
220  ! TODO: ** operator folding
221  !  logical, parameter :: test_inf_r4_exp1 = (r4_pmax**2._4).EQ.(r4_pinf)
222
223  ! Relational operator edge cases (No warnings expected?)
224  logical, parameter :: test_inf_r4_eq1 = r4_pinf.EQ.r4_pinf
225  logical, parameter :: test_inf_r4_eq2 = r4_ninf.EQ.r4_ninf
226  logical, parameter :: test_inf_r4_eq3 = .NOT.(r4_pinf.EQ.r4_ninf)
227  logical, parameter :: test_inf_r4_eq4 = .NOT.(r4_pinf.EQ.r4_pmax)
228
229  logical, parameter :: test_inf_r4_ne1 = .NOT.(r4_pinf.NE.r4_pinf)
230  logical, parameter :: test_inf_r4_ne2 = .NOT.(r4_ninf.NE.r4_ninf)
231  logical, parameter :: test_inf_r4_ne3 = r4_pinf.NE.r4_ninf
232  logical, parameter :: test_inf_r4_ne4 = r4_pinf.NE.r4_pmax
233
234  logical, parameter :: test_inf_r4_gt1 = .NOT.(r4_pinf.GT.r4_pinf)
235  logical, parameter :: test_inf_r4_gt2 = .NOT.(r4_ninf.GT.r4_ninf)
236  logical, parameter :: test_inf_r4_gt3 = r4_pinf.GT.r4_ninf
237  logical, parameter :: test_inf_r4_gt4 = r4_pinf.GT.r4_pmax
238
239  logical, parameter :: test_inf_r4_lt1 = .NOT.(r4_pinf.LT.r4_pinf)
240  logical, parameter :: test_inf_r4_lt2 = .NOT.(r4_ninf.LT.r4_ninf)
241  logical, parameter :: test_inf_r4_lt3 = r4_ninf.LT.r4_pinf
242  logical, parameter :: test_inf_r4_lt4 = r4_pmax.LT.r4_pinf
243
244  logical, parameter :: test_inf_r4_ge1 = r4_pinf.GE.r4_pinf
245  logical, parameter :: test_inf_r4_ge2 = r4_ninf.GE.r4_ninf
246  logical, parameter :: test_inf_r4_ge3 = .NOT.(r4_ninf.GE.r4_pinf)
247  logical, parameter :: test_inf_r4_ge4 = .NOT.(r4_pmax.GE.r4_pinf)
248
249  logical, parameter :: test_inf_r4_le1 = r4_pinf.LE.r4_pinf
250  logical, parameter :: test_inf_r4_le2 = r4_ninf.LE.r4_ninf
251  logical, parameter :: test_inf_r4_le3 = .NOT.(r4_pinf.LE.r4_ninf)
252  logical, parameter :: test_inf_r4_le4 = .NOT.(r4_pinf.LE.r4_pmax)
253
254  ! Invalid relational argument
255  logical, parameter :: test_nan_r4_eq1 = .NOT.(r4_nan.EQ.r4_nan)
256  logical, parameter :: test_nan_r4_lt1 = .NOT.(r4_nan.LE.r4_nan)
257  logical, parameter :: test_nan_r4_gt1 = .NOT.(r4_nan.GT.r4_nan)
258  logical, parameter :: test_nan_r4_ne1 = r4_nan.NE.r4_nan
259
260end module
261
262! TODO: edge case conversions
263! TODO: complex tests (or is real tests enough?)
264
265! Logical operation (with logical arguments) cannot overflow or be invalid.
266! CHARACTER folding operations may cause host memory exhaustion if the
267! string are very large. This will cause a fatal error for the program
268! doing folding (e.g. f18), so there is nothing very interesting to test here.
269