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