Skip to content

Commit 9334a02

Browse files
committed
ClangImporter: Ignore missing imports in SwiftDeclConverter::recordObjCOverride().
`recordObjCOverride()` records semantic overrides for imported Obj-C methods. Since these methods are imported from a different language, it doesn't make sense to enforce Swift's member import visibility rules when performing lookups to find overridden methods. Doing so caused the Constrain Solver to lack important information needed to eliminate overloads, resulting in erroneous ambiguities. Resolves rdar://141636723.
1 parent 51cce0d commit 9334a02

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7177,9 +7177,9 @@ void SwiftDeclConverter::recordObjCOverride(AbstractFunctionDecl *decl) {
71777177
return;
71787178
// Dig out the Objective-C superclass.
71797179
SmallVector<ValueDecl *, 4> results;
7180-
superDecl->lookupQualified(superDecl, DeclNameRef(decl->getName()),
7181-
decl->getLoc(), NL_QualifiedDefault,
7182-
results);
7180+
superDecl->lookupQualified(
7181+
superDecl, DeclNameRef(decl->getName()), decl->getLoc(),
7182+
NL_QualifiedDefault | NL_IgnoreMissingImports, results);
71837183
for (auto member : results) {
71847184
if (member->getKind() != decl->getKind() ||
71857185
member->isInstanceMember() != decl->isInstanceMember() ||
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
@import Categories_A;
22

3+
@interface NSObject (BridgingHeader)
4+
- (void)overridesCategoryMethodOnNSObject;
5+
@end
6+
37
@interface X (BridgingHeader)
48
- (void)fromBridgingHeader;
9+
- (void)overridesCategoryMethodOnNSObject;
510
@end
611

712
struct StructInBridgingHeader {
813
int member;
914
};
15+
16+
@interface ObjectInBridgingHeader : NSObject
17+
- (void)overridesCategoryMethodOnNSObject;
18+
@end

test/NameLookup/members_transitive_objc.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func test(x: X) {
2424
x.fromOverlayForC() // expected-member-visibility-error {{instance method 'fromOverlayForC()' is not available due to missing import of defining module 'Categories_C'}}
2525
x.fromSubmoduleOfD() // expected-member-visibility-error {{instance method 'fromSubmoduleOfD()' is not available due to missing import of defining module 'Categories_D'}}
2626
x.fromBridgingHeader()
27+
x.overridesCategoryMethodOnNSObject()
2728
}
2829

2930
func testAnyObject(a: AnyObject) {
@@ -37,6 +38,7 @@ func testAnyObject(a: AnyObject) {
3738
a.fromC() // expected-error {{value of type 'AnyObject' has no member 'fromC'}}
3839
a.fromOverlayForCObjC() // expected-error {{value of type 'AnyObject' has no member 'fromOverlayForCObjC'}}
3940
a.fromBridgingHeader()
41+
a.overridesCategoryMethodOnNSObject()
4042
}
4143

4244
extension StructInBridgingHeader {
@@ -48,3 +50,9 @@ extension StructInBridgingHeader {
4850
return member
4951
}
5052
}
53+
54+
extension ObjectInBridgingHeader {
55+
func test() {
56+
overridesCategoryMethodOnNSObject()
57+
}
58+
}

0 commit comments

Comments
 (0)