@@ -2430,7 +2430,8 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
24302430 IdentifierLoc *Platform = AL.getArgAsIdent (0 );
24312431
24322432 IdentifierInfo *II = Platform->getIdentifierInfo ();
2433- if (AvailabilityAttr::getPrettyPlatformName (II->getName ()).empty ())
2433+ StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName (II->getName ());
2434+ if (PrettyName.empty ())
24342435 S.Diag (Platform->getLoc (), diag::warn_availability_unknown_platform)
24352436 << Platform->getIdentifierInfo ();
24362437
@@ -2441,15 +2442,32 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
24412442 AvailabilityChange Introduced = AL.getAvailabilityIntroduced ();
24422443 AvailabilityChange Deprecated = AL.getAvailabilityDeprecated ();
24432444 AvailabilityChange Obsoleted = AL.getAvailabilityObsoleted ();
2444- if (II->getName () == " macos" || II->getName () == " macos_app_extension" ) {
2445- // Canonicalize macOS availability versions.
2446- Introduced.Version = llvm::Triple::getCanonicalVersionForOS (
2447- llvm::Triple::MacOSX, Introduced.Version );
2448- Deprecated.Version = llvm::Triple::getCanonicalVersionForOS (
2449- llvm::Triple::MacOSX, Deprecated.Version );
2450- Obsoleted.Version = llvm::Triple::getCanonicalVersionForOS (
2451- llvm::Triple::MacOSX, Obsoleted.Version );
2445+
2446+ const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType (
2447+ AvailabilityAttr::canonicalizePlatformName (II->getName ()));
2448+
2449+ auto reportAndUpdateIfInvalidOS = [&](auto &InputVersion) -> void {
2450+ const bool IsInValidRange =
2451+ llvm::Triple::isValidVersionForOS (PlatformOS, InputVersion);
2452+ // Canonicalize availability versions.
2453+ auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS (
2454+ PlatformOS, InputVersion, IsInValidRange);
2455+ if (!IsInValidRange) {
2456+ S.Diag (Platform->getLoc (), diag::warn_availability_invalid_os_version)
2457+ << InputVersion.getAsString () << PrettyName;
2458+ S.Diag (Platform->getLoc (),
2459+ diag::note_availability_invalid_os_version_adjusted)
2460+ << CanonicalVersion.getAsString ();
2461+ }
2462+ InputVersion = CanonicalVersion;
2463+ };
2464+
2465+ if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2466+ reportAndUpdateIfInvalidOS (Introduced.Version );
2467+ reportAndUpdateIfInvalidOS (Deprecated.Version );
2468+ reportAndUpdateIfInvalidOS (Obsoleted.Version );
24522469 }
2470+
24532471 bool IsUnavailable = AL.getUnavailableLoc ().isValid ();
24542472 bool IsStrict = AL.getStrictLoc ().isValid ();
24552473 StringRef Str;
@@ -2541,7 +2559,11 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
25412559 }
25422560
25432561 auto Major = Version.getMajor ();
2544- auto NewMajor = Major >= 9 ? Major - 7 : 0 ;
2562+ auto NewMajor = Major;
2563+ if (Major < 9 )
2564+ NewMajor = 0 ;
2565+ else if (Major < 12 )
2566+ NewMajor = Major - 7 ;
25452567 if (NewMajor >= 2 ) {
25462568 if (Version.getMinor ()) {
25472569 if (Version.getSubminor ())
0 commit comments