Fixed bug in the optimizer when folding exponentiation with negative exponents
This commit is contained in:
parent
a15aee3d23
commit
df59bc8f0d
|
@ -178,7 +178,13 @@ proc optimizeBinary(self: Optimizer, node: BinaryExpr): ASTNode =
|
|||
of FloorDiv:
|
||||
z = int(x / y)
|
||||
of DoubleAsterisk:
|
||||
z = x ^ y
|
||||
if y >= 0:
|
||||
z = x ^ y
|
||||
else:
|
||||
# Nim's builtin pow operator can't handle
|
||||
# negative exponents, so we use math's
|
||||
# pow and convert from/to floats instead
|
||||
z = pow(x.float, y.float).int
|
||||
of Percentage:
|
||||
z = x mod y
|
||||
of Caret:
|
||||
|
@ -195,6 +201,9 @@ proc optimizeBinary(self: Optimizer, node: BinaryExpr): ASTNode =
|
|||
except OverflowDefect:
|
||||
self.newWarning(valueOverflow, node)
|
||||
return BinaryExpr(kind: binaryExpr, a: a, b: b, operator: node.operator)
|
||||
except RangeDefect:
|
||||
# TODO: What warning do we raise here?
|
||||
return BinaryExpr(kind: binaryExpr, a: a, b: b, operator: node.operator)
|
||||
result = IntExpr(kind: intExpr, literal: Token(kind: Integer, lexeme: $z, line: IntExpr(a).literal.line, pos: (start: -1, stop: -1)))
|
||||
elif a.kind == floatExpr or b.kind == floatExpr:
|
||||
var x, y, z: float
|
||||
|
|
Loading…
Reference in New Issue