diff --git a/lib/Sema/ConstraintSystem.cpp b/lib/Sema/ConstraintSystem.cpp index 28fa64e312407..bf1fe62b0ef01 100644 --- a/lib/Sema/ConstraintSystem.cpp +++ b/lib/Sema/ConstraintSystem.cpp @@ -6263,7 +6263,7 @@ void ConstraintSystem::diagnoseFailureFor(SolutionApplicationTarget target) { bool ConstraintSystem::isDeclUnavailable(const Decl *D, ConstraintLocator *locator) const { // First check whether this declaration is universally unavailable. - if (D->getAttrs().isUnavailable(getASTContext())) + if (AvailableAttr::isUnavailable(D)) return true; return TypeChecker::isDeclarationUnavailable(D, DC, [&] { diff --git a/test/Constraints/availability.swift b/test/Constraints/availability.swift index 24e07b4b97af8..64caab51535bd 100644 --- a/test/Constraints/availability.swift +++ b/test/Constraints/availability.swift @@ -43,3 +43,25 @@ func unavailableFunction(_ x: Int) -> Bool { true } // expected-note {{'unavaila func sr13260(_ arr: [Int]) { for x in arr where unavailableFunction(x) {} // expected-error {{'unavailableFunction' is unavailable}} } + +// rdar://92364955 - ambiguity with member declared in unavailable extension +struct WithUnavailableExt { +} + +@available(*, unavailable) +extension WithUnavailableExt { + static var foo: WithUnavailableExt = WithUnavailableExt() +} + +func test_no_ambiguity_with_unavailable_ext() { + struct A { + static var foo: A = A() + } + + struct Test { + init(_: A) {} + init(_: WithUnavailableExt) {} + } + + _ = Test(.foo) // Ok `A.foo` since `foo` from `WithUnavailableExt` is unavailable +}