Skip to content

Commit 57cb93a

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 89619f4 commit 57cb93a

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
@@ -7165,9 +7165,9 @@ void SwiftDeclConverter::recordObjCOverride(AbstractFunctionDecl *decl) {
71657165
return;
71667166
// Dig out the Objective-C superclass.
71677167
SmallVector<ValueDecl *, 4> results;
7168-
superDecl->lookupQualified(superDecl, DeclNameRef(decl->getName()),
7169-
decl->getLoc(), NL_QualifiedDefault,
7170-
results);
7168+
superDecl->lookupQualified(
7169+
superDecl, DeclNameRef(decl->getName()), decl->getLoc(),
7170+
NL_QualifiedDefault | NL_IgnoreMissingImports, results);
71717171
for (auto member : results) {
71727172
if (member->getKind() != decl->getKind() ||
71737173
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)