diff --git a/lib/Sema/TypeCheckAvailability.cpp b/lib/Sema/TypeCheckAvailability.cpp index 38b3eef7c78f7..0af115e84e0d6 100644 --- a/lib/Sema/TypeCheckAvailability.cpp +++ b/lib/Sema/TypeCheckAvailability.cpp @@ -1565,7 +1565,10 @@ static bool isInsideCompatibleUnavailableDeclaration( auto IsUnavailable = [platform](const Decl *D) { auto EnclosingUnavailable = D->getAttrs().getUnavailable(D->getASTContext()); - return EnclosingUnavailable && EnclosingUnavailable->Platform == platform; + return EnclosingUnavailable && + (EnclosingUnavailable->Platform == platform || + inheritsAvailabilityFromPlatform(platform, + EnclosingUnavailable->Platform)); }; return someEnclosingDeclMatches(ReferenceRange, ReferenceDC, IsUnavailable); diff --git a/test/attr/attr_availability_maccatalyst.swift b/test/attr/attr_availability_maccatalyst.swift index 07fd5229471d1..f69cc8aea1b3d 100644 --- a/test/attr/attr_availability_maccatalyst.swift +++ b/test/attr/attr_availability_maccatalyst.swift @@ -140,3 +140,27 @@ protocol P: Builtin.AnyObject { } extension X: P {} + +// Test platform inheritance for iOS unavailability. +// rdar://68597591 + +@available(iOS, unavailable) +public struct UnavailableOniOS { } // expected-note 2 {{'UnavailableOniOS' has been explicitly marked unavailable here}} + +@available(iOS, unavailable) +func unavailableOniOS(_ p: UnavailableOniOS) { } // ok + +func functionUsingAnUnavailableType(_ p: UnavailableOniOS) { } // expected-error {{'UnavailableOniOS' is unavailable in iOS}} + +public extension UnavailableOniOS { } // expected-error {{'UnavailableOniOS' is unavailable in iOS}} + +@available(iOS, unavailable) +public extension UnavailableOniOS { // ok + func someMethod(_ p: UnavailableOniOS) { } +} + +@available(iOS, unavailable) +@available(macCatalyst, introduced: 13.0) +public struct AvailableOnMacCatalyst { } + +public extension AvailableOnMacCatalyst { } // ok