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/stdlib/public/Darwin/Foundation/URL.swift b/stdlib/public/Darwin/Foundation/URL.swift index cef7f3a4d4f42..76b264398e055 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 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