Skip to content

Commit 3f305a4

Browse files
committed
AST: Re-map macOS 16 aligned availability versions to 26.
- watchOS 12 -> 26 - visionOS 3 -> 26 - macos 16 -> 26 - iOS 19 -> 26 - tvOS 19 -> 26 The version numbers for `if #available(...)` queries are intentionally not re-mapped.
1 parent af76f14 commit 3f305a4

18 files changed

+317
-98
lines changed

lib/AST/PlatformKind.cpp

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,16 +263,41 @@ bool swift::inheritsAvailabilityFromPlatform(PlatformKind Child,
263263
return false;
264264
}
265265

266-
llvm::VersionTuple swift::canonicalizePlatformVersion(
267-
PlatformKind platform, const llvm::VersionTuple &version) {
268-
269-
// Canonicalize macOS version for macOS Big Sur to treat
270-
// 10.16 as 11.0.
271-
if (platform == PlatformKind::macOS ||
272-
platform == PlatformKind::macOSApplicationExtension) {
273-
return llvm::Triple::getCanonicalVersionForOS(llvm::Triple::MacOSX,
274-
version);
266+
static std::optional<llvm::Triple::OSType>
267+
tripleOSTypeForPlatform(PlatformKind platform) {
268+
switch (platform) {
269+
case PlatformKind::macOS:
270+
case PlatformKind::macOSApplicationExtension:
271+
return llvm::Triple::MacOSX;
272+
case PlatformKind::iOS:
273+
case PlatformKind::iOSApplicationExtension:
274+
case PlatformKind::macCatalyst:
275+
case PlatformKind::macCatalystApplicationExtension:
276+
return llvm::Triple::IOS;
277+
case PlatformKind::tvOS:
278+
case PlatformKind::tvOSApplicationExtension:
279+
return llvm::Triple::TvOS;
280+
case PlatformKind::watchOS:
281+
case PlatformKind::watchOSApplicationExtension:
282+
return llvm::Triple::WatchOS;
283+
case PlatformKind::visionOS:
284+
case PlatformKind::visionOSApplicationExtension:
285+
return llvm::Triple::XROS;
286+
case PlatformKind::OpenBSD:
287+
return llvm::Triple::OpenBSD;
288+
case PlatformKind::Windows:
289+
return llvm::Triple::Win32;
290+
case PlatformKind::none:
291+
return std::nullopt;
275292
}
293+
llvm_unreachable("bad PlatformKind");
294+
}
295+
296+
llvm::VersionTuple
297+
swift::canonicalizePlatformVersion(PlatformKind platform,
298+
const llvm::VersionTuple &version) {
299+
if (auto osType = tripleOSTypeForPlatform(platform))
300+
return llvm::Triple::getCanonicalVersionForOS(*osType, version);
276301

277302
return version;
278303
}

test/ClangImporter/Inputs/custom-modules/MacOSVersionCanonicalization.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,20 @@ void FunctionIntroducedIn10_16();
44
__attribute__((availability(macosx,introduced=11.0)))
55
void FunctionIntroducedIn11_0();
66

7+
__attribute__((availability(macosx,introduced=16.0)))
8+
void FunctionIntroducedIn16_0();
9+
10+
__attribute__((availability(macosx,introduced=26.0)))
11+
void FunctionIntroducedIn26_0();
12+
713
__attribute__((availability(macosx_app_extension,introduced=10.16)))
814
void FunctionIntroducedIn10_16AppExt();
915

1016
__attribute__((availability(macosx_app_extension,introduced=11.0)))
1117
void FunctionIntroducedIn11_0AppExt();
18+
19+
__attribute__((availability(macosx_app_extension,introduced=16.0)))
20+
void FunctionIntroducedIn16_0AppExt();
21+
22+
__attribute__((availability(macosx_app_extension,introduced=26.0)))
23+
void FunctionIntroducedIn26_0AppExt();

test/ClangImporter/availability_macosx_canonical_versions.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ FunctionIntroducedIn10_16()
1111
FunctionIntroducedIn11_0()
1212
// expected-error@-1 {{'FunctionIntroducedIn11_0()' is only available in macOS 11.0 or newer}}
1313
// expected-note@-2 {{add 'if #available' version check}}
14+
15+
FunctionIntroducedIn16_0()
16+
// expected-error@-1 {{'FunctionIntroducedIn16_0()' is only available in macOS 26.0 or newer}}
17+
// expected-note@-2 {{add 'if #available' version check}}
18+
19+
FunctionIntroducedIn26_0()
20+
// expected-error@-1 {{'FunctionIntroducedIn26_0()' is only available in macOS 26.0 or newer}}
21+
// expected-note@-2 {{add 'if #available' version check}}

test/ClangImporter/availability_macosx_canonical_versions_appext.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ FunctionIntroducedIn10_16AppExt()
1111
FunctionIntroducedIn11_0AppExt()
1212
// expected-error@-1 {{'FunctionIntroducedIn11_0AppExt()' is only available in application extensions for macOS 11.0 or newer}}
1313
// expected-note@-2 {{add 'if #available' version check}}
14+
15+
FunctionIntroducedIn16_0AppExt()
16+
// expected-error@-1 {{'FunctionIntroducedIn16_0AppExt()' is only available in application extensions for macOS 26.0 or newer}}
17+
// expected-note@-2 {{add 'if #available' version check}}
18+
19+
FunctionIntroducedIn26_0AppExt()
20+
// expected-error@-1 {{'FunctionIntroducedIn26_0AppExt()' is only available in application extensions for macOS 26.0 or newer}}
21+
// expected-note@-2 {{add 'if #available' version check}}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -typecheck -verify %s
3+
// RUN: %target-swift-ide-test -skip-deinit=false -print-ast-typechecked -source-filename %s -function-definitions=false -prefer-type-repr=false -print-implicit-attrs=true > %t.printed.txt
4+
// RUN: %FileCheck %s -check-prefix=PASS_COMMON -strict-whitespace < %t.printed.txt
5+
6+
@available(iOS 10.16, OSX 10.16, *)
7+
func introduced10_16() {}
8+
// PASS_COMMON: {{^}}@available(iOS 10.16, macOS 11.0, *){{$}}
9+
// PASS_COMMON-NEXT: {{^}}func introduced10_16(){{$}}
10+
11+
@available(macOS 16.0, iOS 19.0, macCatalyst 19.0, watchOS 12.0, tvOS 19.0, visionOS 3.0, *)
12+
func introducedInVersionsMappingTo26_0() {}
13+
// FIXME: visionOS and macCatalyst are missing
14+
// PASS_COMMON: {{^}}@available(macOS 26.0, iOS 26.0, watchOS 26.0, tvOS 26.0, *){{$}}
15+
// PASS_COMMON-NEXT: {{^}}func introducedInVersionsMappingTo26_0(){{$}}
16+
17+
@available(macOS 18.0, iOS 21.0, macCatalyst 21.0, watchOS 14.0, tvOS 21.0, visionOS 5.0, *)
18+
func introducedInVersionsMappingTo28_0() {}
19+
// FIXME: visionOS and macCatalyst are missing
20+
// PASS_COMMON: {{^}}@available(macOS 28.0, iOS 28.0, watchOS 28.0, tvOS 28.0, *){{$}}
21+
// PASS_COMMON-NEXT: {{^}}func introducedInVersionsMappingTo28_0(){{$}}

test/IDE/print_ast_tc_decls_macosx_canonical_versions.swift

Lines changed: 0 additions & 16 deletions
This file was deleted.

test/IRGen/osx-targets.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// CHECK: target triple = "{{.*}}-apple-macosx{{[0-9][0-9]}}.
88
// CHECK-SPECIFIC-MAC-10-X: target triple = "{{.*}}-apple-macosx10.51.0"
9-
// CHECK-DARWIN-OVER-11: target triple = "{{.*}}-apple-macosx46.0.0"
9+
// CHECK-DARWIN-OVER-11: target triple = "{{.*}}-apple-macosx56.0.0"
1010

1111
public func anchor() {}
1212
anchor()
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-emit-module-interface(%t/Module.swiftinterface) %s
3+
// RUN: %target-swift-typecheck-module-from-interface(%t/Module.swiftinterface)
4+
// RUN: %FileCheck %s < %t/Module.swiftinterface
5+
6+
@available(macOS 10.16, iOS 10.16, watchOS 10.16, tvOS 10.16, *)
7+
public func introduced10_16() { }
8+
// CHECK: @available(macOS 11.0, iOS 10.16, watchOS 10.16, tvOS 10.16, *)
9+
// CHECK-NEXT: public func introduced10_16()
10+
11+
@available(OSX 11.0, iOS 11.0, watchOS 11.0, tvOS 11.0, *)
12+
public func introduced11_0() { }
13+
// CHECK-NEXT: @available(macOS 11.0, iOS 11.0, watchOS 11.0, tvOS 11.0, *)
14+
// CHECK-NEXT: public func introduced11_0()
15+
16+
@available(macOS 16.0, iOS 19.0, macCatalyst 19.0, watchOS 12.0, tvOS 19.0, visionOS 3.0, *)
17+
public func introducedInVersionsMappingTo26_0() { }
18+
// CHECK-NEXT: @available(macOS 26.0, iOS 26.0, macCatalyst 26.0, watchOS 26.0, tvOS 26.0, visionOS 26.0, *)
19+
// CHECK-NEXT: public func introducedInVersionsMappingTo26_0()
20+
21+
@available(macOS 17.0, iOS 20.0, macCatalyst 20.0, watchOS 13.0, tvOS 20.0, visionOS 4.0, *)
22+
public func introducedInInvalidVersionsMappingTo27_0() { }
23+
// CHECK-NEXT: @available(macOS 27.0, iOS 27.0, macCatalyst 27.0, watchOS 27.0, tvOS 27.0, visionOS 27.0, *)
24+
// CHECK-NEXT: public func introducedInInvalidVersionsMappingTo27_0()
25+
26+
@available(macOS 19.1.1, iOS 21, macCatalyst 21.0, watchOS 14.5.1, tvOS 21.2.3, visionOS 4.0.1, *)
27+
public func introducedInInvalidVersionsWithVaryingComponents() { }
28+
// CHECK-NEXT: @available(macOS 29.1.1, iOS 28, macCatalyst 28.0, watchOS 28.5.1, tvOS 28.2.3, visionOS 27.0.1, *)
29+
// CHECK-NEXT: public func introducedInInvalidVersionsWithVaryingComponents()
30+
31+
@available(macOS 26.0, iOS 26.0, macCatalyst 26.0, watchOS 26.0, tvOS 26.0, visionOS 26.0, *)
32+
public func introduced26_0() { }
33+
// CHECK-NEXT: @available(macOS 26.0, iOS 26.0, macCatalyst 26.0, watchOS 26.0, tvOS 26.0, visionOS 26.0, *)
34+
// CHECK-NEXT: public func introduced26_0()

test/ModuleInterface/availability-macos-canonical-version.swift

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-module -o %t %s -disable-objc-attr-requires-foundation-module
3+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -parse-as-library %t/availability_canonical_versions.swiftmodule -typecheck -verify -emit-objc-header-path %t/availability.h -import-objc-header %S/../Inputs/empty.h -disable-objc-attr-requires-foundation-module
4+
// RUN: %FileCheck %s < %t/availability.h
5+
// RUN: %check-in-clang %t/availability.h
6+
7+
// REQUIRES: objc_interop
8+
9+
// CHECK-LABEL: @interface Availability{{$}}
10+
@objc class Availability {
11+
// CHECK-NEXT: - (void)alwaysAvailable;
12+
@objc func alwaysAvailable() {}
13+
14+
// CHECK-NEXT: - (void)introducedOn10_16
15+
// CHECK-SAME: SWIFT_AVAILABILITY(ios,introduced=10.16)
16+
// CHECK-SAME: SWIFT_AVAILABILITY(macos,introduced=11.0)
17+
@available(macOS 10.16, *)
18+
@available(iOS, introduced: 10.16)
19+
@objc func introducedOn10_16() {}
20+
21+
// CHECK-NEXT: - (void)introducedOn11_0
22+
// CHECK-SAME: SWIFT_AVAILABILITY(ios,introduced=11.0)
23+
// CHECK-SAME: SWIFT_AVAILABILITY(macos,introduced=11.0)
24+
@available(macOS 11.0, *)
25+
@available(iOS, introduced: 11.0)
26+
@objc func introducedOn11_0() {}
27+
28+
// CHECK-NEXT: - (void)introducedOnVersionsMappingTo26_0
29+
// CHECK-SAME: SWIFT_AVAILABILITY(visionos,introduced=26.0)
30+
// CHECK-SAME: SWIFT_AVAILABILITY(tvos,introduced=26.0)
31+
// CHECK-SAME: SWIFT_AVAILABILITY(watchos,introduced=26.0)
32+
// CHECK-SAME: SWIFT_AVAILABILITY(maccatalyst,introduced=26.0)
33+
// CHECK-SAME: SWIFT_AVAILABILITY(ios,introduced=26.0)
34+
// CHECK-SAME: SWIFT_AVAILABILITY(macos,introduced=26.0)
35+
@available(macOS 16.0, iOS 19.0, macCatalyst 19.0, watchOS 12.0, tvOS 19.0, visionOS 3.0, *)
36+
@objc func introducedOnVersionsMappingTo26_0() {}
37+
38+
// CHECK-NEXT: - (void)introducedOn26_0
39+
// CHECK-SAME: SWIFT_AVAILABILITY(visionos,introduced=26.0)
40+
// CHECK-SAME: SWIFT_AVAILABILITY(watchos,introduced=26.0)
41+
// CHECK-SAME: SWIFT_AVAILABILITY(tvos,introduced=26.0)
42+
// CHECK-SAME: SWIFT_AVAILABILITY(maccatalyst,introduced=26.0)
43+
// CHECK-SAME: SWIFT_AVAILABILITY(ios,introduced=26.0)
44+
// CHECK-SAME: SWIFT_AVAILABILITY(macos,introduced=26.0)
45+
@available(macOS 26.0, iOS 26.0, macCatalyst 26.0, tvOS 26.0, watchOS 26.0, visionOS 26.0, *)
46+
@objc func introducedOn26_0() {}
47+
}

0 commit comments

Comments
 (0)