Sync NSStringAPI.swift from overlay
diff --git a/stdlib/public/SDK/Foundation/NSStringAPI.swift b/stdlib/public/SDK/Foundation/NSStringAPI.swift
index c23bdbd..03ebc30 100644
--- a/stdlib/public/SDK/Foundation/NSStringAPI.swift
+++ b/stdlib/public/SDK/Foundation/NSStringAPI.swift
@@ -14,7 +14,19 @@
 //
 //===----------------------------------------------------------------------===//
 
+// Important Note
+// ==============
+//
+// This file is shared between two projects:
+//
+// 1. https://github.com/apple/swift/tree/master/stdlib/public/SDK/Foundation
+// 2. https://github.com/apple/swift-corelibs-foundation/tree/master/Foundation
+//
+// If you change this file, you must update it in both places.
+
+#if !DEPLOYMENT_RUNTIME_SWIFT
 @_exported import Foundation // Clang module
+#endif
 
 // Open Issues
 // ===========
@@ -36,6 +48,7 @@
     length: r.upperBound.encodedOffset - r.lowerBound.encodedOffset)
 }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
 // We only need this for UnsafeMutablePointer, but there's not currently a way
 // to write that constraint.
 extension Optional {
@@ -57,6 +70,7 @@
     return self == nil ? body(nil) : body(&object)
   }
 }
+#endif
 
 extension String {
   //===--- Class Methods --------------------------------------------------===//
@@ -156,7 +170,7 @@
   /// C array of UTF8-encoded bytes.
   public init?(utf8String bytes: UnsafePointer<CChar>) {
     if let ns = NSString(utf8String: bytes) {
-      self = ns as String
+      self = String._unconditionallyBridgeFromObjectiveC(ns)
     } else {
       return nil
     }
@@ -185,7 +199,7 @@
     if let ns = NSString(
       bytes: byteArray, length: byteArray.count, encoding: encoding.rawValue) {
 
-      self = ns as String
+      self = String._unconditionallyBridgeFromObjectiveC(ns)
     } else {
       return nil
     }
@@ -210,7 +224,7 @@
       bytesNoCopy: bytes, length: length, encoding: encoding.rawValue,
       freeWhenDone: flag) {
 
-      self = ns as String
+      self = String._unconditionallyBridgeFromObjectiveC(ns)
     } else {
       return nil
     }
@@ -227,7 +241,7 @@
     utf16CodeUnits: UnsafePointer<unichar>,
     count: Int
   ) {
-    self = NSString(characters: utf16CodeUnits, length: count) as String
+    self = String._unconditionallyBridgeFromObjectiveC(NSString(characters: utf16CodeUnits, length: count))
   }
 
   // - (instancetype)
@@ -242,10 +256,10 @@
     count: Int,
     freeWhenDone flag: Bool
   ) {
-    self = NSString(
+    self = String._unconditionallyBridgeFromObjectiveC(NSString(
       charactersNoCopy: UnsafeMutablePointer(mutating: utf16CodeUnitsNoCopy),
       length: count,
-      freeWhenDone: flag) as String
+      freeWhenDone: flag))
   }
 
   //===--- Initializers that can fail -------------------------------------===//
@@ -263,7 +277,7 @@
     encoding enc: Encoding
   ) throws {
     let ns = try NSString(contentsOfFile: path, encoding: enc.rawValue)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   // - (instancetype)
@@ -281,14 +295,14 @@
     var enc: UInt = 0
     let ns = try NSString(contentsOfFile: path, usedEncoding: &enc)
     usedEncoding = Encoding(rawValue: enc)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   public init(
     contentsOfFile path: String
   ) throws {
     let ns = try NSString(contentsOfFile: path, usedEncoding: nil)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   // - (instancetype)
@@ -304,7 +318,7 @@
     encoding enc: Encoding
   ) throws {
     let ns = try NSString(contentsOf: url, encoding: enc.rawValue)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   // - (instancetype)
@@ -322,14 +336,14 @@
     var enc: UInt = 0
     let ns = try NSString(contentsOf: url as URL, usedEncoding: &enc)
     usedEncoding = Encoding(rawValue: enc)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   public init(
     contentsOf url: URL
   ) throws {
     let ns = try NSString(contentsOf: url, usedEncoding: nil)
-    self = ns as String
+    self = String._unconditionallyBridgeFromObjectiveC(ns)
   }
 
   // - (instancetype)
@@ -343,7 +357,7 @@
     encoding enc: Encoding
   ) {
     if let ns = NSString(cString: cString, encoding: enc.rawValue) {
-      self = ns as String
+      self = String._unconditionallyBridgeFromObjectiveC(ns)
     } else {
       return nil
     }
@@ -359,7 +373,7 @@
   /// Unicode characters using a given `encoding`.
   public init?(data: Data, encoding: Encoding) {
     guard let s = NSString(data: data, encoding: encoding.rawValue) else { return nil }
-    self = s as String
+    self = String._unconditionallyBridgeFromObjectiveC(s)
   }
 
   // - (instancetype)initWithFormat:(NSString *)format, ...
@@ -400,9 +414,17 @@
   /// format string as a template into which the remaining argument
   /// values are substituted according to given locale information.
   public init(format: String, locale: Locale?, arguments: [CVarArg]) {
+#if DEPLOYMENT_RUNTIME_SWIFT
+    self = withVaList(arguments) {
+      String._unconditionallyBridgeFromObjectiveC(
+        NSString(format: format, locale: locale?._bridgeToObjectiveC(), arguments: $0)
+      )
+    }
+#else
     self = withVaList(arguments) {
       NSString(format: format, locale: locale, arguments: $0) as String
     }
+#endif
   }
 
 }
@@ -414,7 +436,7 @@
   /// The corresponding `NSString` - a convenience for bridging code.
   // FIXME(strings): There is probably a better way to bridge Self to NSString
   var _ns: NSString {
-    return self._ephemeralString as NSString
+    return self._ephemeralString._bridgeToObjectiveC()
   }
 
   /// Return an `Index` corresponding to the given offset in our UTF-16
@@ -584,7 +606,7 @@
       range: _toNSRange(
         range ?? startIndex..<endIndex
       ),
-      locale: locale
+      locale: locale?._bridgeToObjectiveC()
     )
 
     : range != nil ? _ns.compare(
@@ -616,6 +638,23 @@
     matchesInto outputArray: UnsafeMutablePointer<[String]>? = nil,
     filterTypes: [String]? = nil
   ) -> Int {
+#if DEPLOYMENT_RUNTIME_SWIFT
+    var outputNamePlaceholder: String?
+    var outputArrayPlaceholder = [String]()
+    let res = self._ns.completePath(
+        into: &outputNamePlaceholder,
+        caseSensitive: caseSensitive,
+        matchesInto: &outputArrayPlaceholder,
+        filterTypes: filterTypes
+    )
+    if let n = outputNamePlaceholder {
+        outputName?.pointee = n
+    } else {
+        outputName?.pointee = ""
+    }
+    outputArray?.pointee = outputArrayPlaceholder
+    return res
+#else // DEPLOYMENT_RUNTIME_SWIFT
     var nsMatches: NSArray?
     var nsOutputName: NSString?
 
@@ -647,6 +686,7 @@
       outputName?.pointee = n as String
     }
     return result
