Merge pull request #14062 from benlangmuir/disable-cursor-test-41
[4.1] [test-only] Disable cursor_no_cancel test that crashes occassionaly in CI
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index 540f55b..7b79351 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -4182,8 +4182,8 @@
return false;
}
-/// Return true if this stored property needs to be accessed with getters and
-/// setters for Objective-C.
+/// Return true if this stored property has a getter and
+/// setter that are accessible from Objective-C.
bool AbstractStorageDecl::hasForeignGetterAndSetter() const {
if (auto override = getOverriddenDecl())
return override->hasForeignGetterAndSetter();
@@ -4204,9 +4204,11 @@
// Imported accessors are foreign and only have objc entry points.
if (hasClangNode())
return true;
- // Otherwise, we only dispatch by @objc if the declaration is dynamic or
- // NSManaged.
- return isDynamic() || getAttrs().hasAttribute<NSManagedAttr>();
+ // Otherwise, we only dispatch by @objc if the declaration is dynamic,
+ // NSManaged, or dispatched through an ObjC protocol.
+ return isDynamic()
+ || getAttrs().hasAttribute<NSManagedAttr>()
+ || (isa<ProtocolDecl>(getDeclContext()) && isProtocolRequirement());
}
diff --git a/lib/Sema/CSSimplify.cpp b/lib/Sema/CSSimplify.cpp
index b63727a..41aaa90 100644
--- a/lib/Sema/CSSimplify.cpp
+++ b/lib/Sema/CSSimplify.cpp
@@ -3938,8 +3938,11 @@
if (!choices[i].isDecl()) {
return SolutionKind::Error;
}
+ auto storage = dyn_cast<AbstractStorageDecl>(choices[i].getDecl());
+ if (!storage) {
+ return SolutionKind::Error;
+ }
- auto storage = cast<AbstractStorageDecl>(choices[i].getDecl());
if (!storage->isSettable(DC)) {
// A non-settable component makes the key path read-only, unless
// a reference-writable component shows up later.
diff --git a/stdlib/public/core/FlatMap.swift b/stdlib/public/core/FlatMap.swift
index 43f37f7..ff1bad5 100644
--- a/stdlib/public/core/FlatMap.swift
+++ b/stdlib/public/core/FlatMap.swift
@@ -60,7 +60,8 @@
///
/// - Complexity: O(1)
@inline(__always)
- @available(*, deprecated, renamed: "compactMap(_:)")
+ @available(*, deprecated, renamed: "compactMap(_:)",
+ message: "Please use compactMap(_:) for the case where closure returns an optional value")
public func flatMap<ElementOfResult>(
_ transform: @escaping (Elements.Element) -> ElementOfResult?
) -> LazyMapSequence<
@@ -123,7 +124,8 @@
/// collection as its argument and returns an optional value.
///
/// - Complexity: O(1)
- @available(*, deprecated, renamed: "compactMap(_:)")
+ @available(*, deprecated, renamed: "compactMap(_:)",
+ message: "Please use compactMap(_:) for the case where closure returns an optional value")
@_inlineable // FIXME(sil-serialize-all)
public func flatMap<ElementOfResult>(
_ transform: @escaping (Elements.Element) -> ElementOfResult?
diff --git a/stdlib/public/core/SequenceAlgorithms.swift.gyb b/stdlib/public/core/SequenceAlgorithms.swift.gyb
index f18ee13..3be97b0 100644
--- a/stdlib/public/core/SequenceAlgorithms.swift.gyb
+++ b/stdlib/public/core/SequenceAlgorithms.swift.gyb
@@ -783,7 +783,8 @@
/// - Complexity: O(*m* + *n*), where *m* is the length of this sequence
/// and *n* is the length of the result.
@inline(__always)
- @available(*, deprecated, renamed: "compactMap(_:)")
+ @available(*, deprecated, renamed: "compactMap(_:)",
+ message: "Please use compactMap(_:) for the case where closure returns an optional value")
public func flatMap<ElementOfResult>(
_ transform: (Element) throws -> ElementOfResult?
) rethrows -> [ElementOfResult] {
diff --git a/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb b/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
index f8404ea..54a9b46 100644
--- a/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
+++ b/stdlib/public/core/StringRangeReplaceableCollection.swift.gyb
@@ -448,7 +448,8 @@
return try _compactMap(transform)
}
- @available(*, deprecated, renamed: "compactMap(_:)")
+ @available(*, deprecated, renamed: "compactMap(_:)",
+ message: "Please use compactMap(_:) for the case where closure returns an optional value")
@inline(__always)
public func flatMap(
_ transform: (Element) throws -> String?
diff --git a/test/SILGen/keypaths_objc.swift b/test/SILGen/keypaths_objc.swift
index 90b29fc..c6d027f 100644
--- a/test/SILGen/keypaths_objc.swift
+++ b/test/SILGen/keypaths_objc.swift
@@ -76,3 +76,15 @@
_ = \NSObject.dynamic
}
+
+@objc protocol ObjCProto {
+ var objcRequirement: Int { get set }
+}
+
+// CHECK-LABEL: sil hidden @{{.*}}ProtocolRequirement
+func objcProtocolRequirement<T: ObjCProto>(_: T) {
+ // CHECK: keypath {{.*}} id #ObjCProto.objcRequirement!getter.1.foreign
+ _ = \T.objcRequirement
+ // CHECK: keypath {{.*}} id #ObjCProto.objcRequirement!getter.1.foreign
+ _ = \ObjCProto.objcRequirement
+}
diff --git a/test/expr/unary/keypath/keypath.swift b/test/expr/unary/keypath/keypath.swift
index 2498292..e7e6f63 100644
--- a/test/expr/unary/keypath/keypath.swift
+++ b/test/expr/unary/keypath/keypath.swift
@@ -485,6 +485,20 @@
}
}
+// SR-6744
+func sr6744() {
+ struct ABC {
+ let value: Int
+ func value(adding i: Int) -> Int { return value + i }
+ }
+
+ let abc = ABC(value: 0)
+ func get<T>(for kp: KeyPath<ABC, T>) -> T {
+ return abc[keyPath: kp]
+ }
+ _ = get(for: \.value)
+}
+
func testSyntaxErrors() { // expected-note{{}}
_ = \. ; // expected-error{{expected member name following '.'}}
_ = \.a ;
diff --git a/test/stdlib/FlatMapDeprecation.swift b/test/stdlib/FlatMapDeprecation.swift
index 4567b2b..8408733 100644
--- a/test/stdlib/FlatMapDeprecation.swift
+++ b/test/stdlib/FlatMapDeprecation.swift
@@ -3,30 +3,30 @@
func flatMapOnSequence<
S : Sequence
>(xs: S, f: (S.Element) -> S.Element?) {
- _ = xs.flatMap(f) // expected-warning {{deprecated}} expected-note {{compactMap}}
+ _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}
func flatMapOnLazySequence<
S : LazySequenceProtocol
>(xs: S, f: (S.Element) -> S.Element?) {
- _ = xs.flatMap(f) // expected-warning {{deprecated}} expected-note {{compactMap}}
+ _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}
func flatMapOnLazyCollection<
C : LazyCollectionProtocol
>(xs: C, f: (C.Element) -> C.Element?) {
- _ = xs.flatMap(f) // expected-warning {{deprecated}} expected-note {{compactMap}}
+ _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}
func flatMapOnLazyBidirectionalCollection<
C : LazyCollectionProtocol & BidirectionalCollection
>(xs: C, f: (C.Element) -> C.Element?)
where C.Elements : BidirectionalCollection {
- _ = xs.flatMap(f) // expected-warning {{deprecated}} expected-note {{compactMap}}
+ _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}
func flatMapOnCollectinoOfStrings<
C : Collection
>(xs: C, f: (C.Element) -> String?) {
- _ = xs.flatMap(f) // expected-warning {{deprecated}} expected-note {{compactMap}}
+ _ = xs.flatMap(f) // expected-warning {{'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value}} expected-note {{compactMap}}
}