Merge pull request #14869 from rintaro/4.1-sourcekit-offset-guard
[4.1][SourceKit] Add defensive guard for invalid offset
diff --git a/include/swift/AST/RawComment.h b/include/swift/AST/RawComment.h
index 853ba45..cc86dc2 100644
--- a/include/swift/AST/RawComment.h
+++ b/include/swift/AST/RawComment.h
@@ -32,7 +32,7 @@
unsigned Kind : 8;
unsigned StartColumn : 16;
unsigned StartLine;
- const unsigned EndLine;
+ unsigned EndLine;
SingleRawComment(CharSourceRange Range, const SourceManager &SourceMgr);
SingleRawComment(StringRef RawText, unsigned StartColumn);
diff --git a/lib/AST/RawComment.cpp b/lib/AST/RawComment.cpp
index 7acdd36..cc9509e 100644
--- a/lib/AST/RawComment.cpp
+++ b/lib/AST/RawComment.cpp
@@ -57,11 +57,11 @@
SingleRawComment::SingleRawComment(CharSourceRange Range,
const SourceManager &SourceMgr)
: Range(Range), RawText(SourceMgr.extractText(Range)),
- Kind(static_cast<unsigned>(getCommentKind(RawText))),
- EndLine(SourceMgr.getLineNumber(Range.getEnd())) {
+ Kind(static_cast<unsigned>(getCommentKind(RawText))) {
auto StartLineAndColumn = SourceMgr.getLineAndColumn(Range.getStart());
StartLine = StartLineAndColumn.first;
StartColumn = StartLineAndColumn.second;
+ EndLine = SourceMgr.getLineNumber(Range.getEnd());
}
SingleRawComment::SingleRawComment(StringRef RawText, unsigned StartColumn)
diff --git a/lib/AST/SubstitutionMap.cpp b/lib/AST/SubstitutionMap.cpp
index 2e4db85..5a12c9a 100644
--- a/lib/AST/SubstitutionMap.cpp
+++ b/lib/AST/SubstitutionMap.cpp
@@ -192,9 +192,19 @@
auto genericSig = getGenericSignature();
- // If the type doesn't conform to this protocol, fail.
- if (!genericSig->conformsToProtocol(type, proto))
+ // If the type doesn't conform to this protocol, the result isn't formed
+ // from these requirements.
+ if (!genericSig->conformsToProtocol(type, proto)) {
+ // Check whether the superclass conforms.
+ if (auto superclass = genericSig->getSuperclassBound(type)) {
+ return LookUpConformanceInSignature(*getGenericSignature())(
+ type->getCanonicalType(),
+ superclass,
+ proto->getDeclaredType());
+ }
+
return None;
+ }
auto accessPath =
genericSig->getConformanceAccessPath(type, proto);
diff --git a/lib/ClangImporter/ClangImporter.cpp b/lib/ClangImporter/ClangImporter.cpp
index c6a9dfd..a0f6180 100644
--- a/lib/ClangImporter/ClangImporter.cpp
+++ b/lib/ClangImporter/ClangImporter.cpp
@@ -983,6 +983,7 @@
if (importerOpts.Mode == ClangImporterOptions::Modes::EmbedBitcode)
return importer;
+ instance.getLangOpts().NeededByPCHOrCompilationUsesPCH = true;
bool canBegin = action->BeginSourceFile(instance,
instance.getFrontendOpts().Inputs[0]);
if (!canBegin)
@@ -1361,6 +1362,7 @@
invocation->getFrontendOpts().OutputFile = outputPCHPath;
invocation->getFrontendOpts().ProgramAction = clang::frontend::GeneratePCH;
invocation->getPreprocessorOpts().resetNonModularOptions();
+ invocation->getLangOpts()->NeededByPCHOrCompilationUsesPCH = true;
clang::CompilerInstance emitInstance(
Impl.Instance->getPCHContainerOperations());
diff --git a/lib/SILOptimizer/Analysis/ARCAnalysis.cpp b/lib/SILOptimizer/Analysis/ARCAnalysis.cpp
index ddf50c8..c88021b 100644
--- a/lib/SILOptimizer/Analysis/ARCAnalysis.cpp
+++ b/lib/SILOptimizer/Analysis/ARCAnalysis.cpp
@@ -441,8 +441,17 @@
FullApplySite FAS(User);
- // Ok, we have a full apply site. If the apply has no arguments, we don't need
- // to worry about any guaranteed parameters.
+ // Ok, we have a full apply site. Check if the callee is callee_guaranteed. In
+ // such a case, if we can not prove no alias, we need to be conservative and
+ // return true.
+ CanSILFunctionType FType = FAS.getSubstCalleeType();
+ if (FType->isCalleeGuaranteed() && !AA->isNoAlias(FAS.getCallee(), Ptr)) {
+ return true;
+ }
+
+ // Ok, we have a full apply site and our callee is a normal use. Thus if the
+ // apply does not have any normal arguments, we don't need to worry about any
+ // guaranteed parameters and return early.
if (!FAS.getNumArguments())
return false;
@@ -450,7 +459,6 @@
// iterate through the function parameters. If any of the parameters are
// guaranteed, attempt to prove that the passed in parameter cannot alias
// Ptr. If we fail, return true.
- CanSILFunctionType FType = FAS.getSubstCalleeType();
auto Params = FType->getParameters();
for (unsigned i : indices(Params)) {
if (!Params[i].isGuaranteed())
diff --git a/stdlib/public/SDK/Accelerate/CMakeLists.txt b/stdlib/public/SDK/Accelerate/CMakeLists.txt
index 2f9abf8..9d5af43 100644
--- a/stdlib/public/SDK/Accelerate/CMakeLists.txt
+++ b/stdlib/public/SDK/Accelerate/CMakeLists.txt
@@ -6,13 +6,13 @@
SWIFT_COMPILE_FLAGS "${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS}"
LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}"
- TARGET_SDKS OSX IOS IOS_SIMULATOR TVOS TVOS_SIMULATOR
+ TARGET_SDKS OSX IOS IOS_SIMULATOR TVOS TVOS_SIMULATOR WATCHOS WATCHOS_SIMULATOR
SWIFT_COMPILE_FLAGS -parse-stdlib
SWIFT_MODULE_DEPENDS_OSX Darwin CoreFoundation CoreGraphics Dispatch Foundation IOKit Metal ObjectiveC XPC # auto-updated
os
SWIFT_MODULE_DEPENDS_IOS Darwin CoreFoundation CoreGraphics Dispatch Foundation Metal ObjectiveC os # auto-updated
SWIFT_MODULE_DEPENDS_TVOS Darwin CoreFoundation CoreGraphics Dispatch Foundation Metal ObjectiveC os # auto-updated
- SWIFT_MODULE_DEPENDS_WATCHOS Darwin CoreFoundation CoreGraphics Dispatch ObjectiveC os # auto-updated
+ SWIFT_MODULE_DEPENDS_WATCHOS Darwin CoreFoundation CoreGraphics Dispatch Foundation ObjectiveC os # auto-updated
DEPLOYMENT_VERSION_OSX ${SWIFTLIB_DEPLOYMENT_VERSION_SIMD_OSX}
DEPLOYMENT_VERSION_IOS ${SWIFTLIB_DEPLOYMENT_VERSION_SIMD_IOS}
diff --git a/stdlib/public/SDK/AppKit/AppKit.swift b/stdlib/public/SDK/AppKit/AppKit.swift
index 9ee047b..ffb9f7d 100644
--- a/stdlib/public/SDK/AppKit/AppKit.swift
+++ b/stdlib/public/SDK/AppKit/AppKit.swift
@@ -14,6 +14,7 @@
@_exported import AppKit
extension NSCursor : _DefaultCustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "NSCursor._defaultCustomPlaygroundQuickLook will be removed in a future Swift version")
public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook {
return .image(image)
}
@@ -24,6 +25,7 @@
}
extension NSView : _DefaultCustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "NSView._defaultCustomPlaygroundQuickLook will be removed in a future Swift version")
public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook {
// if you set NSView.needsDisplay, you can get yourself in a recursive scenario where the same view
// could need to draw itself in order to get a QLObject for itself, which in turn if your code was
diff --git a/stdlib/public/SDK/CoreGraphics/CoreGraphics.swift b/stdlib/public/SDK/CoreGraphics/CoreGraphics.swift
index 7ed88df..6703ab8 100644
--- a/stdlib/public/SDK/CoreGraphics/CoreGraphics.swift
+++ b/stdlib/public/SDK/CoreGraphics/CoreGraphics.swift
@@ -232,6 +232,7 @@
return Mirror(self, children: ["x": x, "y": y], displayStyle: .`struct`)
}
+ @available(*, deprecated, message: "CGPoint.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .point(Double(x), Double(y))
}
@@ -299,6 +300,7 @@
displayStyle: .`struct`)
}
+ @available(*, deprecated, message: "CGSize.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .size(Double(width), Double(height))
}
@@ -436,6 +438,7 @@
displayStyle: .`struct`)
}
+ @available(*, deprecated, message: "CGRect.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .rectangle(
Double(origin.x), Double(origin.y),
diff --git a/stdlib/public/SDK/Foundation/Date.swift b/stdlib/public/SDK/Foundation/Date.swift
index c179f30..d11270f 100644
--- a/stdlib/public/SDK/Foundation/Date.swift
+++ b/stdlib/public/SDK/Foundation/Date.swift
@@ -280,6 +280,7 @@
return df.string(from: self)
}
+ @available(*, deprecated, message: "Date.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(summary)
}
diff --git a/stdlib/public/SDK/Foundation/NSDate.swift b/stdlib/public/SDK/Foundation/NSDate.swift
index a69ef73..4896e9d 100644
--- a/stdlib/public/SDK/Foundation/NSDate.swift
+++ b/stdlib/public/SDK/Foundation/NSDate.swift
@@ -21,6 +21,7 @@
return df.string(from: self as Date)
}
+ @available(*, deprecated, message: "NSDate.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(summary)
}
diff --git a/stdlib/public/SDK/Foundation/NSDictionary.swift b/stdlib/public/SDK/Foundation/NSDictionary.swift
index a979698..57eb4cd 100644
--- a/stdlib/public/SDK/Foundation/NSDictionary.swift
+++ b/stdlib/public/SDK/Foundation/NSDictionary.swift
@@ -80,6 +80,23 @@
return
}
+ if Key.self == String.self {
+ // String and NSString have different concepts of equality, so
+ // string-keyed NSDictionaries may generate key collisions when bridged
+ // over to Swift. See rdar://problem/35995647
+ var dict = Dictionary(minimumCapacity: d.count)
+ d.enumerateKeysAndObjects({ (anyKey: Any, anyValue: Any, _) in
+ let key = Swift._forceBridgeFromObjectiveC(
+ anyKey as AnyObject, Key.self)
+ let value = Swift._forceBridgeFromObjectiveC(
+ anyValue as AnyObject, Value.self)
+ // FIXME: Log a warning if `dict` already had a value for `key`
+ dict[key] = value
+ })
+ result = dict
+ return
+ }
+
// `Dictionary<Key, Value>` where either `Key` or `Value` is a value type
// may not be backed by an NSDictionary.
var builder = _DictionaryBuilder<Key, Value>(count: d.count)
@@ -115,26 +132,9 @@
// dictionary; map it to an empty dictionary.
if _slowPath(d == nil) { return Dictionary() }
- if let native = [Key : Value]._bridgeFromObjectiveCAdoptingNativeStorageOf(
- d! as AnyObject) {
- return native
- }
-
- if _isBridgedVerbatimToObjectiveC(Key.self) &&
- _isBridgedVerbatimToObjectiveC(Value.self) {
- return [Key : Value](
- _cocoaDictionary: unsafeBitCast(d! as AnyObject, to: _NSDictionary.self))
- }
-
- // `Dictionary<Key, Value>` where either `Key` or `Value` is a value type
- // may not be backed by an NSDictionary.
- var builder = _DictionaryBuilder<Key, Value>(count: d!.count)
- d!.enumerateKeysAndObjects({ (anyKey: Any, anyValue: Any, _) in
- builder.add(
- key: Swift._forceBridgeFromObjectiveC(anyKey as AnyObject, Key.self),
- value: Swift._forceBridgeFromObjectiveC(anyValue as AnyObject, Value.self))
- })
- return builder.take()
+ var result: Dictionary? = nil
+ _forceBridgeFromObjectiveC(d!, result: &result)
+ return result!
}
}
diff --git a/stdlib/public/SDK/Foundation/NSRange.swift b/stdlib/public/SDK/Foundation/NSRange.swift
index e05673e..85228fc 100644
--- a/stdlib/public/SDK/Foundation/NSRange.swift
+++ b/stdlib/public/SDK/Foundation/NSRange.swift
@@ -198,6 +198,7 @@
}
extension NSRange : CustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "NSRange.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .range(Int64(location), Int64(length))
}
diff --git a/stdlib/public/SDK/Foundation/NSSet.swift b/stdlib/public/SDK/Foundation/NSSet.swift
index ddcdcd2..bb15004 100644
--- a/stdlib/public/SDK/Foundation/NSSet.swift
+++ b/stdlib/public/SDK/Foundation/NSSet.swift
@@ -73,6 +73,21 @@
return
}
+ if Element.self == String.self {
+ // String and NSString have different concepts of equality, so
+ // string-keyed NSSets may generate key collisions when bridged over to
+ // Swift. See rdar://problem/35995647
+ var set = Set(minimumCapacity: s.count)
+ s.enumerateObjects({ (anyMember: Any, _) in
+ let member = Swift._forceBridgeFromObjectiveC(
+ anyMember as AnyObject, Element.self)
+ // FIXME: Log a warning if `member` is already in the set.
+ set.insert(member)
+ })
+ result = set
+ return
+ }
+
// `Set<Element>` where `Element` is a value type may not be backed by
// an NSSet.
var builder = _SetBuilder<Element>(count: s.count)
@@ -101,25 +116,9 @@
// set; map it to an empty set.
if _slowPath(s == nil) { return Set() }
- if let native =
- Set<Element>._bridgeFromObjectiveCAdoptingNativeStorageOf(s! as AnyObject) {
-
- return native
- }
-
- if _isBridgedVerbatimToObjectiveC(Element.self) {
- return Set<Element>(_cocoaSet: unsafeBitCast(s! as AnyObject,
- to: _NSSet.self))
- }
-
- // `Set<Element>` where `Element` is a value type may not be backed by
- // an NSSet.
- var builder = _SetBuilder<Element>(count: s!.count)
- s!.enumerateObjects({ (anyMember: Any, _) in
- builder.add(member: Swift._forceBridgeFromObjectiveC(
- anyMember as AnyObject, Element.self))
- })
- return builder.take()
+ var result: Set? = nil
+ Set<Element>._forceBridgeFromObjectiveC(s!, result: &result)
+ return result!
}
}
diff --git a/stdlib/public/SDK/Foundation/NSString.swift b/stdlib/public/SDK/Foundation/NSString.swift
index fbbe27e..904185f 100644
--- a/stdlib/public/SDK/Foundation/NSString.swift
+++ b/stdlib/public/SDK/Foundation/NSString.swift
@@ -113,6 +113,7 @@
}
extension NSString : CustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "NSString.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(self as String)
}
diff --git a/stdlib/public/SDK/Foundation/NSURL.swift b/stdlib/public/SDK/Foundation/NSURL.swift
index b62c374..6cf6522 100644
--- a/stdlib/public/SDK/Foundation/NSURL.swift
+++ b/stdlib/public/SDK/Foundation/NSURL.swift
@@ -13,6 +13,7 @@
@_exported import Foundation // Clang module
extension NSURL : CustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "NSURL.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
guard let str = absoluteString else { return .text("Unknown URL") }
return .url(str)
diff --git a/stdlib/public/SDK/Foundation/URL.swift b/stdlib/public/SDK/Foundation/URL.swift
index cf2dad3..47c2e0a 100644
--- a/stdlib/public/SDK/Foundation/URL.swift
+++ b/stdlib/public/SDK/Foundation/URL.swift
@@ -1202,6 +1202,7 @@
}
extension URL : CustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "URL.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .url(absoluteString)
}
diff --git a/stdlib/public/SDK/SpriteKit/SpriteKitQuickLooks.swift.gyb b/stdlib/public/SDK/SpriteKit/SpriteKitQuickLooks.swift.gyb
index 746a0f1..aae60bb 100644
--- a/stdlib/public/SDK/SpriteKit/SpriteKitQuickLooks.swift.gyb
+++ b/stdlib/public/SDK/SpriteKit/SpriteKitQuickLooks.swift.gyb
@@ -15,6 +15,7 @@
% for Self in ['SKShapeNode', 'SKSpriteNode', 'SKTextureAtlas', 'SKTexture']:
extension ${Self} : CustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "${Self}.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
let data = (self as AnyObject)._copyImageData?() as Data?
diff --git a/stdlib/public/SDK/UIKit/UIKit.swift b/stdlib/public/SDK/UIKit/UIKit.swift
index 9be02a5..abf0015 100644
--- a/stdlib/public/SDK/UIKit/UIKit.swift
+++ b/stdlib/public/SDK/UIKit/UIKit.swift
@@ -231,6 +231,7 @@
}
extension UIView : _DefaultCustomPlaygroundQuickLookable {
+ @available(*, deprecated, message: "UIView._defaultCustomPlaygroundQuickLook will be removed in a future Swift version")
public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook {
if _UIViewQuickLookState.views.contains(self) {
return .view(UIImage())
diff --git a/stdlib/public/core/Arrays.swift.gyb b/stdlib/public/core/Arrays.swift.gyb
index ed9fa54..bc7b604 100644
--- a/stdlib/public/core/Arrays.swift.gyb
+++ b/stdlib/public/core/Arrays.swift.gyb
@@ -491,8 +491,20 @@
}
extension ${Self}: RandomAccessCollection, MutableCollection {
+ /// The index type for arrays, `Int`.
+ %if Self == 'ArraySlice':
+ ///
+ /// `ArraySlice` instances are not always indexed from zero. Use `startIndex`
+ /// and `endIndex` as the bounds for any element access, instead of `0` and
+ /// `count`.
+ %end
public typealias Index = Int
+
+ /// The type that represents the indices that are valid for subscripting an
+ /// array, in ascending order.
public typealias Indices = CountableRange<Int>
+
+ /// The type that allows iteration over an array's elements.
public typealias Iterator = IndexingIterator<${Self}>
%if Self == 'ArraySlice':
@@ -541,6 +553,11 @@
%end
}
+ /// Returns the position immediately after the given index.
+ ///
+ /// - Parameter i: A valid index of the collection. `i` must be less than
+ /// `endIndex`.
+ /// - Returns: The index immediately after `i`.
@_inlineable
public func index(after i: Int) -> Int {
// NOTE: this is a manual specialization of index movement for a Strideable
@@ -551,6 +568,10 @@
return i + 1
}
+ /// Replaces the given index with its successor.
+ ///
+ /// - Parameter i: A valid index of the collection. `i` must be less than
+ /// `endIndex`.
@_inlineable
public func formIndex(after i: inout Int) {
// NOTE: this is a manual specialization of index movement for a Strideable
@@ -561,6 +582,11 @@
i += 1
}
+ /// Returns the position immediately before the given index.
+ ///
+ /// - Parameter i: A valid index of the collection. `i` must be greater than
+ /// `startIndex`.
+ /// - Returns: The index immediately before `i`.
@_inlineable
public func index(before i: Int) -> Int {
// NOTE: this is a manual specialization of index movement for a Strideable
@@ -571,6 +597,10 @@
return i - 1
}
+ /// Replaces the given index with its predecessor.
+ ///
+ /// - Parameter i: A valid index of the collection. `i` must be greater than
+ /// `startIndex`.
@_inlineable
public func formIndex(before i: inout Int) {
// NOTE: this is a manual specialization of index movement for a Strideable
@@ -2184,7 +2214,15 @@
% for (Self, a_Self) in arrayTypes:
extension ${Self} : Equatable where Element : Equatable {
- /// Returns `true` if these arrays contain the same elements.
+ /// Returns a Boolean value indicating whether two arrays contain the same
+ /// elements in the same order.
+ ///
+ /// You can use the equal-to operator (`==`) to compare any two arrays
+ /// that store the same, `Equatable`-conforming element type.
+ ///
+ /// - Parameters:
+ /// - lhs: An array to compare.
+ /// - rhs: Another array to compare.
@_inlineable
public static func ==(lhs: ${Self}<Element>, rhs: ${Self}<Element>) -> Bool {
let lhsCount = lhs.count
@@ -2227,7 +2265,15 @@
return true
}
- /// Returns `true` if the arrays do not contain the same elements.
+ /// Returns a Boolean value indicating whether two arrays are not equal.
+ ///
+ /// Two arrays are equal if they contain the same elements in the same order.
+ /// You can use the not-equal-to operator (`!=`) to compare any two arrays
+ /// that store the same, `Equatable`-conforming element type.
+ ///
+ /// - Parameters:
+ /// - lhs: An array to compare.
+ /// - rhs: Another array to compare.
@_inlineable
public static func !=(lhs: ${Self}<Element>, rhs: ${Self}<Element>) -> Bool {
return !(lhs == rhs)
diff --git a/stdlib/public/core/CMakeLists.txt b/stdlib/public/core/CMakeLists.txt
index 0d1ef30..95401ff 100644
--- a/stdlib/public/core/CMakeLists.txt
+++ b/stdlib/public/core/CMakeLists.txt
@@ -167,6 +167,7 @@
CollectionOfOne.swift
ExistentialCollection.swift.gyb
Mirror.swift
+ PlaygroundDisplay.swift
CommandLine.swift
SliceBuffer.swift
Tuple.swift.gyb
diff --git a/stdlib/public/core/ClosedRange.swift b/stdlib/public/core/ClosedRange.swift
index b2212d6..da4de91 100644
--- a/stdlib/public/core/ClosedRange.swift
+++ b/stdlib/public/core/ClosedRange.swift
@@ -103,25 +103,28 @@
/// A `CountableClosedRange` instance contains both its lower bound and its
/// upper bound.
///
-/// print(throughFive.contains(3)) // Prints "true"
-/// print(throughFive.contains(10)) // Prints "false"
-/// print(throughFive.contains(5)) // Prints "true"
+/// throughFive.contains(3)
+/// // true
+/// throughFive.contains(10)
+/// // false
+/// throughFive.contains(5)
+/// // true
///
/// Because a closed range includes its upper bound, a closed range whose lower
-/// bound is equal to the upper bound contains one element. Therefore, a
+/// bound is equal to the upper bound contains that value. Therefore, a
/// `CountableClosedRange` instance cannot represent an empty range.
///
/// let zeroInclusive = 0...0
-/// print(zeroInclusive.isEmpty)
-/// // Prints "false"
-/// print(zeroInclusive.count)
-/// // Prints "1"
+/// zeroInclusive.contains(0)
+/// // true
+/// zeroInclusive.isEmpty
+/// // false
///
/// You can use a `for`-`in` loop or any sequence or collection method with a
/// countable range. The elements of the range are the consecutive values from
/// its lower bound up to, and including, its upper bound.
///
-/// for n in throughFive.suffix(3) {
+/// for n in 3...5 {
/// print(n)
/// }
/// // Prints "3"
diff --git a/stdlib/public/core/Collection.swift b/stdlib/public/core/Collection.swift
index e46b498..9cf0177 100644
--- a/stdlib/public/core/Collection.swift
+++ b/stdlib/public/core/Collection.swift
@@ -69,11 +69,11 @@
/// }
/// }
///
-/// The `CollectionOfTwo` type uses the default iterator type,
-/// `IndexingIterator`, because it doesn't define its own `makeIterator()`
-/// method or `Iterator` associated type. This example shows how a
-/// `CollectionOfTwo` instance can be created holding the values of a point,
-/// and then iterated over using a `for`-`in` loop.
+/// Because `CollectionOfTwo` doesn't define its own `makeIterator()`
+/// method or `Iterator` associated type, it uses the default iterator type,
+/// `IndexingIterator`. This example shows how a `CollectionOfTwo` instance
+/// can be created holding the values of a point, and then iterated over
+/// using a `for`-`in` loop.
///
/// let point = CollectionOfTwo(15.0, 20.0)
/// for element in point {
@@ -426,22 +426,35 @@
/// Accesses a contiguous subrange of the collection's elements.
///
- /// The accessed slice uses the same indices for the same elements as the
- /// original collection uses. Always use the slice's `startIndex` property
- /// instead of assuming that its indices start at a particular value.
- ///
- /// This example demonstrates getting a slice of an array of strings, finding
- /// the index of one of the strings in the slice, and then using that index
- /// in the original array.
+ /// For example, using a `PartialRangeFrom` range expression with an array
+ /// accesses the subrange from the start of the range expression until the
+ /// end of the array.
///
/// let streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
- /// let streetsSlice = streets[2 ..< streets.endIndex]
+ /// let streetsSlice = streets[2...]
/// print(streetsSlice)
- /// // Prints "["Channing", "Douglas", "Evarts"]"
+ /// // ["Channing", "Douglas", "Evarts"]
///
- /// let index = streetsSlice.index(of: "Evarts") // 4
- /// print(streets[index!])
- /// // Prints "Evarts"
+ /// The accessed slice uses the same indices for the same elements as the
+ /// original collection. This example searches `streetsSlice` for one of the
+ /// strings in the slice, and then uses that index in the original array.
+ ///
+ /// let index = streetsSlice.index(of: "Evarts")! // 4
+ /// print(streets[index])
+ /// // "Evarts"
+ ///
+ /// Always use the slice's `startIndex` property instead of assuming that its
+ /// indices start at a particular value. Attempting to access an element by
+ /// using an index outside the bounds of the slice may result in a runtime
+ /// error, even if that index is valid for the original collection.
+ ///
+ /// print(streetsSlice.startIndex)
+ /// // 2
+ /// print(streetsSlice[2])
+ /// // "Channing"
+ ///
+ /// print(streetsSlice[0])
+ /// // error: Index out of bounds
///
/// - Parameter bounds: A range of the collection's indices. The bounds of
/// the range must be valid indices of the collection.
@@ -1044,7 +1057,7 @@
/// Accesses a contiguous subrange of the collection's elements.
///
/// The accessed slice uses the same indices for the same elements as the
- /// original collection uses. Always use the slice's `startIndex` property
+ /// original collection. Always use the slice's `startIndex` property
/// instead of assuming that its indices start at a particular value.
///
/// This example demonstrates getting a slice of an array of strings, finding
diff --git a/stdlib/public/core/GroupInfo.json b/stdlib/public/core/GroupInfo.json
index e94dd6c..bd9eeca 100644
--- a/stdlib/public/core/GroupInfo.json
+++ b/stdlib/public/core/GroupInfo.json
@@ -148,6 +148,9 @@
"CompilerProtocols.swift",
"ShadowProtocols.swift"
],
+ "Playground": [
+ "PlaygroundDisplay.swift"
+ ],
"Misc": [
"AnyHashable.swift",
"Interval.swift",
diff --git a/stdlib/public/core/Integers.swift.gyb b/stdlib/public/core/Integers.swift.gyb
index 018bb36..813fff6 100644
--- a/stdlib/public/core/Integers.swift.gyb
+++ b/stdlib/public/core/Integers.swift.gyb
@@ -809,8 +809,8 @@
def overflowOperationComment(operator):
comments = {
'+': """\
- /// Returns the sum of this value and the given value along with a flag
- /// indicating whether overflow occurred in the operation.
+ /// Returns the sum of this value and the given value, along with a Boolean
+ /// value indicating whether overflow occurred in the operation.
///
/// - Parameter rhs: The value to add to this value.
/// - Returns: A tuple containing the result of the addition along with a
@@ -821,32 +821,34 @@
/// and `rhs`.
""",
'-': """\
- /// Returns the difference of this value and the given value along with a
- /// flag indicating whether overflow occurred in the operation.
+ /// Returns the difference obtained by subtracting the given value from this
+ /// value, along with a Boolean value indicating whether overflow occurred in
+ /// the operation.
///
/// - Parameter rhs: The value to subtract from this value.
/// - Returns: A tuple containing the result of the subtraction along with a
- /// flag indicating whether overflow occurred. If the `overflow` component
- /// is `false`, the `partialValue` component contains the entire
- /// difference. If the `overflow` component is `true`, an overflow
- /// occurred and the `partialValue` component contains the truncated
- /// result of `rhs` subtracted from this value.
+ /// Boolean value indicating whether overflow occurred. If the `overflow`
+ /// component is `false`, the `partialValue` component contains the entire
+ /// difference. If the `overflow` component is `true`, an overflow occurred
+ /// and the `partialValue` component contains the truncated result of `rhs`
+ /// subtracted from this value.
""",
'*': """\
- /// Returns the product of this value and the given value along with a flag
- /// indicating whether overflow occurred in the operation.
+ /// Returns the product of this value and the given value, along with a
+ /// Boolean value indicating whether overflow occurred in the operation.
///
/// - Parameter rhs: The value to multiply by this value.
/// - Returns: A tuple containing the result of the multiplication along with
/// a Boolean value indicating whether overflow occurred. If the `overflow`
/// component is `false`, the `partialValue` component contains the entire
- /// product. If the `overflow` component is `true`, an overflow
- /// occurred and the `partialValue` component contains the truncated
- /// product of this value and `rhs`.
+ /// product. If the `overflow` component is `true`, an overflow occurred and
+ /// the `partialValue` component contains the truncated product of this
+ /// value and `rhs`.
""",
'/': """\
- /// Returns the quotient of dividing this value by the given value along with
- /// a flag indicating whether overflow occurred in the operation.
+ /// Returns the quotient obtained by dividing this value by the given value,
+ /// along with a Boolean value indicating whether overflow occurred in the
+ /// operation.
///
/// Dividing by zero is not an error when using this method. For a value `x`,
/// the result of `x.dividedReportingOverflow(by: 0)` is `(x, true)`.
@@ -856,22 +858,24 @@
/// Boolean value indicating whether overflow occurred. If the `overflow`
/// component is `false`, the `partialValue` component contains the entire
/// quotient. If the `overflow` component is `true`, an overflow occurred
- /// and the `partialValue` component contains the truncated quotient.
+ /// and the `partialValue` component contains either the truncated quotient
+ /// or, if the quotient is undefined, the dividend.
""",
'%': """\
- // FIXME(integers): the comment is for division instead of remainder
- /// Returns the remainder of dividing this value by the given value along
- /// with a flag indicating whether overflow occurred in the operation.
+ /// Returns the remainder after dividing this value by the given value, along
+ /// with a Boolean value indicating whether overflow occurred during division.
///
/// Dividing by zero is not an error when using this method. For a value `x`,
- /// the result of `x.dividedReportingOverflow(by: 0)` is `(x, true)`.
+ /// the result of `x.remainderReportingOverflow(dividingBy: 0)` is
+ /// `(x, true)`.
///
/// - Parameter rhs: The value to divide this value by.
- /// - Returns: A tuple containing the result of the division along with a
+ /// - Returns: A tuple containing the result of the operation along with a
/// Boolean value indicating whether overflow occurred. If the `overflow`
/// component is `false`, the `partialValue` component contains the entire
- /// quotient. If the `overflow` component is `true`, an overflow occurred
- /// and the `partialValue` component contains the truncated quotient.
+ /// remainder. If the `overflow` component is `true`, an overflow occurred
+ /// during division and the `partialValue` component contains either the
+ /// entire remainder or, if the remainder is undefined, the dividend.
""",
}
return comments[operator]
@@ -896,15 +900,15 @@
/// - Returns: The sum of this value and `rhs`.
""",
'-': """\
- /// Returns the difference of this value and the given value without checking
- /// for arithmetic overflow.
+ /// Returns the difference obtained by subtracting the given value from this
+ /// value without checking for arithmetic overflow.
///
/// If an arithmetic overflow occurs, the behavior is undefined. Use this
/// function only to avoid the cost of overflow checking when you are sure
/// that the operation won't overflow.
///
/// - Parameter rhs: The value to subtract from this value.
- /// - Returns: The difference of this value and `rhs`.
+ /// - Returns: The result of subtracting `rhs` from this value.
""",
'*': """\
/// Returns the product of this value and the given value without checking
@@ -915,18 +919,18 @@
/// that the operation won't overflow.
///
/// - Parameter rhs: The value to multiply by this value.
- /// - Returns: The difference of this value and `rhs`.
+ /// - Returns: The product of this value and `rhs`.
""",
'/': """\
- /// Returns the quotient of dividing this value by the given value without
- /// checking for arithmetic overflow.
+ /// Returns the quotient obtained by dividing this value by the given value
+ /// without checking for arithmetic overflow.
///
/// If an arithmetic overflow occurs, the behavior is undefined. Use this
/// function only to avoid the cost of overflow checking when you are sure
/// that the operation won't overflow.
///
/// - Parameter rhs: The value to divide this value by.
- /// - Returns: The quotient of dividing this value by `rhs`.
+ /// - Returns: The result of dividing this value by `rhs`.
""",
}
return comments[operator]
@@ -1576,12 +1580,18 @@
}
extension BinaryInteger {
+ /// Creates a new value equal to zero.
@_inlineable // FIXME(sil-serialize-all)
@_transparent
public init() {
self = 0
}
+ /// Returns `-1` if this value is negative and `1` if it's positive;
+ /// otherwise, `0`.
+ ///
+ /// - Returns: The sign of this number, expressed as an integer of the same
+ /// type.
@_inlineable // FIXME(sil-serialize-all)
@_transparent
public func signum() -> Self {
@@ -1729,6 +1739,7 @@
return other - self
}
+ // FIXME(ABI): using Int as the parameter type is wrong.
/// Returns a value that is offset the specified distance from this value.
///
/// Use the `advanced(by:)` method in generic code to offset a value by a
@@ -1740,7 +1751,6 @@
///
/// - Parameter n: The distance to advance this value.
/// - Returns: A value that is offset from this value by `n`.
- // FIXME(ABI): using Int as the parameter type is wrong.
@_inlineable // FIXME(sil-serialize-all)
@_transparent
public func advanced(by n: Int) -> Int {
@@ -2055,7 +2065,7 @@
/// `-(2 ** (bitWidth - 1))` through `(2 ** (bitWidth - 1)) - 1`. For example,
/// the `Int8` type has a `bitWidth` value of 8 and can store any integer in
/// the range `-128...127`.
- static var bitWidth : Int { get }
+ static var bitWidth: Int { get }
/// The maximum representable integer in this type.
///
@@ -2083,10 +2093,10 @@
///
/// Use this method to calculate the full result of a product that would
/// otherwise overflow. Unlike traditional truncating multiplication, the
- /// `multipliedFullWidth(by:)` method returns a tuple
- /// containing both the `high` and `low` parts of the product of this value and
- /// `other`. The following example uses this method to multiply two `UInt8`
- /// values that normally overflow when multiplied:
+ /// `multipliedFullWidth(by:)` method returns a tuple containing both the
+ /// `high` and `low` parts of the product of this value and `other`. The
+ /// following example uses this method to multiply two `UInt8` values that
+ /// normally overflow when multiplied:
///
/// let x: UInt8 = 100
/// let y: UInt8 = 20
@@ -2107,20 +2117,18 @@
/// - Returns: A tuple containing the high and low parts of the result of
/// multiplying this value and `other`.
func multipliedFullWidth(by other: Self) -> (high: Self, low: Self.Magnitude)
- // FIXME(integers): figure out how to return DoubleWidth<Self>
- /// Returns a tuple containing the quotient and remainder of dividing the
- /// given value by this value.
+ /// Returns a tuple containing the quotient and remainder obtained by dividing
+ /// the given value by this value.
///
/// The resulting quotient must be representable within the bounds of the
- /// type. If the quotient of dividing `dividend` by this value is too large
- /// to represent in the type, a runtime error may occur.
+ /// type. If the quotient is too large to represent in the type, a runtime
+ /// error may occur.
///
/// - Parameter dividend: A tuple containing the high and low parts of a
- /// double-width integer. The `high` component of the value carries the
- /// sign, if the type is signed.
- /// - Returns: A tuple containing the quotient and remainder of `dividend`
- /// divided by this value.
+ /// double-width integer.
+ /// - Returns: A tuple containing the quotient and remainder obtained by
+ /// dividing `dividend` by this value.
func dividingFullWidth(_ dividend: (high: Self, low: Self.Magnitude))
-> (quotient: Self, remainder: Self)
@@ -2521,11 +2529,8 @@
% for x in binaryArithmetic['Numeric'] + binaryArithmetic["BinaryInteger"][:1]:
% callLabel = x.firstArg + ': ' if not x.firstArg == '_' else ''
-// FIXME(integers): pending optimizer work on handling the case where the
-// boolean value is wrapped into a two-case enum and then immediately
-// unwrapped. <rdar://problem/29004429>
-// Uncomment this block and remove the corresponding one from the concrete
-// types once the optimizer is ready.
+// FIXME(integers): uncomment this block and remove the corresponding one from
+// the concrete types
#if false
${assignmentOperatorComment(x.operator, True)}
@_transparent
@@ -2936,6 +2941,7 @@
: FixedWidthInteger, ${Unsigned}Integer,
_ExpressibleByBuiltinIntegerLiteral {
+ /// A type that represents an integer literal.
public typealias IntegerLiteralType = ${Self}
@@ -3051,9 +3057,6 @@
return Bool(Builtin.cmp_${u}lt_Int${bits}(lhs._value, rhs._value))
}
-// FIXME(integers): pending optimizer work on handling the case where the
-// boolean value is wrapped into a two-case enum and then immediately
-// unwrapped. <rdar://problem/29004429>
// See corresponding definitions in the FixedWidthInteger extension.
% for x in binaryArithmetic['Numeric'] + binaryArithmetic["BinaryInteger"][:1]:
${assignmentOperatorComment(x.operator, True)}
@@ -3085,7 +3088,6 @@
lhs = ${Self}(result)
}
% end
-// end of FIXME(integers)
% for x in chain(*binaryArithmetic.values()):
diff --git a/stdlib/public/core/Mirror.swift b/stdlib/public/core/Mirror.swift
index c3fca5b..20f282d 100644
--- a/stdlib/public/core/Mirror.swift
+++ b/stdlib/public/core/Mirror.swift
@@ -659,7 +659,19 @@
//===--- QuickLooks -------------------------------------------------------===//
/// The sum of types that can be used as a Quick Look representation.
+///
+/// - note: `PlaygroundQuickLook` is deprecated, and will be removed from the
+/// standard library in a future Swift release. Customizing display for in a
+/// playground is now done using the `CustomPlaygroundDisplayConvertible`
+/// protocol, which does not use the `PlaygroundQuickLook` enum. Please remove
+/// your uses of `PlaygroundQuickLook`, or conditionalize your use such that it
+/// is only present when compiling with Swift 4.0 or Swift 3.2 or earlier:
+///
+/// #if !(swift(>=4.1) || swift(>=3.3) && !swift(>=4.0))
+/// /* OK to use PlaygroundQuickLook */
+/// #endif
@_fixed_layout // FIXME(sil-serialize-all)
+@available(*, deprecated, message: "PlaygroundQuickLook will be removed in a future Swift version. For customizing how types are presented in playgrounds, use CustomPlaygroundDisplayConvertible instead.")
public enum PlaygroundQuickLook {
/// Plain text.
case text(String)
@@ -746,6 +758,7 @@
/// - Parameter subject: The instance to represent with the resulting Quick
/// Look.
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "PlaygroundQuickLook will be removed in a future Swift version.")
public init(reflecting subject: Any) {
if let customized = subject as? CustomPlaygroundQuickLookable {
self = customized.customPlaygroundQuickLook
@@ -771,6 +784,23 @@
/// with the representation supplied for your type by default, you can make it
/// conform to the `CustomPlaygroundQuickLookable` protocol and provide a
/// custom `PlaygroundQuickLook` instance.
+///
+/// - note: `CustomPlaygroundQuickLookable` is deprecated, and will be removed
+/// from the standard library in a future Swift release. Please migrate to the
+/// `CustomPlaygroundDisplayConvertible` protocol instead, or conditionalize
+/// your conformance such that it is only present when compiling with Swift 4.0
+/// or Swift 3.2 or earlier:
+///
+/// #if swift(>=4.1) || swift(>=3.3) && !swift(>=4.0)
+/// // With Swift 4.1 and later (including Swift 3.3 and later), implement
+/// // CustomPlaygroundDisplayConvertible.
+/// extension MyType: CustomPlaygroundDisplayConvertible { /*...*/ }
+/// #else
+/// // Otherwise, on Swift 4.0 and Swift 3.2 and earlier,
+/// // implement CustomPlaygroundQuickLookable.
+/// extension MyType: CustomPlaygroundQuickLookable { /*...*/ }
+/// #endif
+@available(*, deprecated, message: "CustomPlaygroundQuickLookable will be removed in a future Swift version. For customizing how types are presented in playgrounds, use CustomPlaygroundDisplayConvertible instead.")
public protocol CustomPlaygroundQuickLookable {
/// A custom playground Quick Look for this instance.
///
@@ -782,6 +812,7 @@
// A workaround for <rdar://problem/26182650>
// FIXME(ABI)#50 (Dynamic Dispatch for Class Extensions) though not if it moves out of stdlib.
+@available(*, deprecated, message: "_DefaultCustomPlaygroundQuickLookable will be removed in a future Swift version. For customizing how types are presented in playgrounds, use CustomPlaygroundDisplayConvertible instead.")
public protocol _DefaultCustomPlaygroundQuickLookable {
var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook { get }
}
diff --git a/stdlib/public/core/Mirrors.swift.gyb b/stdlib/public/core/Mirrors.swift.gyb
index a5724c5..3df3a67 100644
--- a/stdlib/public/core/Mirrors.swift.gyb
+++ b/stdlib/public/core/Mirrors.swift.gyb
@@ -48,6 +48,7 @@
extension ${Type[0]} : CustomPlaygroundQuickLookable {
/// A custom playground Quick Look for the `${Type[0]}` instance.
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "${Type[0]}.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return ${Type[1]}(${Type[2]})
}
diff --git a/stdlib/public/core/PlaygroundDisplay.swift b/stdlib/public/core/PlaygroundDisplay.swift
new file mode 100644
index 0000000..ef5dd66
--- /dev/null
+++ b/stdlib/public/core/PlaygroundDisplay.swift
@@ -0,0 +1,63 @@
+//===--- PlaygroundDisplay.swift ------------------------------------------===//
+//
+// This source file is part of the Swift.org open source project
+//
+// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
+// Licensed under Apache License v2.0 with Runtime Library Exception
+//
+// See https://swift.org/LICENSE.txt for license information
+// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+//
+//===----------------------------------------------------------------------===//
+
+/// A type that supplies a custom description for playground logging.
+///
+/// All types have a default description for playgrounds. This protocol
+/// allows types to provide custom descriptions which are then logged in
+/// place of the original instance.
+///
+/// Playground logging can generate, at a minimum, a structured description
+/// of any type. Playground logging is also capable of generating a richer,
+/// more specialized description of core types -- for instance, the contents
+/// of a `String` are logged, as are the components of an `NSColor` or
+/// `UIColor`.
+///
+/// The current playground logging implementation logs specialized
+/// descriptions of at least the following types:
+///
+/// - `String` and `NSString`
+/// - `Int` and `UInt` (including the sized variants)
+/// - `Float` and `Double`
+/// - `Bool`
+/// - `Date` and `NSDate`
+/// - `NSAttributedString`
+/// - `NSNumber`
+/// - `NSRange`
+/// - `URL` and `NSURL`
+/// - `CGPoint`, `CGSize`, and `CGRect`
+/// - `NSColor`, `UIColor`, `CGColor`, and `CIColor`
+/// - `NSImage`, `UIImage`, `CGImage`, and `CIImage`
+/// - `NSBezierPath` and `UIBezierPath`
+/// - `NSView` and `UIView`
+///
+/// Playground logging may also be able to support specialized descriptions
+/// of other types.
+///
+/// Implementors of `CustomPlaygroundDisplayConvertible` may return a value of
+/// one of the above types to also receive a specialized log description.
+/// Implementors may also return any other type, and playground logging will
+/// generated structured logging for the returned value.
+///
+/// - note: `CustomPlaygroundDisplayConvertible` conformances chain -- that is,
+/// if `playgroundDescription` returns an instance which itself conforms to
+/// `CustomPlaygroundDisplayConvertible`, then playground logging will ask for
+/// that instance's `playgroundDescription` and so on. It is permissible for
+/// playground logging implementations to place a reasonable limit on this
+/// kind of chaining to prevent infinite loops.
+public protocol CustomPlaygroundDisplayConvertible {
+ /// Returns the custom playground description for this instance.
+ ///
+ /// If this type has value semantics, the instance returned should be
+ /// unaffected by subsequent mutations if possible.
+ var playgroundDescription: Any { get }
+}
\ No newline at end of file
diff --git a/stdlib/public/core/Range.swift.gyb b/stdlib/public/core/Range.swift.gyb
index dc8cefb..5b79e5f 100644
--- a/stdlib/public/core/Range.swift.gyb
+++ b/stdlib/public/core/Range.swift.gyb
@@ -777,7 +777,7 @@
}
}
-/// A partial half-open interval up to, and including, an upper bound.
+/// A partial interval up to, and including, an upper bound.
///
/// You create `PartialRangeThrough` instances by using the prefix closed range
/// operator (prefix `...`).
@@ -875,9 +875,12 @@
/// You can use a countable partial range to quickly check if a value is
/// contained in a particular range of values. For example:
///
-/// atLeastFive.contains(4) // false
-/// atLeastFive.contains(5) // true
-/// atLeastFive.contains(6) // true
+/// atLeastFive.contains(4)
+/// // false
+/// atLeastFive.contains(5)
+/// // true
+/// atLeastFive.contains(6)
+/// // true
///
/// You can use a countable partial range of a collection's indices to
/// represent the range from the partial range's lower bound up to the end of
@@ -893,7 +896,7 @@
/// a countable range.
///
/// Using a Partial Range as a Sequence
-/// ===================================
+/// -----------------------------------
///
/// You can iterate over a countable partial range using a `for`-`in` loop, or
/// call any sequence method that doesn't require that the sequence is finite.
@@ -990,8 +993,8 @@
/// Returns a half-open range that contains its lower bound but not its upper
/// bound.
///
- /// Use the half-open range operator (`..<`) to create a range of any type that
- /// conforms to the `Comparable` protocol. This example creates a
+ /// Use the half-open range operator (`..<`) to create a range of any type
+ /// that conforms to the `Comparable` protocol. This example creates a
/// `Range<Double>` from zero up to, but not including, 5.0.
///
/// let lessThanFive = 0.0..<5.0
@@ -1207,17 +1210,94 @@
}
}
-// FIXME: replace this with a computed var named `...` when the language makes
-// that possible.
+/// A range expression that represents the entire range of a collection.
+///
+/// You can use the unbounded range operator (`...`) to create a slice of a
+/// collection that contains all of the collection's elements. Slicing with an
+/// unbounded range is essentially a conversion of a collection instance into
+/// its slice type.
+///
+/// For example, the following code declares `levenshteinDistance(_:_:)`, a
+/// function that calculates the number of changes required to convert one
+/// string into another. `levenshteinDistance(_:_:)` uses `Substring`, a
+/// string's slice type, for its parameters.
+///
+/// func levenshteinDistance(_ s1: Substring, _ s2: Substring) -> Int {
+/// if s1.isEmpty { return s2.count }
+/// if s2.isEmpty { return s1.count }
+///
+/// let cost = s1.first == s2.first ? 0 : 1
+///
+/// return min(
+/// levenshteinDistance(s1.dropFirst(), s2) + 1,
+/// levenshteinDistance(s1, s2.dropFirst()) + 1,
+/// levenshteinDistance(s1.dropFirst(), s2.dropFirst()) + cost)
+/// }
+///
+/// To call `levenshteinDistance(_:_:)` with two strings, use an unbounded
+/// range in each string's subscript to convert it to a `Substring`.
+///
+/// let word1 = "grizzly"
+/// let word2 = "grisly"
+/// let distance = levenshteinDistance(word1[...], word2[...])
+/// // distance == 2
public enum UnboundedRange_ {
+ // FIXME: replace this with a computed var named `...` when the language makes
+ // that possible.
+
+ /// Creates an unbounded range expression.
+ ///
+ /// The unbounded range operator (`...`) is valid only within a collection's
+ /// subscript.
@_inlineable // FIXME(sil-serialize-all)
public static postfix func ... (_: UnboundedRange_) -> () {
fatalError("uncallable")
}
}
+
+/// The type of an unbounded range operator.
public typealias UnboundedRange = (UnboundedRange_)->()
extension Collection {
+ /// Accesses the contiguous subrange of the collection's elements specified
+ /// by a range expression.
+ ///
+ /// The range expression is converted to a concrete subrange relative to this
+ /// collection. For example, using a `PartialRangeFrom` range expression
+ /// with an array accesses the subrange from the start of the range
+ /// expression until the end of the array.
+ ///
+ /// let streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
+ /// let streetsSlice = streets[2...]
+ /// print(streetsSlice)
+ /// // ["Channing", "Douglas", "Evarts"]
+ ///
+ /// The accessed slice uses the same indices for the same elements as the
+ /// original collection uses. This example searches `streetsSlice` for one
+ /// of the strings in the slice, and then uses that index in the original
+ /// array.
+ ///
+ /// let index = streetsSlice.index(of: "Evarts") // 4
+ /// print(streets[index!])
+ /// // "Evarts"
+ ///
+ /// Always use the slice's `startIndex` property instead of assuming that its
+ /// indices start at a particular value. Attempting to access an element by
+ /// using an index outside the bounds of the slice's indices may result in a
+ /// runtime error, even if that index is valid for the original collection.
+ ///
+ /// print(streetsSlice.startIndex)
+ /// // 2
+ /// print(streetsSlice[2])
+ /// // "Channing"
+ ///
+ /// print(streetsSlice[0])
+ /// // error: Index out of bounds
+ ///
+ /// - Parameter bounds: A range of the collection's indices. The bounds of
+ /// the range must be valid indices of the collection.
+ ///
+ /// - Complexity: O(1)
@_inlineable
public subscript<R: RangeExpression>(r: R)
-> SubSequence where R.Bound == Index {
diff --git a/stdlib/public/core/SequenceAlgorithms.swift.gyb b/stdlib/public/core/SequenceAlgorithms.swift.gyb
index 5add15f..fb2a7fd 100644
--- a/stdlib/public/core/SequenceAlgorithms.swift.gyb
+++ b/stdlib/public/core/SequenceAlgorithms.swift.gyb
@@ -741,7 +741,7 @@
/// let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
/// // [1, 2, nil, nil, 5]
///
- /// let flatMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
+ /// let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
/// // [1, 2, 5]
///
/// - Parameter transform: A closure that accepts an element of this
diff --git a/stdlib/public/core/String.swift b/stdlib/public/core/String.swift
index 84c015b..a1fe657 100644
--- a/stdlib/public/core/String.swift
+++ b/stdlib/public/core/String.swift
@@ -1240,6 +1240,10 @@
}
extension String : CustomStringConvertible {
+ /// The value of this string.
+ ///
+ /// Using this property directly is discouraged. Instead, use simple
+ /// assignment to create a new constant or variable equal to this string.
@_inlineable // FIXME(sil-serialize-all)
public var description: String {
return self
diff --git a/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb b/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
index 47b11eb..8d0e80e 100644
--- a/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
+++ b/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
@@ -441,13 +441,6 @@
}
extension Collection {
- @_inlineable // FIXME(sil-serialize-all)
- public func compactMap(
- _ transform: (Element) throws -> String?
- ) rethrows -> [String] {
- return try _compactMap(transform)
- }
-
@available(swift, deprecated: 4.1, renamed: "compactMap(_:)",
message: "Please use compactMap(_:) for the case where closure returns an optional value")
@inline(__always)
diff --git a/stdlib/public/core/StringUTF16.swift b/stdlib/public/core/StringUTF16.swift
index 44a0c30..7d89874 100644
--- a/stdlib/public/core/StringUTF16.swift
+++ b/stdlib/public/core/StringUTF16.swift
@@ -440,6 +440,7 @@
extension String.UTF16View : CustomPlaygroundQuickLookable {
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "UTF16View.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(description)
}
diff --git a/stdlib/public/core/StringUTF8.swift b/stdlib/public/core/StringUTF8.swift
index 5a84ca9..1a10529 100644
--- a/stdlib/public/core/StringUTF8.swift
+++ b/stdlib/public/core/StringUTF8.swift
@@ -659,6 +659,7 @@
extension String.UTF8View : CustomPlaygroundQuickLookable {
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "UTF8View.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(description)
}
diff --git a/stdlib/public/core/StringUnicodeScalarView.swift b/stdlib/public/core/StringUnicodeScalarView.swift
index 8280515..4d853b7 100644
--- a/stdlib/public/core/StringUnicodeScalarView.swift
+++ b/stdlib/public/core/StringUnicodeScalarView.swift
@@ -509,6 +509,7 @@
extension String.UnicodeScalarView : CustomPlaygroundQuickLookable {
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "UnicodeScalarView.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(description)
}
diff --git a/stdlib/public/core/Substring.swift.gyb b/stdlib/public/core/Substring.swift.gyb
index 9092187..632ecdd 100644
--- a/stdlib/public/core/Substring.swift.gyb
+++ b/stdlib/public/core/Substring.swift.gyb
@@ -365,6 +365,7 @@
extension Substring : CustomPlaygroundQuickLookable {
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "Substring.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return String(self).customPlaygroundQuickLook
}
diff --git a/stdlib/public/core/UnsafePointer.swift.gyb b/stdlib/public/core/UnsafePointer.swift.gyb
index 146548c..5b5ec76 100644
--- a/stdlib/public/core/UnsafePointer.swift.gyb
+++ b/stdlib/public/core/UnsafePointer.swift.gyb
@@ -1000,6 +1000,7 @@
}
@_inlineable // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "${Self}.customPlaygroundQuickLook will be removed in a future Swift version")
public var customPlaygroundQuickLook: PlaygroundQuickLook {
return .text(summary)
}
diff --git a/stdlib/public/core/UnsafeRawPointer.swift.gyb b/stdlib/public/core/UnsafeRawPointer.swift.gyb
index 4a3e4aa..5d0259c 100644
--- a/stdlib/public/core/UnsafeRawPointer.swift.gyb
+++ b/stdlib/public/core/UnsafeRawPointer.swift.gyb
@@ -996,6 +996,7 @@
extension Unsafe${Mutable}RawPointer : CustomPlaygroundQuickLookable {
@_inlineable // FIXME(sil-serialize-all)
@_versioned // FIXME(sil-serialize-all)
+ @available(*, deprecated, message: "Unsafe${Mutable}RawPointer.customPlaygroundQuickLook will be removed in a future Swift version")
internal var summary: String {
let selfType = "${Self}"
let ptrValue = UInt64(
diff --git a/test/SILOptimizer/arcsequenceopts.sil b/test/SILOptimizer/arcsequenceopts.sil
index 1ba2037..c1ad811 100644
--- a/test/SILOptimizer/arcsequenceopts.sil
+++ b/test/SILOptimizer/arcsequenceopts.sil
@@ -2146,3 +2146,20 @@
strong_release %1 : $Builtin.NativeObject
return undef : $()
}
+
+// Make sure that we treat applications of callee_guaranteed functions as a
+// guaranteed use of the function object.
+//
+// CHECK-LABEL: sil @test_callee_guaranteed_is_treated_as_guaranteed : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () {
+// CHECK: strong_retain
+// CHECK: apply
+// CHECK: strong_release
+// CHECK: } // end sil function 'test_callee_guaranteed_is_treated_as_guaranteed'
+sil @test_callee_guaranteed_is_treated_as_guaranteed : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () {
+bb0(%0 : $@callee_guaranteed () -> ()):
+ strong_retain %0 : $@callee_guaranteed () -> ()
+ apply %0() : $@callee_guaranteed () -> ()
+ strong_release %0 : $@callee_guaranteed () -> ()
+ %9999 = tuple()
+ return %9999 : $()
+}
diff --git a/utils/build-presets.ini b/utils/build-presets.ini
index 0f0f66b..7b3275d 100644
--- a/utils/build-presets.ini
+++ b/utils/build-presets.ini
@@ -326,7 +326,6 @@
swiftpm
# Build Playground support
-playgroundlogger
playgroundsupport
dash-dash
@@ -768,7 +767,6 @@
skip-test-xctest
skip-test-foundation
skip-test-libdispatch
-skip-test-playgroundlogger
skip-test-playgroundsupport
skip-test-libicu
@@ -945,7 +943,6 @@
lldb
llbuild
swiftpm
-playgroundlogger
playgroundsupport
# Build with debug info, this allows us to symbolicate crashes from
@@ -963,14 +960,12 @@
build-swift-static-stdlib
build-swift-static-sdk-overlay
build-swift-stdlib-unittest-extra
-playgroundlogger-build-type=Release
playgroundsupport-build-type=Release
install-swift
install-lldb
install-llbuild
install-swiftpm
-install-playgroundlogger
install-playgroundsupport
install-destdir=%(install_destdir)s
@@ -1060,7 +1055,6 @@
skip-test-llbuild
skip-test-lldb
skip-test-cmark
-skip-test-playgroundlogger
skip-test-playgroundsupport
@@ -1144,7 +1138,6 @@
swiftpm
# Build Playground support
-playgroundlogger
playgroundsupport
dash-dash
diff --git a/utils/build-script b/utils/build-script
index 09dfc37..60202a1 100755
--- a/utils/build-script
+++ b/utils/build-script
@@ -589,8 +589,6 @@
impl_args += ["--skip-build-libicu"]
if not args.build_swiftpm:
impl_args += ["--skip-build-swiftpm"]
- if not args.build_playgroundlogger:
- impl_args += ["--skip-build-playgroundlogger"]
if not args.build_playgroundsupport:
impl_args += ["--skip-build-playgroundsupport"]
if args.build_swift_dynamic_stdlib:
@@ -638,7 +636,6 @@
"--skip-test-foundation",
"--skip-test-libdispatch",
"--skip-test-libicu",
- "--skip-test-playgroundlogger",
"--skip-test-playgroundsupport"]
if not args.test_linux:
impl_args += ["--skip-test-linux"]
diff --git a/utils/build-script-impl b/utils/build-script-impl
index 1b4ac56..f6401fd 100755
--- a/utils/build-script-impl
+++ b/utils/build-script-impl
@@ -77,7 +77,6 @@
foundation-build-type "Debug" "the build variant for Foundation"
libdispatch-build-type "Debug" "the build variant for libdispatch"
libicu-build-type "Debug" "the build variant for libicu"
- playgroundlogger-build-type "Debug" "the build variant for PlaygroundLogger"
playgroundsupport-build-type "Debug" "the build variant for PlaygroundSupport"
xctest-build-type "Debug" "the build variant for xctest"
swiftpm-build-type "Debug" "the build variant for swiftpm"
@@ -126,7 +125,6 @@
skip-build-libicu "" "set to skip building libicu"
skip-build-benchmarks "" "set to skip building Swift Benchmark Suite"
skip-build-external-benchmarks "1" "set to skip building the external Swift Benchmark Suite. (skipped by default)"
- skip-build-playgroundlogger "" "set to skip building PlaygroundLogger"
skip-build-playgroundsupport "" "set to skip building PlaygroundSupport"
skip-test-cmark "" "set to skip testing CommonMark"
skip-test-lldb "" "set to skip testing lldb"
@@ -137,7 +135,6 @@
skip-test-foundation "" "set to skip testing foundation"
skip-test-libdispatch "" "set to skip testing libdispatch"
skip-test-libicu "" "set to skip testing libicu"
- skip-test-playgroundlogger "" "set to skip testing PlaygroundLogger"
skip-test-playgroundsupport "" "set to skip testing PlaygroundSupport"
skip-test-linux "" "set to skip testing Swift stdlibs for Linux"
skip-test-freebsd "" "set to skip testing Swift stdlibs for FreeBSD"
@@ -191,7 +188,6 @@
install-foundation "" "whether to install foundation"
install-libdispatch "" "whether to install libdispatch"
install-libicu "" "whether to install libicu"
- install-playgroundlogger "" "whether to install PlaygroundLogger"
install-playgroundsupport "" "whether to install PlaygroundSupport"
darwin-install-extract-symbols "" "whether to extract symbols with dsymutil during installations"
host-target "" "The host target. LLVM, Clang, and Swift will be built for this target. The built LLVM and Clang will be used to compile Swift for the cross-compilation targets. **This argument is required**"
@@ -246,7 +242,6 @@
swiftpm-cmake-options "" "CMake options used for all swiftpm targets"
xctest-cmake-options "" "CMake options used for all xctest targets"
playgroundsupport-cmake-options "" "CMake options used for all playgroundsupport targets"
- playgroundlogger-cmake-options "" "CMake options used for all playgroundlogger targets"
# TODO: Remove this some time later.
user-config-args "" "**Renamed to --extra-cmake-options**: User-supplied arguments to cmake when used to do configuration."
only-execute "all" "Only execute the named action (see implementation)"
@@ -444,14 +439,6 @@
case ${host} in
linux-x86_64)
SWIFT_HOST_VARIANT_ARCH="x86_64"
- playgroundlogger_build_cmd="${PLAYGROUNDLOGGER_SOURCE_DIR}/build.py"
- playgroundlogger_build_options=(
- --swiftc "$(build_directory_bin ${host} swift)"
- --foundation "$(build_directory ${host} foundation)"
- --build-dir "$(build_directory ${host} playgroundlogger)"
- --swift-build-dir "$(build_directory ${host} swift)"
- --$(tolower "${PLAYGROUNDLOGGER_BUILD_TYPE}")
- )
;;
linux-armv6)
SWIFT_HOST_VARIANT_ARCH="armv6"
@@ -499,9 +486,6 @@
swiftpm_bootstrap_options=(
--sysroot="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_TestDriver")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="MacOSX.platform"
;;
iphonesimulator-i386)
xcrun_sdk_name="iphonesimulator"
@@ -517,9 +501,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_iOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="iPhoneSimulator.platform"
;;
iphonesimulator-x86_64)
xcrun_sdk_name="iphonesimulator"
@@ -535,9 +516,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_iOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="iPhoneSimulator.platform"
;;
iphoneos-armv7)
xcrun_sdk_name="iphoneos"
@@ -553,9 +531,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_iOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="iPhoneOS.platform"
;;
iphoneos-armv7s)
xcrun_sdk_name="iphoneos"
@@ -571,9 +546,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_iOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="iPhoneOS.platform"
;;
iphoneos-arm64)
xcrun_sdk_name="iphoneos"
@@ -589,9 +561,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_iOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="iPhoneOS.platform"
;;
appletvsimulator-x86_64)
xcrun_sdk_name="appletvsimulator"
@@ -607,9 +576,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_tvOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="AppleTVSimulator.platform"
;;
appletvos-arm64)
xcrun_sdk_name="appletvos"
@@ -625,9 +591,6 @@
-DCMAKE_CXX_FLAGS="$(cmark_c_flags ${host})"
-DCMAKE_OSX_SYSROOT:PATH="$(xcrun --sdk ${xcrun_sdk_name} --show-sdk-path)"
)
- playgroundlogger_build_cmd="xcodebuild"
- playgroundlogger_build_target=("PlaygroundLogger_tvOS")
- PLAYGROUNDLOGGER_INSTALL_PLATFORM="AppleTVOS.platform"
;;
watchsimulator-i386)
xcrun_sdk_name="watchsimulator"
@@ -1215,13 +1178,7 @@
FOUNDATION_SOURCE_DIR="${WORKSPACE}/swift-corelibs-foundation"
LIBDISPATCH_SOURCE_DIR="${WORKSPACE}/swift-corelibs-libdispatch"
LIBICU_SOURCE_DIR="${WORKSPACE}/icu"
-PLAYGROUNDLOGGER_SOURCE_DIR="${WORKSPACE}/swift-xcode-playground-support/PlaygroundLogger"
-PLAYGROUNDSUPPORT_SOURCE_DIR="${WORKSPACE}/swift-xcode-playground-support/PlaygroundSupport"
-
-if [[ ! "${SKIP_BUILD_PLAYGROUNDLOGGER}" && ! -d ${PLAYGROUNDLOGGER_SOURCE_DIR} ]]; then
- echo "Couldn't find PlaygroundLogger source directory."
- exit 1
-fi
+PLAYGROUNDSUPPORT_SOURCE_DIR="${WORKSPACE}/swift-xcode-playground-support"
if [[ ! "${SKIP_BUILD_PLAYGROUNDSUPPORT}" && ! -d ${PLAYGROUNDSUPPORT_SOURCE_DIR} ]]; then
echo "Couldn't find PlaygroundSupport source directory."
@@ -1268,9 +1225,6 @@
if [[ ! "${SKIP_BUILD_FOUNDATION}" ]] ; then
PRODUCTS=("${PRODUCTS[@]}" foundation)
fi
-if [[ ! "${SKIP_BUILD_PLAYGROUNDLOGGER}" ]] ; then
- PRODUCTS=("${PRODUCTS[@]}" playgroundlogger)
-fi
if [[ ! "${SKIP_BUILD_PLAYGROUNDSUPPORT}" ]] ; then
PRODUCTS=("${PRODUCTS[@]}" playgroundsupport)
fi
@@ -1600,10 +1554,6 @@
;;
libicu)
;;
- playgroundlogger)
- # FIXME: var name for build type
- echo "${root}/${PLAYGROUNDLOGGER_BUILD_TYPE}/bin"
- ;;
playgroundsupport)
echo "${root}/${PLAYGROUNDSUPPORT_BUILD_TYPE}/bin"
;;
@@ -1734,10 +1684,6 @@
;;
libicu)
;;
- playgroundlogger)
- # FIXME: var name
- echo "--config ${PLAYGROUNDLOGGER_BUILD_TYPE}"
- ;;
playgroundsupport)
echo "--config ${PLAYGROUNDSUPPORT_BUILD_TYPE}"
;;
@@ -2620,26 +2566,32 @@
# libicu builds itself and doesn't use cmake
continue
;;
- playgroundlogger)
- PLAYGROUNDLOGGER_BUILD_DIR=$(build_directory ${host} ${product})
- SWIFTC_BIN="$(build_directory_bin ${host} swift)/swiftc"
-
- set -x
- pushd "${PLAYGROUNDLOGGER_SOURCE_DIR}"
- mkdir -p "${PLAYGROUNDLOGGER_BUILD_DIR}"
- "${playgroundlogger_build_cmd}" -configuration "${PLAYGROUNDLOGGER_BUILD_TYPE}" -target "${playgroundlogger_build_target}" install SWIFT_EXEC="${SWIFTC_BIN}" DSTROOT=${build_dir} INSTALL_PATH="/" SKIP_INSTALL=NO
- popd
- { set +x; } 2>/dev/null
- continue
- ;;
playgroundsupport)
- PLAYGROUNDSUPPORT_BUILD_DIR=$(build_directory ${host} ${product})
+ if [[ "$(uname -s)" != "Darwin" ]]; then
+ echo "error: unable to build PlaygroundLogger and PlaygroundSupport on this platform"
+ exit 1
+ fi
+
SWIFTC_BIN="$(build_directory_bin ${host} swift)/swiftc"
set -x
pushd "${PLAYGROUNDSUPPORT_SOURCE_DIR}"
- mkdir -p "${PLAYGROUNDSUPPORT_BUILD_DIR}"
- "xcodebuild" -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -target AllProducts SWIFT_EXEC="${SWIFTC_BIN}" DSTROOT="$(get_host_install_destdir ${host})"
+ if [[ $(not ${SKIP_BUILD_OSX}) ]]; then
+ "xcodebuild" -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-macOS -sdk macosx -arch x86_64 -derivedDataPath "${build_dir}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO
+
+ if [[ $(not ${SKIP_TEST_PLAYGROUNDSUPPORT}) ]]; then
+ # If we're going to end up testing PlaygroundLogger/PlaygroundSupport, then we need to build the tests too.
+ "xcodebuild" -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-Test-PlaygroundLogger-macOS -sdk macosx -arch x86_64 -derivedDataPath "${build_dir}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO BUILD_PLAYGROUNDLOGGER_TESTS=YES
+ fi
+ fi
+
+ if [[ $(not ${SKIP_BUILD_IOS_SIMULATOR}) ]]; then
+ "xcodebuild" -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-iOS -sdk iphonesimulator -arch x86_64 -derivedDataPath "${build_dir}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO
+ fi
+
+ if [[ $(not ${SKIP_BUILD_TVOS_SIMULATOR}) ]]; then
+ "xcodebuild" -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-tvOS -sdk appletvsimulator -arch x86_64 -derivedDataPath "${build_dir}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO
+ fi
popd
{ set +x; } 2>/dev/null
continue
@@ -2963,19 +2915,25 @@
echo "--- Finished tests for ${product} ---"
continue
;;
- playgroundlogger)
- SWIFT_DYLIB_PATH=$(build_directory ${host} swift)/lib/swift/macosx/
- PLAYGROUNDLOGGER_FRAMEWORK_PATH=$(build_directory ${host} ${product})
- set -x
- pushd "${PLAYGROUNDLOGGER_FRAMEWORK_PATH}"
- DYLD_LIBRARY_PATH=$SWIFT_DYLIB_PATH DYLD_FRAMEWORK_PATH=$PLAYGROUNDLOGGER_FRAMEWORK_PATH ./PlaygroundLogger_TestDriver
- popd
- { set +x; } 2>/dev/null
- continue
- ;;
playgroundsupport)
- continue
- ;;
+ if [[ "${SKIP_TEST_PLAYGROUNDSUPPORT}" ]]; then
+ continue
+ fi
+
+ if [[ "${host}" != "macosx"* ]]; then
+ echo "Skipping PlaygroundLogger tests on non-macOS platform"
+ continue
+ fi
+
+ set -x
+ SWIFT_DYLIB_PATH=$(build_directory ${host} swift)/lib/swift/macosx/
+ PLAYGROUNDLOGGER_FRAMEWORK_PATH=$(build_directory ${host} ${product})/DerivedData/Build/Products/${PLAYGROUNDSUPPORT_BUILD_TYPE}
+ pushd "${PLAYGROUNDLOGGER_FRAMEWORK_PATH}"
+ DYLD_LIBRARY_PATH=$SWIFT_DYLIB_PATH DYLD_FRAMEWORK_PATH=$PLAYGROUNDLOGGER_FRAMEWORK_PATH ./PlaygroundLogger_TestDriver
+ popd
+ { set +x; } 2>/dev/null
+ continue
+ ;;
*)
echo "error: unknown product: ${product}"
exit 1
@@ -3271,65 +3229,43 @@
done
continue
;;
- playgroundlogger)
- if [[ -z "${INSTALL_PLAYGROUNDLOGGER}" ]] ; then
+ playgroundsupport)
+ set -x
+ if [[ -z "${INSTALL_PLAYGROUNDSUPPORT}" ]] ; then
continue
fi
if [[ -z "${INSTALL_DESTDIR}" ]] ; then
echo "--install-destdir is required to install products."
exit 1
fi
-
+
echo "--- Installing ${product} ---"
- PLAYGROUNDLOGGER_BUILD_DIR=$(build_directory ${host} playgroundlogger)
- PLAYGROUNDLOGGER_INSTALL_PREFIX="${INSTALL_DESTDIR}"
- # Note that installing directly to /usr/lib/swift usually
- # requires root permissions.
- set -x
+
+ PLAYGROUNDSUPPORT_BUILD_DIR=$(build_directory ${host} ${product})
+
case "$(uname -s)" in
- Linux)
- PLAYGROUNDLOGGER_INSTALL_DIR="$(get_host_install_destdir ${host})/$(get_host_install_prefix ${host})/lib/swift/linux"
- mkdir -p "${PLAYGROUNDLOGGER_INSTALL_DIR}"
- cp -R "${PLAYGROUNDLOGGER_BUILD_DIR}"/libPlaygroundLogger.so "${PLAYGROUNDLOGGER_INSTALL_DIR}"
- ;;
Darwin)
- pushd "${PLAYGROUNDLOGGER_SOURCE_DIR}"
- xcodebuild -target "All Platforms Logger" -configuration Toolchain_${PLAYGROUNDLOGGER_BUILD_TYPE} install SWIFT_EXEC="${SWIFTC_BIN}" DT_TOOLCHAIN_DIR="${TOOLCHAIN_PREFIX}" DSTROOT="$(get_host_install_destdir ${host})"
+ pushd "${PLAYGROUNDSUPPORT_SOURCE_DIR}"
+ if [[ $(not ${SKIP_BUILD_OSX}) ]]; then
+ "xcodebuild" install -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-macOS -sdk macosx -arch x86_64 -derivedDataPath "${PLAYGROUNDSUPPORT_BUILD_DIR}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO DSTROOT="$(get_host_install_destdir ${host})" TOOLCHAIN_INSTALL_DIR="${TOOLCHAIN_PREFIX}" BUILD_PLAYGROUNDLOGGER_TESTS=NO
+ fi
+
+ if [[ $(not ${SKIP_BUILD_IOS_SIMULATOR}) ]]; then
+ "xcodebuild" install -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-iOS -sdk iphonesimulator -arch x86_64 -derivedDataPath "${PLAYGROUNDSUPPORT_BUILD_DIR}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO DSTROOT="$(get_host_install_destdir ${host})" TOOLCHAIN_INSTALL_DIR="${TOOLCHAIN_PREFIX}" BUILD_PLAYGROUNDLOGGER_TESTS=NO
+ fi
+
+ if [[ $(not ${SKIP_BUILD_TVOS_SIMULATOR}) ]]; then
+ "xcodebuild" install -configuration "${PLAYGROUNDSUPPORT_BUILD_TYPE}" -workspace swift-xcode-playground-support.xcworkspace -scheme BuildScript-tvOS -sdk appletvsimulator -arch x86_64 -derivedDataPath "${PLAYGROUNDSUPPORT_BUILD_DIR}"/DerivedData SWIFT_EXEC="${SWIFTC_BIN}" ONLY_ACTIVE_ARCH=NO DSTROOT="$(get_host_install_destdir ${host})" TOOLCHAIN_INSTALL_DIR="${TOOLCHAIN_PREFIX}" BUILD_PLAYGROUNDLOGGER_TESTS=NO
+ fi
popd
continue
;;
*)
- echo "error: --install-playgroundlogger is not supported on this platform"
+ echo "error: --install-playgroundsupport is not supported on this platform"
exit 1
;;
esac
{ set +x; } 2>/dev/null
-
- # As XCTest installation is self-contained, we break early here.
- continue
- ;;
- playgroundsupport)
- set -x
- if [[ -z "${INSTALL_PLAYGROUNDSUPPORT}" ]] ; then
- continue
- fi
- case "$(uname -s)" in
- Linux)
- ;;
- FreeBSD)
- ;;
- CYGWIN_NT-10.0)
- ;;
- Haiku)
- ;;
- Darwin)
- pushd "${PLAYGROUNDSUPPORT_SOURCE_DIR}"
- xcodebuild -target AllProducts -configuration ${PLAYGROUNDSUPPORT_BUILD_TYPE} install SWIFT_EXEC="${SWIFTC_BIN}" DT_TOOLCHAIN_DIR="${TOOLCHAIN_PREFIX}" DSTROOT="$(get_host_install_destdir ${host})"
- popd
- continue
- ;;
- esac
- { set +x; } 2>/dev/null
;;
*)
echo "error: unknown product: ${product}"
diff --git a/utils/build_swift/driver_arguments.py b/utils/build_swift/driver_arguments.py
index 6bee26c..15f40b2 100644
--- a/utils/build_swift/driver_arguments.py
+++ b/utils/build_swift/driver_arguments.py
@@ -138,7 +138,6 @@
args.build_foundation = False
args.build_libdispatch = False
args.build_libicu = False
- args.build_playgroundlogger = False
args.build_playgroundsupport = False
# --skip-{ios,tvos,watchos} or --skip-build-{ios,tvos,watchos} are
@@ -627,11 +626,6 @@
dest='build_libicu',
help='build libicu')
projects_group.add_argument(
- '--playgroundlogger',
- action='store_true',
- dest='build_playgroundlogger',
- help='build playgroundlogger')
- projects_group.add_argument(
'--playgroundsupport',
action='store_true',
dest='build_playgroundsupport',
diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py
index 7acab9a..70c7119 100644
--- a/utils/build_swift/tests/expected_options.py
+++ b/utils/build_swift/tests/expected_options.py
@@ -69,7 +69,6 @@
'build_lldb': False,
'build_ninja': False,
'build_osx': True,
- 'build_playgroundlogger': False,
'build_playgroundsupport': False,
'build_runtime_with_host_compiler': False,
'build_stdlib_deployment_targets': ['all'],
@@ -378,7 +377,6 @@
SetTrueOption('--ios'),
SetTrueOption('--llbuild', dest='build_llbuild'),
SetTrueOption('--lldb', dest='build_lldb'),
- SetTrueOption('--playgroundlogger', dest='build_playgroundlogger'),
SetTrueOption('--playgroundsupport', dest='build_playgroundsupport'),
SetTrueOption('--skip-build'),
SetTrueOption('--swiftpm', dest='build_swiftpm'),
diff --git a/utils/build_swift/tests/test_driver_arguments.py b/utils/build_swift/tests/test_driver_arguments.py
index 8379934..0e276e1 100644
--- a/utils/build_swift/tests/test_driver_arguments.py
+++ b/utils/build_swift/tests/test_driver_arguments.py
@@ -590,7 +590,6 @@
self.assertFalse(namespace.build_libicu)
self.assertFalse(namespace.build_lldb)
self.assertFalse(namespace.build_llbuild)
- self.assertFalse(namespace.build_playgroundlogger)
self.assertFalse(namespace.build_playgroundsupport)
self.assertFalse(namespace.build_swiftpm)
self.assertFalse(namespace.build_xctest)
diff --git a/utils/static-executable-args.lnk b/utils/static-executable-args.lnk
index 2c158a4..0d34ebd 100644
--- a/utils/static-executable-args.lnk
+++ b/utils/static-executable-args.lnk
@@ -1,6 +1,5 @@
-static
-lswiftCore
--lswiftImageInspectionStatic
-Xlinker
--defsym=__import_pthread_self=pthread_self
-Xlinker
diff --git a/validation-test/compiler_crashers_2_fixed/0144-sr7072.swift b/validation-test/compiler_crashers_2_fixed/0144-sr7072.swift
new file mode 100644
index 0000000..a9d95a7
--- /dev/null
+++ b/validation-test/compiler_crashers_2_fixed/0144-sr7072.swift
@@ -0,0 +1,31 @@
+// RUN: %target-swift-frontend %s -emit-sil -o - | %FileCheck %s
+
+public final class GenClass<Element: Cl> {
+ public subscript(index: Int) -> Element {
+ get { return unsafeBitCast(0, to: Element.self) }
+ }
+}
+
+public protocol Proto { }
+
+public struct Iter<Element: Proto>: IteratorProtocol {
+ public mutating func next() -> Element? { return nil }
+}
+
+extension GenClass: RandomAccessCollection {
+ public func makeIterator() -> Iter<Element> { return Iter() }
+ public var startIndex: Int { return 0 }
+ public var endIndex: Int { return 0 }
+}
+
+open class Cl: Proto { }
+
+class Bar: Cl {
+ var x: Int?
+}
+
+// CHECK-LABEL: sil hidden @_T04main5crashSbAA8GenClassCyAA3BarCG4bars_tF
+func crash(bars: GenClass<Bar>) -> Bool {
+ // CHECK: apply [[FN:%.*]]<Bar, [Bar]>
+ return Array(bars.filter { $0.x == nil }).isEmpty
+}
diff --git a/validation-test/stdlib/Dictionary.swift b/validation-test/stdlib/Dictionary.swift
index 89cc7d6..5d2f57e 100644
--- a/validation-test/stdlib/Dictionary.swift
+++ b/validation-test/stdlib/Dictionary.swift
@@ -3154,6 +3154,26 @@
}
}
+DictionaryTestSuite.test("BridgedFromObjC.Nonverbatim.StringEqualityMismatch") {
+ // NSString's isEqual(_:) implementation is stricter than Swift's String, so
+ // Dictionary values bridged over from Objective-C may have duplicate keys.
+ // rdar://problem/35995647
+ let cafe1 = "Cafe\u{301}" as NSString
+ let cafe2 = "Café" as NSString
+
+ let nsd = NSMutableDictionary()
+ nsd.setObject(42, forKey: cafe1)
+ nsd.setObject(23, forKey: cafe2)
+ expectEqual(2, nsd.count)
+ expectTrue((42 as NSNumber).isEqual(nsd.object(forKey: cafe1)))
+ expectTrue((23 as NSNumber).isEqual(nsd.object(forKey: cafe2)))
+
+ let d = convertNSDictionaryToDictionary(nsd) as [String: Int]
+ expectEqual(1, d.count)
+ expectEqual(d["Cafe\u{301}"], d["Café"])
+ let v = d["Café"]
+ expectTrue(v == 42 || v == 23)
+}
//===---
// Dictionary -> NSDictionary bridging tests.
diff --git a/validation-test/stdlib/Set.swift b/validation-test/stdlib/Set.swift
index 2b507e8..fa1eb78 100644
--- a/validation-test/stdlib/Set.swift
+++ b/validation-test/stdlib/Set.swift
@@ -2152,6 +2152,28 @@
}
}
+SetTestSuite.test("BridgedFromObjC.Nonverbatim.StringEqualityMismatch") {
+ // NSString's isEqual(_:) implementation is stricter than Swift's String, so
+ // Set values bridged over from Objective-C may have duplicate keys.
+ // rdar://problem/35995647
+ let cafe1 = "Cafe\u{301}" as NSString
+ let cafe2 = "Café" as NSString
+
+ let nsset = NSMutableSet()
+ nsset.add(cafe1)
+ expectTrue(nsset.contains(cafe1))
+ expectFalse(nsset.contains(cafe2))
+ nsset.add(cafe2)
+ expectEqual(2, nsset.count)
+ expectTrue(nsset.contains(cafe1))
+ expectTrue(nsset.contains(cafe2))
+
+ let s: Set<String> = convertNSSetToSet(nsset)
+ expectEqual(1, s.count)
+ expectTrue(s.contains("Cafe\u{301}"))
+ expectTrue(s.contains("Café"))
+ expectTrue(Array(s) == ["Café"])
+}
//===---
// Dictionary -> NSDictionary bridging tests.