@@ -2344,7 +2344,8 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
23442344 IdentifierLoc *Platform = AL.getArgAsIdent (0 );
23452345
23462346 IdentifierInfo *II = Platform->Ident ;
2347- if (AvailabilityAttr::getPrettyPlatformName (II->getName ()).empty ())
2347+ StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName (II->getName ());
2348+ if (PrettyName.empty ())
23482349 S.Diag (Platform->Loc , diag::warn_availability_unknown_platform)
23492350 << Platform->Ident ;
23502351
@@ -2355,15 +2356,31 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
23552356 AvailabilityChange Introduced = AL.getAvailabilityIntroduced ();
23562357 AvailabilityChange Deprecated = AL.getAvailabilityDeprecated ();
23572358 AvailabilityChange Obsoleted = AL.getAvailabilityObsoleted ();
2358- if (II->getName () == " macos" || II->getName () == " macos_app_extension" ) {
2359- // Canonicalize macOS availability versions.
2360- Introduced.Version = llvm::Triple::getCanonicalVersionForOS (
2361- llvm::Triple::MacOSX, Introduced.Version );
2362- Deprecated.Version = llvm::Triple::getCanonicalVersionForOS (
2363- llvm::Triple::MacOSX, Deprecated.Version );
2364- Obsoleted.Version = llvm::Triple::getCanonicalVersionForOS (
2365- llvm::Triple::MacOSX, Obsoleted.Version );
2359+
2360+ const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType (
2361+ AvailabilityAttr::canonicalizePlatformName (II->getName ()));
2362+
2363+ auto reportAndUpdateIfInvalidOS = [&](auto &InputVersion) -> void {
2364+ const bool IsInValidRange =
2365+ llvm::Triple::isValidVersionForOS (PlatformOS, InputVersion);
2366+ // Canonicalize availability versions.
2367+ auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS (
2368+ PlatformOS, InputVersion, IsInValidRange);
2369+ if (!IsInValidRange) {
2370+ S.Diag (Platform->Loc , diag::warn_availability_invalid_os_version)
2371+ << InputVersion.getAsString () << PrettyName;
2372+ S.Diag (Platform->Loc , diag::note_availability_invalid_os_version_adjusted)
2373+ << CanonicalVersion.getAsString ();
2374+ }
2375+ InputVersion = CanonicalVersion;
2376+ };
2377+
2378+ if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2379+ reportAndUpdateIfInvalidOS (Introduced.Version );
2380+ reportAndUpdateIfInvalidOS (Deprecated.Version );
2381+ reportAndUpdateIfInvalidOS (Obsoleted.Version );
23662382 }
2383+
23672384 bool IsUnavailable = AL.getUnavailableLoc ().isValid ();
23682385 bool IsStrict = AL.getStrictLoc ().isValid ();
23692386 StringRef Str;
@@ -2453,7 +2470,11 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
24532470 }
24542471
24552472 auto Major = Version.getMajor ();
2456- auto NewMajor = Major >= 9 ? Major - 7 : 0 ;
2473+ auto NewMajor = Major;
2474+ if (Major < 9 )
2475+ NewMajor = 0 ;
2476+ else if (Major < 12 )
2477+ NewMajor = Major - 7 ;
24572478 if (NewMajor >= 2 ) {
24582479 if (Version.getMinor ()) {
24592480 if (Version.getSubminor ())
0 commit comments