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:
|
of FloorDiv:
|
||||||
z = int(x / y)
|
z = int(x / y)
|
||||||
of DoubleAsterisk:
|
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:
|
of Percentage:
|
||||||
z = x mod y
|
z = x mod y
|
||||||
of Caret:
|
of Caret:
|
||||||
|
@ -195,6 +201,9 @@ proc optimizeBinary(self: Optimizer, node: BinaryExpr): ASTNode =
|
||||||
except OverflowDefect:
|
except OverflowDefect:
|
||||||
self.newWarning(valueOverflow, node)
|
self.newWarning(valueOverflow, node)
|
||||||
return BinaryExpr(kind: binaryExpr, a: a, b: b, operator: node.operator)
|
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)))
|
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:
|
elif a.kind == floatExpr or b.kind == floatExpr:
|
||||||
var x, y, z: float
|
var x, y, z: float
|
||||||
|
|
Loading…
Reference in New Issue