Merge remote-tracking branch 'origin/master' into swift-4.0-branch
diff --git a/Foundation/NSArray.swift b/Foundation/NSArray.swift
index c0a81cc..9a70f86 100644
--- a/Foundation/NSArray.swift
+++ b/Foundation/NSArray.swift
@@ -312,6 +312,13 @@
                 if val1 != val2 {
                     return false
                 }
+            } else if let val1 = object(at: idx) as? _ObjectBridgeable,
+                let val2 = otherArray[idx] as? _ObjectBridgeable {
+                if !(val1._bridgeToAnyObject() as! NSObject).isEqual(val2._bridgeToAnyObject()) {
+                    return false
+                }
+            } else {
+                return false
             }
         }
         
diff --git a/Foundation/NSDecimal.swift b/Foundation/NSDecimal.swift
index 3f10b3f..88785f2 100644
--- a/Foundation/NSDecimal.swift
+++ b/Foundation/NSDecimal.swift
@@ -24,7 +24,7 @@
             return Int32(__exponent)
         }
         set {
-            __exponent = Int8(truncatingBitPattern: newValue)
+            __exponent = Int8(extendingOrTruncating: newValue)
         }
     }
     // length == 0 && isNegative -> NaN
@@ -90,7 +90,7 @@
 
     public init(_exponent: Int32, _length: UInt32, _isNegative: UInt32, _isCompact: UInt32, _reserved: UInt32, _mantissa: (UInt16, UInt16, UInt16, UInt16, UInt16, UInt16, UInt16, UInt16)){
         self._mantissa = _mantissa
-        self.__exponent = Int8(truncatingBitPattern: _exponent)
+        self.__exponent = Int8(extendingOrTruncating: _exponent)
         self.__lengthAndFlags = UInt8(_length & 0b1111)
         self.__reserved = 0
         self._isNegative = _isNegative
@@ -425,21 +425,21 @@
             while mantissa != 0 && i < NSDecimalMaxSize {
                 switch i {
                 case 0:
-                    _mantissa.0 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.0 = UInt16(extendingOrTruncating:mantissa)
                 case 1:
-                    _mantissa.1 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.1 = UInt16(extendingOrTruncating:mantissa)
                 case 2:
-                    _mantissa.2 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.2 = UInt16(extendingOrTruncating:mantissa)
                 case 3:
-                    _mantissa.3 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.3 = UInt16(extendingOrTruncating:mantissa)
                 case 4:
-                    _mantissa.4 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.4 = UInt16(extendingOrTruncating:mantissa)
                 case 5:
-                    _mantissa.5 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.5 = UInt16(extendingOrTruncating:mantissa)
                 case 6:
-                    _mantissa.6 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.6 = UInt16(extendingOrTruncating:mantissa)
                 case 7:
-                    _mantissa.7 = UInt16(truncatingBitPattern:mantissa)
+                    _mantissa.7 = UInt16(extendingOrTruncating:mantissa)
                 default:
                     fatalError("initialization overflow")
                 }
@@ -605,13 +605,13 @@
     for i in 0..<d._length {
         let accumulator: UInt32 = UInt32(d[i]) * UInt32(mul) + carry
         carry = accumulator >> 16
-        d[i] = UInt16(truncatingBitPattern: accumulator)
+        d[i] = UInt16(extendingOrTruncating: accumulator)
     }
     if carry != 0 {
         if d._length >= Decimal.maxSize {
             return .overflow
         }
-        d[d._length] = UInt16(truncatingBitPattern: carry)
+        d[d._length] = UInt16(extendingOrTruncating: carry)
         d._length += 1
     }
     return .noError
@@ -622,13 +622,13 @@
     for i in 0..<d._length {
         let accumulator: UInt32 = UInt32(d[i]) + carry
         carry = accumulator >> 16
-        d[i] = UInt16(truncatingBitPattern: accumulator)
+        d[i] = UInt16(extendingOrTruncating: accumulator)
     }
     if carry != 0 {
         if d._length >= Decimal.maxSize {
             return .overflow
         }
-        d[d._length] = UInt16(truncatingBitPattern: carry)
+        d[d._length] = UInt16(extendingOrTruncating: carry)
         d._length += 1
     }
     return .noError
@@ -776,8 +776,8 @@
             if i + j < big._length {
                 let bigij = UInt32(big[i+j])
                 accumulator = UInt32(carry) + bigij + UInt32(right[j]) * UInt32(left[i])
-                carry = UInt16(truncatingBitPattern:accumulator >> UInt32(16))
-                big[i+j] = UInt16(truncatingBitPattern:accumulator)
+                carry = UInt16(extendingOrTruncating:accumulator >> 16)
+                big[i+j] = UInt16(extendingOrTruncating:accumulator)
             } else if carry != 0 || (right[j] == 0 && left[j] == 0) {
                 return .overflow
             }
@@ -917,7 +917,7 @@
             acc = acc & 0xffff;
             acc = 0xffff + UInt32(u[ul - vl + i - UInt32(j) - UInt32(1)]) - acc + sk; // subtract
             sk = acc >> 16;
-            u[ul - vl + i - UInt32(j) - UInt32(1)] = UInt16(truncatingBitPattern:acc)
+            u[ul - vl + i - UInt32(j) - UInt32(1)] = UInt16(extendingOrTruncating:acc)
         }
 
         // D5: test remainder
@@ -933,7 +933,7 @@
                 let vl = v._length
                 acc = UInt32(v[i]) + UInt32(u[UInt32(ul) - UInt32(vl) + UInt32(i) - UInt32(j) - UInt32(1)]) + k
                 k = acc >> 16;
-                u[UInt32(ul) - UInt32(vl) + UInt32(i) - UInt32(j) - UInt32(1)] = UInt16(truncatingBitPattern:acc)
+                u[UInt32(ul) - UInt32(vl) + UInt32(i) - UInt32(j) - UInt32(1)] = UInt16(extendingOrTruncating:acc)
             }
             // k must be == 1 here
         }
