269 lines · plain
1! RUN: %python %S/test_folding.py %s %flang_fc12! 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_tests8 integer(4), parameter :: i4_pmax = 2147483647_49 ! Fortran grammar rule R605 prevents from writing -2147483648_4 in an10 ! expression because literal-constant are not signed so this would parse11 ! 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_414 15 ! Integer division by zero are not tested here because they are handled as fatal16 ! errors in constants.17 18 !WARN: warning: INTEGER(4) negation overflowed [-Wfolding-exception]19 logical, parameter :: test_overflow_unary_minus1 = (-i4_nmax).EQ.i4_nmax20 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_pmax22 logical, parameter :: test_no_overflow_unary_plus2 = (+i4_nmax).EQ.i4_nmax23 24 !WARN: warning: INTEGER(4) addition overflowed [-Wfolding-exception]25 logical, parameter :: test_overflow_add1 = (i4_pmax+1_4).EQ.i4_nmax26 !WARN: warning: INTEGER(4) addition overflowed [-Wfolding-exception]27 logical, parameter :: test_overflow_add2 = (i4_nmax + (-1_4)).EQ.i4_pmax28 !WARN: warning: INTEGER(4) addition overflowed [-Wfolding-exception]29 logical, parameter :: test_overflow_add3 = (i4_pmax + i4_pmax).EQ.(-2_4)30 !WARN: warning: INTEGER(4) addition overflowed [-Wfolding-exception]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_pmax33 logical, parameter :: test_no_overflow_add2 = (i4_nmax + (-0_4)).EQ.i4_nmax34 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 [-Wfolding-exception]38 logical, parameter :: test_overflow_sub1 = (i4_nmax - 1_4).EQ.i4_pmax39 !WARN: warning: INTEGER(4) subtraction overflowed [-Wfolding-exception]40 logical, parameter :: test_overflow_sub2 = (i4_pmax - (-1_4)).EQ.i4_nmax41 !WARN: warning: INTEGER(4) subtraction overflowed [-Wfolding-exception]42 logical, parameter :: test_overflow_sub3 = (i4_nmax - i4_pmax).EQ.(1_4)43 !WARN: warning: INTEGER(4) subtraction overflowed [-Wfolding-exception]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_nmax46 logical, parameter :: test_no_overflow_sub2 = (i4_pmax - (-0_4)).EQ.i4_pmax47 logical, parameter :: test_no_overflow_sub3 = (i4_nmax - i4_nmax).EQ.0_448 logical, parameter :: test_no_overflow_sub4 = (i4_pmax - i4_pmax).EQ.0_449 50 51 !WARN: warning: INTEGER(4) multiplication overflowed [-Wfolding-exception]52 logical, parameter :: test_overflow_mult1 = (i4_pmax*2_4).EQ.(-2_4)53 !WARN: warning: INTEGER(4) multiplication overflowed [-Wfolding-exception]54 logical, parameter :: test_overflow_mult2 = (i4_nmax*2_4).EQ.(0_4)55 !WARN: warning: INTEGER(4) multiplication overflowed [-Wfolding-exception]56 logical, parameter :: test_overflow_mult3 = (i4_nmax*i4_nmax).EQ.(0_4)57 !WARN: warning: INTEGER(4) multiplication overflowed [-Wfolding-exception]58 logical, parameter :: test_overflow_mult4 = (i4_pmax*i4_pmax).EQ.(1_4)59 60 !WARN: warning: INTEGER(4) division overflowed [-Wfolding-exception]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 [-Wfolding-exception]66 logical, parameter :: test_overflow_pow1 = (i4_pmax**2_4).EQ.(1_4)67 !WARN: warning: INTEGER(4) power overflowed [-Wfolding-exception]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 module73 74module real_tests75 ! Test real(4) operation folding on edge cases (inf and NaN)76 77 real(4), parameter :: r4_pmax = 3.4028235E3878 real(4), parameter :: r4_nmax = -3.4028235E3879 !WARN: warning: invalid argument on division [-Wfolding-exception]80 real(4), parameter :: r4_nan = 0._4/0._481 TEST_ISNAN(r4_nan)82 !WARN: warning: division by zero [-Wfolding-exception]83 real(4), parameter :: r4_pinf = 1._4/0._484 !WARN: warning: division by zero [-Wfolding-exception]85 real(4), parameter :: r4_ninf = -1._4/0._486 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_nan91 logical, parameter :: test_r4_pinf_parentheses = ((r4_pinf)).EQ.r4_pinf92 logical, parameter :: test_r4_ninf_parentheses = ((r4_ninf)).EQ.r4_ninf93 94 ! No warnings expected95 logical, parameter :: test_r4_negation1 = (-r4_pmax).EQ.r4_nmax96 logical, parameter :: test_r4_negation2 = (-r4_nmax).EQ.r4_pmax97 logical, parameter :: test_r4_negation3 = (-r4_pinf).EQ.r4_ninf98 logical, parameter :: test_r4_negation4 = (-r4_ninf).EQ.r4_pinf99 logical, parameter :: test_r4_plus1 = (+r4_pmax).EQ.r4_pmax100 logical, parameter :: test_r4_plus2 = (+r4_nmax).EQ.r4_nmax101 logical, parameter :: test_r4_plus3 = (+r4_pinf).EQ.r4_pinf102 logical, parameter :: test_r4_plus4 = (+r4_ninf).EQ.r4_ninf103 ! 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 [-Wfolding-exception]110 logical, parameter :: test_inf_r4_add9 = (r4_pmax + r4_pmax).eq.(r4_pinf)111 !WARN: warning: overflow on addition [-Wfolding-exception]112 logical, parameter :: test_inf_r4_add10 = (r4_nmax + r4_nmax).eq.(r4_ninf)113 !WARN: warning: overflow on subtraction [-Wfolding-exception]114 logical, parameter :: test_inf_r4_sub9 = (r4_pmax - r4_nmax).eq.(r4_pinf)115 !WARN: warning: overflow on subtraction [-Wfolding-exception]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 [-Wfolding-exception]129 real(4), parameter :: r4_nan_sub1 = r4_pinf - r4_pinf130 TEST_ISNAN(r4_nan_sub1)131 !WARN: warning: invalid argument on subtraction [-Wfolding-exception]132 real(4), parameter :: r4_nan_sub2 = r4_ninf - r4_ninf133 TEST_ISNAN(r4_nan_sub2)134 !WARN: warning: invalid argument on addition [-Wfolding-exception]135 real(4), parameter :: r4_nan_add1 = r4_ninf + r4_pinf136 TEST_ISNAN(r4_nan_add1)137 !WARN: warning: invalid argument on addition [-Wfolding-exception]138 real(4), parameter :: r4_nan_add2 = r4_pinf + r4_ninf139 TEST_ISNAN(r4_nan_add2)140 141 ! No warnings expected here (quiet NaN propagation)142 real(4), parameter :: r4_nan_sub3 = 0._4 - r4_nan143 TEST_ISNAN(r4_nan_sub3)144 real(4), parameter :: r4_nan_sub4 = r4_nan - r4_pmax145 TEST_ISNAN(r4_nan_sub4)146 real(4), parameter :: r4_nan_sub5 = r4_nan - r4_nmax147 TEST_ISNAN(r4_nan_sub5)148 real(4), parameter :: r4_nan_sub6 = r4_nan - r4_nan149 TEST_ISNAN(r4_nan_sub6)150 real(4), parameter :: r4_nan_add3 = 0._4 + r4_nan151 TEST_ISNAN(r4_nan_add3)152 real(4), parameter :: r4_nan_add4 = r4_nan + r4_pmax153 TEST_ISNAN(r4_nan_add4)154 real(4), parameter :: r4_nan_add5 = r4_nmax + r4_nan155 TEST_ISNAN(r4_nan_add5)156 real(4), parameter :: r4_nan_add6 = r4_nan + r4_nan157 TEST_ISNAN(r4_nan_add6)158 159 !WARN: warning: overflow on multiplication [-Wfolding-exception]160 logical, parameter :: test_inf_r4_mult1 = (1.5_4*r4_pmax).eq.(r4_pinf)161 !WARN: warning: overflow on multiplication [-Wfolding-exception]162 logical, parameter :: test_inf_r4_mult2 = (1.5_4*r4_nmax).eq.(r4_ninf)163 !WARN: warning: overflow on division [-Wfolding-exception]164 logical, parameter :: test_inf_r4_div1 = (r4_nmax/(-0.5_4)).eq.(r4_pinf)165 !WARN: warning: overflow on division [-Wfolding-exception]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 [-Wfolding-exception]183 real(4), parameter :: r4_nan_div1 = 0._4/0._4184 TEST_ISNAN(r4_nan_div1)185 !WARN: warning: invalid argument on division [-Wfolding-exception]186 real(4), parameter :: r4_nan_div2 = r4_ninf/r4_ninf187 TEST_ISNAN(r4_nan_div2)188 !WARN: warning: invalid argument on division [-Wfolding-exception]189 real(4), parameter :: r4_nan_div3 = r4_ninf/r4_pinf190 TEST_ISNAN(r4_nan_div3)191 !WARN: warning: invalid argument on division [-Wfolding-exception]192 real(4), parameter :: r4_nan_div4 = r4_pinf/r4_ninf193 TEST_ISNAN(r4_nan_div4)194 !WARN: warning: invalid argument on division [-Wfolding-exception]195 real(4), parameter :: r4_nan_div5 = r4_pinf/r4_pinf196 TEST_ISNAN(r4_nan_div5)197 !WARN: warning: invalid argument on multiplication [-Wfolding-exception]198 real(4), parameter :: r4_nan_mult1 = r4_pinf*0._4199 TEST_ISNAN(r4_nan_mult1)200 !WARN: warning: invalid argument on multiplication [-Wfolding-exception]201 real(4), parameter :: r4_nan_mult2 = 0._4*r4_ninf202 TEST_ISNAN(r4_nan_mult2)203 204 ! No warnings expected here (quiet NaN propagation)205 real(4), parameter :: r4_nan_div6 = 0._4/r4_nan206 TEST_ISNAN(r4_nan_div6)207 real(4), parameter :: r4_nan_div7 = r4_nan/r4_nan208 TEST_ISNAN(r4_nan_div7)209 real(4), parameter :: r4_nan_div8 = r4_nan/0._4210 TEST_ISNAN(r4_nan_div8)211 real(4), parameter :: r4_nan_div9 = r4_nan/1._4212 TEST_ISNAN(r4_nan_div9)213 real(4), parameter :: r4_nan_mult3 = r4_nan*1._4214 TEST_ISNAN(r4_nan_mult3)215 real(4), parameter :: r4_nan_mult4 = r4_nan*r4_nan216 TEST_ISNAN(r4_nan_mult4)217 real(4), parameter :: r4_nan_mult5 = 0._4*r4_nan218 TEST_ISNAN(r4_nan_mult5)219 220 ! TODO: ** operator folding221 ! 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_pinf225 logical, parameter :: test_inf_r4_eq2 = r4_ninf.EQ.r4_ninf226 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_ninf232 logical, parameter :: test_inf_r4_ne4 = r4_pinf.NE.r4_pmax233 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_ninf237 logical, parameter :: test_inf_r4_gt4 = r4_pinf.GT.r4_pmax238 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_pinf242 logical, parameter :: test_inf_r4_lt4 = r4_pmax.LT.r4_pinf243 244 logical, parameter :: test_inf_r4_ge1 = r4_pinf.GE.r4_pinf245 logical, parameter :: test_inf_r4_ge2 = r4_ninf.GE.r4_ninf246 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_pinf250 logical, parameter :: test_inf_r4_le2 = r4_ninf.LE.r4_ninf251 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 argument255 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_nan259 260end module261 262! TODO: edge case conversions263! 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 the267! string are very large. This will cause a fatal error for the program268! doing folding (e.g. f18), so there is nothing very interesting to test here.269