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)