@@ -1186,8 +1186,8 @@
         let li = UInt32(left[i])
         let ri = UInt32(right[i])
         accumulator = li + ri + UInt32(carry)
-        carry = UInt16(truncatingBitPattern:accumulator >> 16)
-        result[i] = UInt16(truncatingBitPattern:accumulator)
+        carry = UInt16(extendingOrTruncating:accumulator >> 16)
+        result[i] = UInt16(extendingOrTruncating:accumulator)
         i += 1
     }
 
@@ -1195,8 +1195,8 @@
         if carry != 0 {
             let li = UInt32(left[i])
             accumulator = li + UInt32(carry)
-            carry = UInt16(truncatingBitPattern:accumulator >> 16)
-            result[i] = UInt16(truncatingBitPattern:accumulator)
+            carry = UInt16(extendingOrTruncating:accumulator >> 16)
+            result[i] = UInt16(extendingOrTruncating:accumulator)
             i += 1
         } else {
             while i < left._length {
@@ -1210,8 +1210,8 @@
         if carry != 0 {
             let ri = UInt32(right[i])
             accumulator = ri + UInt32(carry)
-            carry = UInt16(truncatingBitPattern:accumulator >> 16)
-            result[i] = UInt16(truncatingBitPattern:accumulator)
+            carry = UInt16(extendingOrTruncating:accumulator >> 16)
+            result[i] = UInt16(extendingOrTruncating:accumulator)
             i += 1
         } else {
             while i < right._length {
@@ -1253,8 +1253,8 @@
         let li = UInt32(left[i])
         let ri = UInt32(right[i])
         accumulator = 0xffff + li - ri + UInt32(carry)
-        carry = UInt16(truncatingBitPattern:accumulator >> 16)
-        result[i] = UInt16(truncatingBitPattern:accumulator)
+        carry = UInt16(extendingOrTruncating:accumulator >> 16)
+        result[i] = UInt16(extendingOrTruncating:accumulator)
         i += 1
     }
 
@@ -1262,8 +1262,8 @@
         if carry != 0 {
             let li = UInt32(left[i])
             accumulator = 0xffff + li // + no carry
-            carry = UInt16(truncatingBitPattern:accumulator >> 16)
-            result[i] = UInt16(truncatingBitPattern:accumulator)
+            carry = UInt16(extendingOrTruncating:accumulator >> 16)
+            result[i] = UInt16(extendingOrTruncating:accumulator)
             i += 1
         } else {
             while i < left._length {
@@ -1276,8 +1276,8 @@
     while i < right._length {
         let ri = UInt32(right[i])
         accumulator = 0xffff - ri + UInt32(carry)
-        carry = UInt16(truncatingBitPattern:accumulator >> 16)
-        result[i] = UInt16(truncatingBitPattern:accumulator)
+        carry = UInt16(extendingOrTruncating:accumulator >> 16)
+        result[i] = UInt16(extendingOrTruncating:accumulator)
         i += 1
     }
 
diff --git a/Foundation/NSError.swift b/Foundation/NSError.swift
index bee29e3..e9448fc 100644
--- a/Foundation/NSError.swift
+++ b/Foundation/NSError.swift
@@ -393,7 +393,7 @@
             return nil
         }
         
-        self.init(rawValue: RawValue(IntMax(_bridgedNSError.code)))
+        self.init(rawValue: RawValue(Int(_bridgedNSError.code)))
     }
     
     public var hashValue: Int { return _code }
@@ -421,7 +421,7 @@
             return nil
         }
         
-        self.init(rawValue: RawValue(UIntMax(UInt(_bridgedNSError.code))))
+        self.init(rawValue: RawValue(UInt(_bridgedNSError.code)))
     }
     
     public var hashValue: Int { return _code }
diff --git a/TestFoundation/TestNSArray.swift b/TestFoundation/TestNSArray.swift
index 50a6a96..8442ecd 100644
--- a/TestFoundation/TestNSArray.swift
+++ b/TestFoundation/TestNSArray.swift
@@ -421,6 +421,12 @@
 
         XCTAssertFalse(array1.isEqual(nil))
         XCTAssertFalse(array1.isEqual(NSObject()))
+
+        let objectsArray1 = NSArray(array: [NSArray(array: [0])])
+        let objectsArray2 = NSArray(array: [NSArray(array: [1])])
+        XCTAssertFalse(objectsArray1 == objectsArray2)
+        XCTAssertFalse(objectsArray1.isEqual(objectsArray2))
+        XCTAssertFalse(objectsArray1.isEqual(to: Array(objectsArray2)))
     }
 
     /// - Note: value type conversion will destroy identity. So use index(of:) instead of indexOfObjectIdentical(to:)
