Merge remote-tracking branch 'origin/master' into swift-4.0-branch
diff --git a/Foundation/NSDecimal.swift b/Foundation/NSDecimal.swift
index a70f228..3f10b3f 100644
--- a/Foundation/NSDecimal.swift
+++ b/Foundation/NSDecimal.swift
@@ -292,23 +292,27 @@
}
public static func +=(_ lhs: inout Decimal, _ rhs: Decimal) {
- var rhs = rhs
- _ = NSDecimalAdd(&lhs, &lhs, &rhs, .plain)
+ var leftOp = lhs
+ var rightOp = rhs
+ _ = NSDecimalAdd(&lhs, &leftOp, &rightOp, .plain)
}
public static func -=(_ lhs: inout Decimal, _ rhs: Decimal) {
- var rhs = rhs
- _ = NSDecimalSubtract(&lhs, &lhs, &rhs, .plain)
+ var leftOp = lhs
+ var rightOp = rhs
+ _ = NSDecimalSubtract(&lhs, &leftOp, &rightOp, .plain)
}
public static func *=(_ lhs: inout Decimal, _ rhs: Decimal) {
- var rhs = rhs
- _ = NSDecimalMultiply(&lhs, &lhs, &rhs, .plain)
+ var leftOp = lhs
+ var rightOp = rhs
+ _ = NSDecimalMultiply(&lhs, &leftOp, &rightOp, .plain)
}
public static func /=(_ lhs: inout Decimal, _ rhs: Decimal) {
- var rhs = rhs
- _ = NSDecimalDivide(&lhs, &lhs, &rhs, .plain)
+ var leftOp = lhs
+ var rightOp = rhs
+ _ = NSDecimalDivide(&lhs, &leftOp, &rightOp, .plain)
}
public static func +(lhs: Decimal, rhs: Decimal) -> Decimal {
@@ -1849,7 +1853,8 @@
while power > 1 {
if power % 2 == 1 {
let previousError = error
- error = NSDecimalMultiply(&temporary,&temporary,&self,roundingMode)
+ var leftOp = temporary
+ error = NSDecimalMultiply(&temporary, &leftOp, &self, roundingMode)
if previousError != .noError { // FIXME is this the intent?
error = previousError
@@ -1863,7 +1868,9 @@
}
if power != 0 {
let previousError = error
- error = NSDecimalMultiply(&self,&self,&self,roundingMode)
+ var leftOp = self
+ var rightOp = self
+ error = NSDecimalMultiply(&self, &leftOp, &rightOp, roundingMode)
if previousError != .noError { // FIXME is this the intent?
error = previousError
@@ -1877,8 +1884,8 @@
}
}
let previousError = error
-
- error = NSDecimalMultiply(&self, &temporary, &self, roundingMode)
+ var rightOp = self
+ error = NSDecimalMultiply(&self, &temporary, &rightOp, roundingMode)
if previousError != .noError { // FIXME is this the intent?
error = previousError
diff --git a/TestFoundation/TestNSDecimal.swift b/TestFoundation/TestNSDecimal.swift
index 3a06610..6599281 100644
--- a/TestFoundation/TestNSDecimal.swift
+++ b/TestFoundation/TestNSDecimal.swift
@@ -314,31 +314,35 @@
XCTAssertEqual(Decimal(1.234), abs(Decimal(1.234)))
XCTAssertEqual(Decimal(1.234), abs(Decimal(-1.234)))
var a = Decimal(1234)
- XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&a, &a, 1, .plain))
- XCTAssertEqual(Decimal(12340), a)
+ var result = Decimal(0)
+ XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&result, &a, 1, .plain))
+ XCTAssertEqual(Decimal(12340), result)
a = Decimal(1234)
- XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&a, &a, 2, .plain))
- XCTAssertEqual(Decimal(123400), a)
- XCTAssertEqual(.overflow, NSDecimalMultiplyByPowerOf10(&a, &a, 128, .plain))
- XCTAssertTrue(a.isNaN)
+ XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&result, &a, 2, .plain))
+ XCTAssertEqual(Decimal(123400), result)
+ a = result
+ XCTAssertEqual(.overflow, NSDecimalMultiplyByPowerOf10(&result, &a, 128, .plain))
+ XCTAssertTrue(result.isNaN)
a = Decimal(1234)
- XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&a, &a, -2, .plain))
- XCTAssertEqual(Decimal(12.34), a)
- XCTAssertEqual(.underflow, NSDecimalMultiplyByPowerOf10(&a, &a, -128, .plain))
- XCTAssertTrue(a.isNaN)
+ XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&result, &a, -2, .plain))
+ XCTAssertEqual(Decimal(12.34), result)
+ a = result
+ XCTAssertEqual(.underflow, NSDecimalMultiplyByPowerOf10(&result, &a, -128, .plain))
+ XCTAssertTrue(result.isNaN)
a = Decimal(1234)
- XCTAssertEqual(.noError, NSDecimalPower(&a, &a, 0, .plain))
- XCTAssertEqual(Decimal(1), a)
+ XCTAssertEqual(.noError, NSDecimalPower(&result, &a, 0, .plain))
+ XCTAssertEqual(Decimal(1), result)
a = Decimal(8)
- XCTAssertEqual(.noError, NSDecimalPower(&a, &a, 2, .plain))
- XCTAssertEqual(Decimal(64), a)
+ XCTAssertEqual(.noError, NSDecimalPower(&result, &a, 2, .plain))
+ XCTAssertEqual(Decimal(64), result)
a = Decimal(-2)
- XCTAssertEqual(.noError, NSDecimalPower(&a, &a, 3, .plain))
- XCTAssertEqual(Decimal(-8), a)
+ XCTAssertEqual(.noError, NSDecimalPower(&result, &a, 3, .plain))
+ XCTAssertEqual(Decimal(-8), result)
for i in -2...10 {
for j in 0...5 {
var actual = Decimal(i)
- XCTAssertEqual(.noError, NSDecimalPower(&actual, &actual, j, .plain))
+ var power = actual
+ XCTAssertEqual(.noError, NSDecimalPower(&actual, &power, j, .plain))
let expected = Decimal(pow(Double(i), Double(j)))
XCTAssertEqual(expected, actual, "\(actual) == \(i)^\(j)")
}
@@ -553,8 +557,9 @@
for testCase in testCases {
let (expected, start, scale, mode) = testCase
var num = Decimal(start)
- NSDecimalRound(&num, &num, scale, mode)
- XCTAssertEqual(Decimal(expected), num)
+ var actual = Decimal(0)
+ NSDecimalRound(&actual, &num, scale, mode)
+ XCTAssertEqual(Decimal(expected), actual)
let numnum = NSDecimalNumber(decimal:Decimal(start))
let behavior = NSDecimalNumberHandler(roundingMode: mode, scale: Int16(scale), raiseOnExactness: false, raiseOnOverflow: true, raiseOnUnderflow: true, raiseOnDivideByZero: true)
let result = numnum.rounding(accordingToBehavior:behavior)