@@ -107,12 +107,14 @@ AvailabilityDomain::builtinDomainForString(StringRef string,
107107 // This parameter is used in downstream forks, do not remove.
108108 (void )declContext;
109109
110- auto domain = llvm::StringSwitch<std::optional<AvailabilityDomain>>(string)
111- .Case (" *" , AvailabilityDomain::forUniversal ())
112- .Case (" swift" , AvailabilityDomain::forSwiftLanguageMode ())
113- .Case (" _PackageDescription" ,
114- AvailabilityDomain::forPackageDescription ())
115- .Default (std::nullopt );
110+ auto domain =
111+ llvm::StringSwitch<std::optional<AvailabilityDomain>>(string)
112+ .Case (" *" , AvailabilityDomain::forUniversal ())
113+ .Case (" swift" , AvailabilityDomain::forSwiftLanguageMode ())
114+ .Case (" SwiftLanguageMode" , AvailabilityDomain::forSwiftLanguageMode ())
115+ .Case (" _PackageDescription" ,
116+ AvailabilityDomain::forPackageDescription ())
117+ .Default (std::nullopt );
116118
117119 if (domain)
118120 return domain;
@@ -480,6 +482,8 @@ AvailabilityDomainOrIdentifier::lookUpInDeclContext(
480482
481483 bool hasCustomAvailability =
482484 ctx.LangOpts .hasFeature (Feature::CustomAvailability);
485+ bool hasSwiftRuntimeAvailability =
486+ ctx.LangOpts .hasFeature (Feature::SwiftRuntimeAvailability);
483487
484488 if (!domain) {
485489 auto domainString = identifier.str ();
@@ -500,11 +504,32 @@ AvailabilityDomainOrIdentifier::lookUpInDeclContext(
500504 return std::nullopt ;
501505 }
502506
503- if (domain->isCustom () && !hasCustomAvailability &&
504- !declContext->isInSwiftinterface ()) {
505- diags.diagnose (loc, diag::attr_availability_requires_custom_availability,
506- *domain);
507- return std::nullopt ;
507+ if (!declContext->isInSwiftinterface ()) {
508+ if (domain->isCustom () && !hasCustomAvailability) {
509+ diags.diagnose (loc, diag::availability_domain_requires_feature, *domain,
510+ " CustomAvailability" );
511+ return std::nullopt ;
512+ }
513+
514+ if (domain->isSwiftLanguageMode ()) {
515+ // 'swift' -> 'SwiftLanguageMode'
516+ if (hasSwiftRuntimeAvailability && identifier.str () == " swift" ) {
517+ diags
518+ .diagnose (loc, diag::availability_domain_renamed, identifier,
519+ " SwiftLanguageMode" )
520+ .fixItReplace (SourceRange (loc), " SwiftLanguageMode" );
521+ }
522+
523+ if (!hasSwiftRuntimeAvailability &&
524+ identifier.str () == " SwiftLanguageMode" ) {
525+ // This diagnostic ("Swift requires '-enable-experimental-feature
526+ // SwiftRuntimeAvailability'") is confusing but it's also temporary,
527+ // assuming the experimental feature becomes official.
528+ diags.diagnose (loc, diag::availability_domain_requires_feature, *domain,
529+ " SwiftRuntimeAvailability" );
530+ return std::nullopt ;
531+ }
532+ }
508533 }
509534
510535 return domain;
0 commit comments