Skip to content

Commit aa4a2b9

Browse files
committed
[CSOptimizer] MemberImportVisibility: Don't consider overloads that come from implicit imports
Ignore declarations that come from implicitly imported modules when `MemberImportVisibility` feature is enabled otherwise we might end up favoring an overload that would be diagnosed as unavailable later. Resolves: rdar://143582881
1 parent e8fe5c3 commit aa4a2b9

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

lib/Sema/CSOptimizer.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ void forEachDisjunctionChoice(
175175
if (!decl)
176176
continue;
177177

178+
// Ignore declarations that come from implicitly imported modules
179+
// when `MemberImportVisibility` feature is enabled otherwise
180+
// we might end up favoring an overload that would be diagnosed
181+
// as unavailable later.
182+
if (cs.getASTContext().LangOpts.hasFeature(
183+
Feature::MemberImportVisibility)) {
184+
if (auto *useDC = constraint->getOverloadUseDC()) {
185+
if (!useDC->isDeclImported(decl))
186+
continue;
187+
}
188+
}
189+
178190
// If disjunction choice is unavailable or disfavored we cannot
179191
// do anything with it.
180192
if (decl->getAttrs().hasAttribute<DisfavoredOverloadAttr>() ||
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %empty-directory(%t/src)
3+
// RUN: split-file %s %t/src
4+
5+
/// Build the library A
6+
// RUN: %target-swift-frontend -emit-module %t/src/A.swift \
7+
// RUN: -module-name A \
8+
// RUN: -emit-module-path %t/A.swiftmodule
9+
10+
/// Build the library B
11+
// RUN: %target-swift-frontend -I %t -emit-module %t/src/B.swift \
12+
// RUN: -module-name B \
13+
// RUN: -emit-module-path %t/B.swiftmodule
14+
15+
// RUN: %target-swift-frontend -typecheck -I %t %t/src/Main.swift %t/src/Other.swift -enable-upcoming-feature MemberImportVisibility
16+
17+
// REQUIRES: swift_feature_MemberImportVisibility
18+
19+
//--- A.swift
20+
public struct Test {
21+
public init(a: Double) { }
22+
}
23+
24+
//--- B.swift
25+
import A
26+
27+
extension Test {
28+
public init(a: Int) { fatalError() }
29+
}
30+
31+
//--- Main.swift
32+
import A
33+
34+
func test() {
35+
_ = Test(a: 0) // Ok, selects the overload that takes Double.
36+
}
37+
38+
//--- Other.swift
39+
import B

0 commit comments

Comments
 (0)