@@ -2374,7 +2374,8 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
23742374 IdentifierLoc *Platform = AL.getArgAsIdent (0 );
23752375
23762376 IdentifierInfo *II = Platform->getIdentifierInfo ();
2377- if (AvailabilityAttr::getPrettyPlatformName (II->getName ()).empty ())
2377+ StringRef PrettyName = AvailabilityAttr::getPrettyPlatformName (II->getName ());
2378+ if (PrettyName.empty ())
23782379 S.Diag (Platform->getLoc (), diag::warn_availability_unknown_platform)
23792380 << Platform->getIdentifierInfo ();
23802381
@@ -2385,6 +2386,32 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
23852386 AvailabilityChange Introduced = AL.getAvailabilityIntroduced ();
23862387 AvailabilityChange Deprecated = AL.getAvailabilityDeprecated ();
23872388 AvailabilityChange Obsoleted = AL.getAvailabilityObsoleted ();
2389+
2390+ const llvm::Triple::OSType PlatformOS = AvailabilityAttr::getOSType (
2391+ AvailabilityAttr::canonicalizePlatformName (II->getName ()));
2392+
2393+ auto reportAndUpdateIfInvalidOS = [&](auto &InputVersion) -> void {
2394+ const bool IsInValidRange =
2395+ llvm::Triple::isValidVersionForOS (PlatformOS, InputVersion);
2396+ // Canonicalize availability versions.
2397+ auto CanonicalVersion = llvm::Triple::getCanonicalVersionForOS (
2398+ PlatformOS, InputVersion, IsInValidRange);
2399+ if (!IsInValidRange) {
2400+ S.Diag (Platform->getLoc (), diag::warn_availability_invalid_os_version)
2401+ << InputVersion.getAsString () << PrettyName;
2402+ S.Diag (Platform->getLoc (),
2403+ diag::note_availability_invalid_os_version_adjusted)
2404+ << CanonicalVersion.getAsString ();
2405+ }
2406+ InputVersion = CanonicalVersion;
2407+ };
2408+
2409+ if (PlatformOS != llvm::Triple::OSType::UnknownOS) {
2410+ reportAndUpdateIfInvalidOS (Introduced.Version );
2411+ reportAndUpdateIfInvalidOS (Deprecated.Version );
2412+ reportAndUpdateIfInvalidOS (Obsoleted.Version );
2413+ }
2414+
23882415 bool IsUnavailable = AL.getUnavailableLoc ().isValid ();
23892416 bool IsStrict = AL.getStrictLoc ().isValid ();
23902417 StringRef Str;
@@ -2476,7 +2503,11 @@ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
24762503 }
24772504
24782505 auto Major = Version.getMajor ();
2479- auto NewMajor = Major >= 9 ? Major - 7 : 0 ;
2506+ auto NewMajor = Major;
2507+ if (Major < 9 )
2508+ NewMajor = 0 ;
2509+ else if (Major < 12 )
2510+ NewMajor = Major - 7 ;
24802511 if (NewMajor >= 2 ) {
24812512 if (Version.getMinor ()) {
24822513 if (Version.getSubminor ())
0 commit comments