Skip to content

Commit 9a32db7

Browse files
committed
[ConstraintSystem] Extend availability check to cover unavailable extensions
The solver used to check availability attribute on the declaration itself, a better approach is to go through `AvailableAttr::isUnavailable` because that also covers unavailable extensions. Resolves: rdar://92364955
1 parent 565ed69 commit 9a32db7

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/Sema/ConstraintSystem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6263,7 +6263,7 @@ void ConstraintSystem::diagnoseFailureFor(SolutionApplicationTarget target) {
62636263
bool ConstraintSystem::isDeclUnavailable(const Decl *D,
62646264
ConstraintLocator *locator) const {
62656265
// First check whether this declaration is universally unavailable.
6266-
if (D->getAttrs().isUnavailable(getASTContext()))
6266+
if (AvailableAttr::isUnavailable(D))
62676267
return true;
62686268

62696269
return TypeChecker::isDeclarationUnavailable(D, DC, [&] {

test/Constraints/availability.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,25 @@ func unavailableFunction(_ x: Int) -> Bool { true } // expected-note {{'unavaila
4343
func sr13260(_ arr: [Int]) {
4444
for x in arr where unavailableFunction(x) {} // expected-error {{'unavailableFunction' is unavailable}}
4545
}
46+
47+
// rdar://92364955 - ambiguity with member declared in unavailable extension
48+
struct WithUnavailableExt {
49+
}
50+
51+
@available(*, unavailable)
52+
extension WithUnavailableExt {
53+
static var foo: WithUnavailableExt = WithUnavailableExt()
54+
}
55+
56+
func test_no_ambiguity_with_unavailable_ext() {
57+
struct A {
58+
static var foo: A = A()
59+
}
60+
61+
struct Test {
62+
init(_: A) {}
63+
init(_: WithUnavailableExt) {}
64+
}
65+
66+
_ = Test(.foo) // Ok `A.foo` since `foo` from `WithUnavailableExt` is unavailable
67+
}

0 commit comments

Comments
 (0)