diff --git a/lib/Sema/TypeCheckAvailability.cpp b/lib/Sema/TypeCheckAvailability.cpp index a64147aced1b4..b2f9c34dd5f13 100644 --- a/lib/Sema/TypeCheckAvailability.cpp +++ b/lib/Sema/TypeCheckAvailability.cpp @@ -3511,6 +3511,11 @@ void swift::checkExplicitAvailability(Decl *decl) { !isa(decl->getDeclContext())) return; if (auto extension = dyn_cast(decl)) { + // Skip extensions that extend non-public types. + auto extended = extension->getExtendedNominal(); + if (!extended || !extended->getFormalAccessScope().isPublic()) + return; + // Skip extensions when none of their members need availability. auto members = extension->getMembers(); auto hasMembers = std::any_of(members.begin(), members.end(), diff --git a/test/attr/require_explicit_availability_macos.swift b/test/attr/require_explicit_availability_macos.swift index 8cb178c944fcb..cb8c7e31df897 100644 --- a/test/attr/require_explicit_availability_macos.swift +++ b/test/attr/require_explicit_availability_macos.swift @@ -144,6 +144,8 @@ private class PrivateClass { } extension PrivateClass { } +extension PrivateClass : P { } + @available(macOS 10.1, *) public protocol PublicProtocol { } @@ -162,6 +164,8 @@ extension spiStruct { public func spiExtensionMethod() {} } +extension spiStruct : P { } + public var publicVar = S() // expected-warning {{public declarations should have an availability attribute with an introduction version}} {{1-1=@available(macOS 10.10, *)\n}} @available(macOS 10.10, *)