Skip to content

Commit a2aaf2c

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 a2aaf2c

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7178,7 +7178,7 @@ void SwiftDeclConverter::recordObjCOverride(AbstractFunctionDecl *decl) {
71787178
// Dig out the Objective-C superclass.
71797179
SmallVector<ValueDecl *, 4> results;
71807180
superDecl->lookupQualified(superDecl, DeclNameRef(decl->getName()),
7181-
decl->getLoc(), NL_QualifiedDefault,
7181+
decl->getLoc(), NL_QualifiedDefault | NL_IgnoreMissingImports,
71827182
results);
71837183
for (auto member : results) {
71847184
if (member->getKind() != decl->getKind() ||
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)