Skip to content

Commit a5c34af

Browse files
authored
Merge pull request #58706 from CodaFi/return-to-sender
Add a test for a corner case missed by #41978.
2 parents 7c73a28 + 88ec6cb commit a5c34af

File tree

5 files changed

+25
-17
lines changed

5 files changed

+25
-17
lines changed

lib/AST/Expr.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,6 +1906,12 @@ Expr *AutoClosureExpr::getUnwrappedCurryThunkExpr() const {
19061906
return expr;
19071907
};
19081908

1909+
auto maybeUnwrapConversions = [](Expr *expr) {
1910+
if (auto *covariantReturn = dyn_cast<CovariantReturnConversionExpr>(expr))
1911+
expr = covariantReturn->getSubExpr();
1912+
return expr;
1913+
};
1914+
19091915
switch (getThunkKind()) {
19101916
case AutoClosureExpr::Kind::None:
19111917
case AutoClosureExpr::Kind::AsyncLet:
@@ -1916,6 +1922,7 @@ Expr *AutoClosureExpr::getUnwrappedCurryThunkExpr() const {
19161922
body = body->getSemanticsProvidingExpr();
19171923
body = maybeUnwrapOpenExistential(body);
19181924
body = maybeUnwrapOptionalEval(body);
1925+
body = maybeUnwrapConversions(body);
19191926

19201927
if (auto *outerCall = dyn_cast<ApplyExpr>(body)) {
19211928
return outerCall->getFn();
@@ -1934,6 +1941,7 @@ Expr *AutoClosureExpr::getUnwrappedCurryThunkExpr() const {
19341941
innerBody = innerBody->getSemanticsProvidingExpr();
19351942
innerBody = maybeUnwrapOpenExistential(innerBody);
19361943
innerBody = maybeUnwrapOptionalEval(innerBody);
1944+
innerBody = maybeUnwrapConversions(innerBody);
19371945

19381946
if (auto *outerCall = dyn_cast<ApplyExpr>(innerBody)) {
19391947
if (auto *innerCall = dyn_cast<ApplyExpr>(outerCall->getFn())) {

test/ClangImporter/objc_parse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ func ivars(_ hive: Hive) {
315315
hive.queen.description() // expected-error{{value of type 'Hive' has no member 'queen'}}
316316
}
317317

318-
class NSObjectable : NSObjectProtocol {
318+
class NSObjectable : NSObjectProtocol { // expected-error {{cannot declare conformance to 'NSObjectProtocol' in Swift; 'NSObjectable' should inherit 'NSObject' instead}}
319319
@objc var description : String { return "" }
320320
@objc(conformsToProtocol:) func conforms(to _: Protocol) -> Bool { return false }
321321
@objc(isKindOfClass:) func isKind(of aClass: AnyClass) -> Bool { return false }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %target-swift-ide-test(mock-sdk: %clang-importer-sdk) -enable-objc-interop -print-indexed-symbols -source-filename %s | %FileCheck %s
2+
// REQUIRES: objc_interop
3+
4+
import Foundation
5+
6+
@objc
7+
class Foo: NSObject {
8+
// CHECK-DAG: constructor/Swift | init(object:)
9+
init(object: Any?) {}
10+
}
11+
12+
extension Foo {
13+
// CHECK-DAG: static-property/Swift | boom
14+
static let boom = Foo(object: self)
15+
}

test/Inputs/clang-importer-sdk/usr/include/objc/NSObject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@class NSString;
77

88
@protocol NSObject
9+
- (instancetype)self;
910
@property (readonly, copy) NSString *description;
1011
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
1112
- (Class)class;

test/PrintAsObjC/classes.swift

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -113,22 +113,6 @@ class ClassWithCustomName2 {}
113113
@objc(CustomNameSub)
114114
class ClassWithCustomNameSub : ClassWithCustomName {}
115115

116-
117-
// CHECK-LABEL: @interface ClassWithNSObjectProtocol <NSObject>
118-
// CHECK-NEXT: @property (nonatomic, readonly, copy) NSString * _Nonnull description;
119-
// CHECK-NEXT: - (BOOL)conformsToProtocol:(Protocol * _Nonnull)_ SWIFT_WARN_UNUSED_RESULT;
120-
// CHECK-NEXT: - (BOOL)isKindOfClass:(Class _Nonnull)aClass SWIFT_WARN_UNUSED_RESULT;
121-
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
122-
// CHECK-NEXT: @end
123-
@objc @objcMembers class ClassWithNSObjectProtocol : NSObjectProtocol {
124-
@objc var description: String { return "me" }
125-
@objc(conformsToProtocol:)
126-
func conforms(to _: Protocol) -> Bool { return false }
127-
128-
@objc(isKindOfClass:)
129-
func isKind(of aClass: AnyClass) -> Bool { return false }
130-
}
131-
132116
// CHECK-LABEL: @interface DiscardableResult : NSObject
133117
// CHECK-NEXT: - (NSInteger)nonDiscardable:(NSInteger)x SWIFT_WARN_UNUSED_RESULT;
134118
// CHECK-NEXT: - (NSInteger)discardable:(NSInteger)x;

0 commit comments

Comments
 (0)