diff --git a/TestFoundation/TestNSDictionary.swift b/TestFoundation/TestNSDictionary.swift
index ff415ef..096f0a6 100644
--- a/TestFoundation/TestNSDictionary.swift
+++ b/TestFoundation/TestNSDictionary.swift
@@ -134,6 +134,24 @@
 
         XCTAssertFalse(dict1.isEqual(nil))
         XCTAssertFalse(dict1.isEqual(NSObject()))
+
+        let nestedDict1 = NSDictionary(dictionary: [
+            "key.entities": [
+                ["key": 0]
+            ]
+        ])
+        let nestedDict2 = NSDictionary(dictionary: [
+            "key.entities": [
+                ["key": 1]
+            ]
+        ])
+        XCTAssertFalse(nestedDict1 == nestedDict2)
+        XCTAssertFalse(nestedDict1.isEqual(nestedDict2))
+        XCTAssertFalse(nestedDict1.isEqual(to: [
+            "key.entities": [
+                ["key": 1]
+            ]
+        ]))
     }
 
     func test_copying() {
diff --git a/build.py b/build.py
index f1a3ef4..669199a 100644
--- a/build.py
+++ b/build.py
@@ -9,7 +9,7 @@
 
 script = Script()
 
-foundation = DynamicLibrary("Foundation")
+foundation = StaticAndDynamicLibrary("Foundation")
 
 foundation.GCC_PREFIX_HEADER = 'CoreFoundation/Base.subproj/CoreFoundation_Prefix.h'
 
@@ -513,6 +513,8 @@
 rule InstallFoundation
     command = mkdir -p "${DSTROOT}/${PREFIX}/lib/swift/${OS}"; $
     cp "${BUILD_DIR}/Foundation/${DYLIB_PREFIX}Foundation${DYLIB_SUFFIX}" "${DSTROOT}/${PREFIX}/lib/swift/${OS}"; $
+    mkdir -p "${DSTROOT}/${PREFIX}/lib/swift_static/${OS}"; $
+    cp "${BUILD_DIR}/Foundation/${STATICLIB_PREFIX}Foundation${STATICLIB_SUFFIX}" "${DSTROOT}/${PREFIX}/lib/swift_static/${OS}"; $
     mkdir -p "${DSTROOT}/${PREFIX}/lib/swift/${OS}/${ARCH}"; $
     cp "${BUILD_DIR}/Foundation/Foundation.swiftmodule" "${DSTROOT}/${PREFIX}/lib/swift/${OS}/${ARCH}/"; $
     cp "${BUILD_DIR}/Foundation/Foundation.swiftdoc" "${DSTROOT}/${PREFIX}/lib/swift/${OS}/${ARCH}/"; $
diff --git a/configure b/configure
index 32a3f2f..4e0f128 100755
--- a/configure
+++ b/configure
@@ -28,6 +28,7 @@
 from lib.product import DynamicLibrary
 from lib.product import Framework
 from lib.product import StaticLibrary
+from lib.product import StaticAndDynamicLibrary
 from lib.product import Application
 from lib.product import Executable
 
diff --git a/lib/product.py b/lib/product.py
index ad9af82..925cd78 100644
--- a/lib/product.py
+++ b/lib/product.py
@@ -112,10 +112,11 @@
 class DynamicLibrary(Library):
     def __init__(self, name):
         Library.__init__(self, name)
-        self.rule = "Link"
-        self.product_name = Configuration.current.target.dynamic_library_prefix + name + Configuration.current.target.dynamic_library_suffix
+        self.name = name
 
     def generate(self):
+        self.rule = "Link"
+        self.product_name = Configuration.current.target.dynamic_library_prefix + self.name + Configuration.current.target.dynamic_library_suffix
         if Configuration.current.target.sdk == OSType.Linux or Configuration.current.target.sdk == OSType.FreeBSD:
             self.conformance_begin = '${SDKROOT}/lib/swift/${OS}/${ARCH}/swift_begin.o' 
             self.conformance_end = '${SDKROOT}/lib/swift/${OS}/${ARCH}/swift_end.o' 
@@ -172,16 +173,23 @@
 
         return generated
 
-
 class StaticLibrary(Library):
     def __init__(self, name):
         Library.__init__(self, name)
-        self.rule = "Archive"
-        self.product_name = Configuration.current.target.static_library_prefix + name + Configuration.current.target.static_library_suffix
-    
+        self.name = name
+
     def generate(self):
+        self.rule = "Archive"
+        self.product_name = Configuration.current.target.static_library_prefix + self.name + Configuration.current.target.static_library_suffix
         return Library.generate(self, [])
-        
+
+class StaticAndDynamicLibrary(StaticLibrary, DynamicLibrary):
+    def __init__(self, name):
+        StaticLibrary.__init__(self, name)
+        DynamicLibrary.__init__(self, name)
+
+    def generate(self):
+        return StaticLibrary.generate(self) + DynamicLibrary.generate(self)
 
 class Executable(Product):
     def __init__(self, name):
@@ -190,9 +198,8 @@
 
     def generate(self):
         generated = Product.generate(self)
-        
-        return generated
 
+        return generated
 
 class Application(Product):
     executable = None
diff --git a/lib/script.py b/lib/script.py
index 4f6a39f..150eb95 100644
--- a/lib/script.py
+++ b/lib/script.py
@@ -63,6 +63,8 @@
 ARCH                  = """ + Configuration.current.target.swift_arch + """
 DYLIB_PREFIX          = """ + Configuration.current.target.dynamic_library_prefix + """
 DYLIB_SUFFIX          = """ + Configuration.current.target.dynamic_library_suffix + """
+STATICLIB_PREFIX      = """ + Configuration.current.target.static_library_prefix + """
+STATICLIB_SUFFIX      = """ + Configuration.current.target.static_library_suffix + """
 PREFIX                = """ + Configuration.current.prefix + """
 """
         if Configuration.current.requires_pkg_config:
@@ -206,7 +208,7 @@
     description = Link: $out
 
 rule Archive
-    command = mkdir -p `dirname $out`; ${AR} ${AR_FLAGS} $flags $out $in
+    command = mkdir -p `dirname $out`; ${AR} ${AR_FLAGS} $out $in
     description = Archive: $out
 """