diff --git a/flang/lib/evaluate/integer.h b/flang/lib/evaluate/integer.h index eef6e3d1c356..e6be82971056 100644 --- a/flang/lib/evaluate/integer.h +++ b/flang/lib/evaluate/integer.h @@ -953,9 +953,9 @@ public: result.overflow |= product.SignedMultiplicationOverflowed(); } if (j + 1 < nbits) { - ValueWithOverflow doubled{shifted.AddSigned(shifted)}; - result.overflow |= doubled.overflow; - shifted = doubled.value; + Product squared{shifted.MultiplySigned(shifted)}; + result.overflow |= squared.SignedMultiplicationOverflowed(); + shifted = squared.lower; } } } diff --git a/flang/test/evaluate/folding01.f90 b/flang/test/evaluate/folding01.f90 index 2c32be683bd7..0b989e034464 100644 --- a/flang/test/evaluate/folding01.f90 +++ b/flang/test/evaluate/folding01.f90 @@ -95,5 +95,9 @@ module m logical, parameter :: test_divide_i3 = ((-7)/2).EQ.(-3) logical, parameter :: test_divide_i4 = (0/127).EQ.(0) + logical, parameter :: test_pow1 = (2**0).EQ.(1) + logical, parameter :: test_pow2 = (1**100).EQ.(1) + logical, parameter :: test_pow3 = (2**4).EQ.(16) + logical, parameter :: test_pow4 = (7**5).EQ.(16807) end module