+#endif // DEPLOYMENT_RUNTIME_SWIFT
   }
 
   // - (NSArray *)
@@ -875,6 +915,7 @@
     return _ns.precomposedStringWithCompatibilityMapping
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   // - (id)propertyList
 
   /// Parses the `String` as a text representation of a
@@ -891,6 +932,7 @@
   public func propertyListFromStringsFileFormat() -> [String : String] {
     return _ns.propertyListFromStringsFileFormat() as! [String : String]? ?? [:]
   }
+#endif
 
   // - (BOOL)localizedStandardContainsString:(NSString *)str NS_AVAILABLE(10_11, 9_0);
 
@@ -1048,6 +1090,7 @@
     : _ns.replacingOccurrences(of: target, with: replacement)
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   // - (NSString *)
   //     stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
 
@@ -1061,6 +1104,7 @@
   ) -> String? {
     return _ns.replacingPercentEscapes(using: encoding.rawValue)
   }
+#endif
 
   // - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
 
@@ -1129,6 +1173,7 @@
 
   // - (nullable NSString *)stringByApplyingTransform:(NSString *)transform reverse:(BOOL)reverse NS_AVAILABLE(10_11, 9_0);
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   /// Perform string transliteration.
   @available(OSX 10.11, iOS 9.0, *)
   public func applyingTransform(
@@ -1175,6 +1220,7 @@
       }
     }
   }
+#endif
 
   // - (void)
   //     enumerateSubstringsInRange:(NSRange)range
@@ -1385,6 +1431,7 @@
     return _range(_ns.lineRange(for: _toNSRange(aRange.relative(to: self))))
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   // - (NSArray *)
   //     linguisticTagsInRange:(NSRange)range
   //     scheme:(NSString *)tagScheme
@@ -1432,6 +1479,7 @@
     return _range(
       _ns.paragraphRange(for: _toNSRange(aRange.relative(to: self))))
   }
+#endif
 
   // - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)aSet
   //
@@ -1553,6 +1601,7 @@
       _ns.localizedStandardRange(of: string._ephemeralString))
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   // - (NSString *)
   //     stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
 
@@ -1566,6 +1615,7 @@
   ) -> String? {
     return _ns.addingPercentEscapes(using: encoding.rawValue)
   }
+#endif
 
   //===--- From the 10.10 release notes; not in public documentation ------===//
   // No need to make these unavailable on earlier OSes, since they can
@@ -1874,6 +1924,7 @@
     fatalError("unavailable function can't be called")
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   @available(*, unavailable, renamed: "enumerateLinguisticTags(in:scheme:options:orthography:_:)")
   public func enumerateLinguisticTagsIn(
     _ range: Range<Index>,
@@ -1885,6 +1936,7 @@
   ) {
     fatalError("unavailable function can't be called")
   }
+#endif
 
   @available(*, unavailable, renamed: "enumerateSubstrings(in:options:_:)")
   public func enumerateSubstringsIn(
@@ -1941,6 +1993,7 @@
     fatalError("unavailable function can't be called")
   }
 
+#if !DEPLOYMENT_RUNTIME_SWIFT
   @available(*, unavailable, renamed: "linguisticTags(in:scheme:options:orthography:tokenRanges:)")
   public func linguisticTagsIn(
     _ range: Range<Index>,
@@ -1951,6 +2004,7 @@
   ) -> [String] {
     fatalError("unavailable function can't be called")
   }
+#endif
 
   @available(*, unavailable, renamed: "lowercased(with:)")
   public func lowercaseStringWith(_ locale: Locale?) -> String {