From df44b39cc5b023eb8c79660638a8bc81b6714dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 22 Sep 2020 17:38:52 -0700 Subject: [PATCH] [Sema] Consider inherited platform unavailability to silence diagnostics rdar://68597591 --- lib/Sema/TypeCheckAvailability.cpp | 5 +++- test/attr/attr_availability_maccatalyst.swift | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) 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