Skip to content

Commit 7ad7e22

Browse files
authored
Merge pull request #80976 from tshortli/revert-member-import-visibility-objc-overloads-in-extensions-6.2
[6.2] Revert "AST: Filter out some Obj-C overrides when MemberImportVisibility is enabled."
2 parents 9e7257c + a020cf8 commit 7ad7e22

18 files changed

+17
-409
lines changed

lib/AST/NameLookup.cpp

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2388,8 +2388,6 @@ static bool isAcceptableLookupResult(const DeclContext *dc, NLOptions options,
23882388
ValueDecl *decl,
23892389
bool onlyCompleteObjectInits,
23902390
bool requireImport) {
2391-
auto &ctx = dc->getASTContext();
2392-
23932391
// Filter out designated initializers, if requested.
23942392
if (onlyCompleteObjectInits) {
23952393
if (auto ctor = dyn_cast<ConstructorDecl>(decl)) {
@@ -2407,43 +2405,19 @@ static bool isAcceptableLookupResult(const DeclContext *dc, NLOptions options,
24072405
}
24082406

24092407
// Check access.
2410-
if (!(options & NL_IgnoreAccessControl) && !ctx.isAccessControlDisabled()) {
2408+
if (!(options & NL_IgnoreAccessControl) &&
2409+
!dc->getASTContext().isAccessControlDisabled()) {
24112410
bool allowUsableFromInline = options & NL_IncludeUsableFromInline;
24122411
if (!decl->isAccessibleFrom(dc, /*forConformance*/ false,
24132412
allowUsableFromInline))
24142413
return false;
24152414
}
24162415

2417-
if (requireImport) {
2418-
// Check that there is some import in the originating context that makes
2419-
// this decl visible.
2420-
if (!(options & NL_IgnoreMissingImports)) {
2421-
if (!dc->isDeclImported(decl))
2422-
return false;
2423-
}
2424-
2425-
// Unlike in Swift, Obj-C allows method overrides to be declared in
2426-
// extensions (categories), even outside of the module that defines the
2427-
// type that is being extended. When MemberImportVisibility is enabled,
2428-
// if these overrides are not filtered out they can hijack name
2429-
// lookup and cause the compiler to insist that the module that defines
2430-
// the extension be imported, contrary to developer expectations.
2431-
//
2432-
// Filter results belonging to these extensions out, even when ignoring
2433-
// missing imports, if we're in a context that requires imports to access
2434-
// member declarations.
2435-
if (decl->getOverriddenDecl()) {
2436-
if (auto *extension = dyn_cast<ExtensionDecl>(decl->getDeclContext())) {
2437-
if (auto *nominal = extension->getExtendedNominal()) {
2438-
auto extensionMod = extension->getModuleContext();
2439-
auto nominalMod = nominal->getModuleContext();
2440-
if (!extensionMod->isSameModuleLookingThroughOverlays(nominalMod) &&
2441-
!dc->isDeclImported(extension))
2442-
return false;
2443-
}
2444-
}
2445-
}
2446-
}
2416+
// Check that there is some import in the originating context that makes this
2417+
// decl visible.
2418+
if (requireImport && !(options & NL_IgnoreMissingImports))
2419+
if (!dc->isDeclImported(decl))
2420+
return false;
24472421

24482422
// Check that it has the appropriate ABI role.
24492423
if (!ABIRoleInfo(decl).matchesOptions(options))

test/NameLookup/Inputs/MemberImportVisibility/Categories_A.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
@import Foundation;
22

3-
@interface Base
4-
- (void)overriddenInOverlayForA __attribute__((deprecated("Categories_A.h")));
5-
- (void)overriddenInOverlayForB __attribute__((deprecated("Categories_A.h")));
6-
- (void)overriddenInOverlayForC __attribute__((deprecated("Categories_A.h")));
7-
- (void)overriddenInSubclassInOverlayForC __attribute__((deprecated("Categories_A.h")));
8-
@end
9-
10-
@interface X : Base
3+
@interface X
114
@end
125

136
@interface X (A)

test/NameLookup/Inputs/MemberImportVisibility/Categories_A.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,4 @@
33
extension X {
44
public func fromOverlayForA() {}
55
@objc public func fromOverlayForAObjC() {}
6-
7-
@available(*, deprecated, message: "Categories_A.swift")
8-
public override func overriddenInOverlayForA() {}
96
}

test/NameLookup/Inputs/MemberImportVisibility/Categories_B.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,4 @@
33
extension X {
44
public func fromOverlayForB() {}
55
@objc public func fromOverlayForBObjC() {}
6-
7-
@available(*, deprecated, message: "Categories_B.swift")
8-
public override func overriddenInOverlayForB() {}
96
}

test/NameLookup/Inputs/MemberImportVisibility/Categories_C.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,3 @@
33
@interface X (C)
44
- (void)fromC;
55
@end
6-
7-
@interface SubclassFromC : X
8-
- (instancetype)init;
9-
@end

test/NameLookup/Inputs/MemberImportVisibility/Categories_C.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,4 @@
33
extension X {
44
public func fromOverlayForC() {}
55
@objc public func fromOverlayForCObjC() {}
6-
7-
@available(*, deprecated, message: "Categories_C.swift")
8-
public override func overriddenInOverlayForC() {}
9-
}
10-
11-
extension SubclassFromC {
12-
@available(*, deprecated, message: "Categories_C.swift")
13-
public override func overriddenInSubclassInOverlayForC() {}
146
}
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
import Categories_C
22
import Categories_D.Submodule
3-
4-
public func makeSubclassFromC() -> SubclassFromC { SubclassFromC() }

test/NameLookup/Inputs/MemberImportVisibility/ObjCOverloads/Branch.h

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/NameLookup/Inputs/MemberImportVisibility/ObjCOverloads/Fruit.h

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/NameLookup/Inputs/MemberImportVisibility/ObjCOverloads/Leaf.h

Lines changed: 0 additions & 14 deletions
This file was deleted.

test/NameLookup/Inputs/MemberImportVisibility/ObjCOverloads/Root.h

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/NameLookup/Inputs/MemberImportVisibility/ObjCOverloads/module.modulemap

Lines changed: 0 additions & 19 deletions
This file was deleted.

test/NameLookup/Inputs/MemberImportVisibility/members_A.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public enum EnumInA {
3535
}
3636

3737
open class BaseClassInA {
38+
public init() {}
3839
open func methodInA() {}
39-
open func overriddenMethod() {}
4040
}
4141

4242
public protocol ProtocolInA {

test/NameLookup/Inputs/MemberImportVisibility/members_B.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ package enum EnumInB_package {
3737

3838
open class DerivedClassInB: BaseClassInA {
3939
open func methodInB() {}
40-
open override func overriddenMethod() {}
4140
}
4241

4342
extension ProtocolInA {

test/NameLookup/Inputs/MemberImportVisibility/members_C.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ public enum EnumInC {
3131

3232
open class DerivedClassInC: DerivedClassInB {
3333
open func methodInC() {}
34-
open override func overriddenMethod() {}
35-
public func asDerivedClassInB() -> DerivedClassInB { return self }
3634
}
3735

3836
extension ProtocolInA {

test/NameLookup/members_transitive.swift

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// REQUIRES: swift_feature_MemberImportVisibility
1010

1111
import members_C
12-
// expected-member-visibility-note 18{{add import of module 'members_B'}}{{1-1=internal import members_B\n}}
12+
// expected-member-visibility-note 16{{add import of module 'members_B'}}{{1-1=internal import members_B\n}}
1313

1414

1515
func testExtensionMembers(x: X, y: Y<Z>) {
@@ -96,22 +96,8 @@ class DerivedFromClassInC: DerivedClassInC {
9696

9797
struct ConformsToProtocolInA: ProtocolInA {} // expected-member-visibility-error{{type 'ConformsToProtocolInA' does not conform to protocol 'ProtocolInA'}} expected-member-visibility-note {{add stubs for conformance}}
9898

99-
func testInheritedMethods(
100-
a: BaseClassInA,
101-
c: DerivedClassInC,
102-
) {
103-
let b = c.asDerivedClassInB()
104-
105-
a.methodInA()
106-
b.methodInA()
107-
c.methodInA()
108-
109-
b.methodInB() // expected-member-visibility-error{{instance method 'methodInB()' is not available due to missing import of defining module 'members_B'}}
110-
c.methodInB() // expected-member-visibility-error{{instance method 'methodInB()' is not available due to missing import of defining module 'members_B'}}
111-
112-
c.methodInC()
113-
114-
a.overriddenMethod()
115-
b.overriddenMethod() // expected-member-visibility-error{{instance method 'overriddenMethod()' is not available due to missing import of defining module 'members_B'}}
116-
c.overriddenMethod()
99+
func testDerivedMethodAccess() {
100+
DerivedClassInC().methodInC()
101+
DerivedClassInC().methodInB() // expected-member-visibility-error{{instance method 'methodInB()' is not available due to missing import of defining module 'members_B'}}
102+
DerivedFromClassInC().methodInB()
117103
}

test/NameLookup/members_transitive_objc.swift

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
// RUN: %target-swift-frontend -emit-module -I %t -I %S/Inputs/MemberImportVisibility -o %t %S/Inputs/MemberImportVisibility/Categories_B.swift
44
// RUN: %target-swift-frontend -emit-module -I %t -I %S/Inputs/MemberImportVisibility -o %t %S/Inputs/MemberImportVisibility/Categories_C.swift
55
// RUN: %target-swift-frontend -emit-module -I %t -I %S/Inputs/MemberImportVisibility -o %t %S/Inputs/MemberImportVisibility/Categories_E.swift
6-
// RUN: %target-swift-frontend -typecheck %s -I %t -I %S/Inputs/MemberImportVisibility -import-objc-header %S/Inputs/MemberImportVisibility/Bridging.h -verify -swift-version 5 -verify-additional-prefix no-member-visibility-
7-
// RUN: %target-swift-frontend -typecheck %s -I %t -I %S/Inputs/MemberImportVisibility -import-objc-header %S/Inputs/MemberImportVisibility/Bridging.h -verify -swift-version 6 -verify-additional-prefix no-member-visibility-
6+
// RUN: %target-swift-frontend -typecheck %s -I %t -I %S/Inputs/MemberImportVisibility -import-objc-header %S/Inputs/MemberImportVisibility/Bridging.h -verify -swift-version 5
7+
// RUN: %target-swift-frontend -typecheck %s -I %t -I %S/Inputs/MemberImportVisibility -import-objc-header %S/Inputs/MemberImportVisibility/Bridging.h -verify -swift-version 6
88
// RUN: %target-swift-frontend -typecheck %s -I %t -I %S/Inputs/MemberImportVisibility -import-objc-header %S/Inputs/MemberImportVisibility/Bridging.h -verify -swift-version 5 -enable-upcoming-feature MemberImportVisibility -verify-additional-prefix member-visibility-
99

1010
// REQUIRES: objc_interop
@@ -13,43 +13,30 @@
1313
import Categories_B
1414
import Categories_E
1515

16-
// expected-member-visibility-note@-1 3 {{add import of module 'Categories_C'}}{{1-1=internal import Categories_C\n}}
16+
// expected-member-visibility-note@-1 2 {{add import of module 'Categories_C'}}{{1-1=internal import Categories_C\n}}
1717
// expected-member-visibility-note@-2 {{add import of module 'Categories_D'}}{{1-1=internal import Categories_D\n}}
1818
func test(x: X) {
1919
x.fromA()
2020
x.fromOverlayForA()
21-
x.overriddenInOverlayForA() // expected-warning {{'overriddenInOverlayForA()' is deprecated: Categories_A.swift}}
2221
x.fromB()
2322
x.fromOverlayForB()
24-
x.overriddenInOverlayForB() // expected-warning {{'overriddenInOverlayForB()' is deprecated: Categories_B.swift}}
2523
x.fromC() // expected-member-visibility-error {{instance method 'fromC()' is not available due to missing import of defining module 'Categories_C'}}
2624
x.fromOverlayForC() // expected-member-visibility-error {{instance method 'fromOverlayForC()' is not available due to missing import of defining module 'Categories_C'}}
27-
x.overriddenInOverlayForC()
28-
// expected-no-member-visibility-warning@-1 {{'overriddenInOverlayForC()' is deprecated: Categories_C.swift}}
29-
// expected-member-visibility-warning@-2 {{'overriddenInOverlayForC()' is deprecated: Categories_A.h}}
3025
x.fromSubmoduleOfD() // expected-member-visibility-error {{instance method 'fromSubmoduleOfD()' is not available due to missing import of defining module 'Categories_D'}}
3126
x.fromBridgingHeader()
3227
x.overridesCategoryMethodOnNSObject()
33-
34-
let subclassFromC = makeSubclassFromC()
35-
subclassFromC.overriddenInSubclassInOverlayForC()
36-
// expected-warning@-1 {{'overriddenInSubclassInOverlayForC()' is deprecated: Categories_C.swift}}
37-
// expected-member-visibility-error@-2 {{instance method 'overriddenInSubclassInOverlayForC()' is not available due to missing import of defining module 'Categories_C'}}
3828
}
3929

4030
func testAnyObject(a: AnyObject) {
4131
a.fromA()
4232
a.fromOverlayForAObjC()
43-
a.overriddenInOverlayForA() // expected-warning {{'overriddenInOverlayForA()' is deprecated: Categories_A.h}}
4433
a.fromB()
4534
a.fromOverlayForBObjC()
46-
a.overriddenInOverlayForB() // expected-warning {{'overriddenInOverlayForB()' is deprecated: Categories_A.h}}
4735
// FIXME: Better diagnostics?
4836
// Name lookup for AnyObject already ignored transitive imports, so
4937
// `MemberImportVisibility` has no effect on these diagnostics.
5038
a.fromC() // expected-error {{value of type 'AnyObject' has no member 'fromC'}}
5139
a.fromOverlayForCObjC() // expected-error {{value of type 'AnyObject' has no member 'fromOverlayForCObjC'}}
52-
a.overriddenInOverlayForC() // expected-warning {{'overriddenInOverlayForC()' is deprecated: Categories_A.h}}
5340
a.fromBridgingHeader()
5441
a.overridesCategoryMethodOnNSObject()
5542
}

0 commit comments

Comments
 (0)