From 4c30f8bd6de5487603ed645cc4dd2a2983f4f0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20C=C5=93ur?= Date: Wed, 10 Apr 2019 20:15:11 +0800 Subject: [PATCH 1/2] appendingPathComponent(:isDirectory:) should account for isDirectory --- stdlib/public/Darwin/Foundation/URL.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdlib/public/Darwin/Foundation/URL.swift b/stdlib/public/Darwin/Foundation/URL.swift index 55ffeb8f9402b..ab9e68bc49c01 100644 --- a/stdlib/public/Darwin/Foundation/URL.swift +++ b/stdlib/public/Darwin/Foundation/URL.swift @@ -827,7 +827,8 @@ public struct URL : ReferenceConvertible, Equatable { } else { // Now we need to do something more expensive if var c = URLComponents(url: self, resolvingAgainstBaseURL: true) { - c.path = (c.path as NSString).appendingPathComponent(pathComponent) + let path = (c.path as NSString).appendingPathComponent(pathComponent) + c.path = isDirectory ? path + "/" : path if let result = c.url { return result From 14e6772dc04cf778ba393bebc21a0a8b8ada3603 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 2/2] 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 b8784d9e62978..f99a9415f551c 100644 --- a/lib/Sema/TypeCheckAvailability.cpp +++ b/lib/Sema/TypeCheckAvailability.cpp @@ -1566,7 +1566,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