@@ -345,39 +345,39 @@ static bool computeContainedByDeploymentTarget(AvailabilityScope *scope,
345345// / unconditional unavailable declaration for the same platform.
346346static bool isInsideCompatibleUnavailableDeclaration (
347347 const Decl *D, AvailabilityContext availabilityContext,
348- const AvailableAttr * attr) {
348+ const SemanticAvailableAttr & attr) {
349349 auto contextPlatform = availabilityContext.getUnavailablePlatformKind ();
350350 if (!contextPlatform)
351351 return false ;
352352
353- if (!attr-> isUnconditionallyUnavailable ())
353+ if (!attr. isUnconditionallyUnavailable ())
354354 return false ;
355355
356356 // Refuse calling universally unavailable functions from unavailable code,
357357 // but allow the use of types.
358- PlatformKind declPlatform = attr-> getPlatform ();
359- if (declPlatform == PlatformKind::none && !attr-> isForEmbedded () &&
358+ PlatformKind declPlatform = attr. getPlatform ();
359+ if (declPlatform == PlatformKind::none && !attr. isEmbeddedSpecific () &&
360360 !isa<TypeDecl>(D) && !isa<ExtensionDecl>(D))
361361 return false ;
362362
363363 // @_unavailableInEmbedded declarations may be used in contexts that are
364364 // also @_unavailableInEmbedded.
365- if (attr-> isForEmbedded ())
365+ if (attr. isEmbeddedSpecific ())
366366 return availabilityContext.isUnavailableInEmbedded ();
367367
368368 return (*contextPlatform == PlatformKind::none ||
369369 *contextPlatform == declPlatform ||
370370 inheritsAvailabilityFromPlatform (declPlatform, *contextPlatform));
371371}
372372
373- const AvailableAttr *
373+ std::optional<SemanticAvailableAttr>
374374ExportContext::shouldDiagnoseDeclAsUnavailable (const Decl *D) const {
375375 auto attr = D->getUnavailableAttr ();
376376 if (!attr)
377- return nullptr ;
377+ return std:: nullopt ;
378378
379- if (isInsideCompatibleUnavailableDeclaration (D, Availability, attr))
380- return nullptr ;
379+ if (isInsideCompatibleUnavailableDeclaration (D, Availability, * attr))
380+ return std:: nullopt ;
381381
382382 return attr;
383383}
@@ -2996,7 +2996,9 @@ static bool diagnoseExplicitUnavailability(const ValueDecl *D, SourceRange R,
29962996 DeclAvailabilityFlags Flags) {
29972997 return diagnoseExplicitUnavailability (
29982998 D, R, Where, Flags, [=](InFlightDiagnostic &diag) {
2999- fixItAvailableAttrRename (diag, R, D, D->getUnavailableAttr (), call);
2999+ auto attr = D->getUnavailableAttr ();
3000+ assert (attr);
3001+ fixItAvailableAttrRename (diag, R, D, attr->getParsedAttr (), call);
30003002 });
30013003}
30023004
@@ -3019,20 +3021,18 @@ class UnavailabilityDiagnosticInfo {
30193021
30203022private:
30213023 Status DiagnosticStatus;
3022- const AvailableAttr *Attr;
3023- AvailabilityDomain Domain;
3024+ SemanticAvailableAttr Attr;
30243025
30253026public:
3026- UnavailabilityDiagnosticInfo (Status status, const AvailableAttr *attr,
3027- AvailabilityDomain domain)
3028- : DiagnosticStatus(status), Attr(attr), Domain(domain) {
3029- assert (attr);
3030- };
3027+ UnavailabilityDiagnosticInfo (Status status, const SemanticAvailableAttr &attr)
3028+ : DiagnosticStatus(status), Attr(attr) {};
30313029
30323030 Status getStatus () const { return DiagnosticStatus; }
3033- const AvailableAttr *getAttr () const { return Attr; }
3034- AvailabilityDomain getDomain () const { return Domain; }
3035- StringRef getDomainName () const { return Domain.getNameForDiagnostics (); }
3031+ const AvailableAttr *getAttr () const { return Attr.getParsedAttr (); }
3032+ AvailabilityDomain getDomain () const { return Attr.getDomain (); }
3033+ StringRef getDomainName () const {
3034+ return getDomain ().getNameForDiagnostics ();
3035+ }
30363036
30373037 bool shouldHideDomainNameInUnversionedDiagnostics () const {
30383038 switch (getDomain ().getKind ()) {
@@ -3057,39 +3057,32 @@ class UnavailabilityDiagnosticInfo {
30573057static std::optional<UnavailabilityDiagnosticInfo>
30583058getExplicitUnavailabilityDiagnosticInfo (const Decl *decl,
30593059 const ExportContext &where) {
3060- auto * attr = where.shouldDiagnoseDeclAsUnavailable (decl);
3060+ auto attr = where.shouldDiagnoseDeclAsUnavailable (decl);
30613061 if (!attr)
30623062 return std::nullopt ;
30633063
3064- auto semanticAttr = decl->getSemanticAvailableAttr (attr);
3065- if (!semanticAttr)
3066- return std::nullopt ;
3067-
30683064 ASTContext &ctx = decl->getASTContext ();
30693065
3070- switch (semanticAttr ->getVersionAvailability (ctx)) {
3066+ switch (attr ->getVersionAvailability (ctx)) {
30713067 case AvailableVersionComparison::Available:
30723068 case AvailableVersionComparison::PotentiallyUnavailable:
30733069 llvm_unreachable (" These aren't considered unavailable" );
30743070
30753071 case AvailableVersionComparison::Unavailable:
3076- if ((semanticAttr ->isSwiftLanguageModeSpecific () ||
3077- semanticAttr ->isPackageDescriptionVersionSpecific ()) &&
3078- attr->Introduced . has_value ()) {
3072+ if ((attr ->isSwiftLanguageModeSpecific () ||
3073+ attr ->isPackageDescriptionVersionSpecific ()) &&
3074+ attr->getIntroduced ()) {
30793075 return UnavailabilityDiagnosticInfo (
3080- UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, attr,
3081- semanticAttr->getDomain ());
3076+ UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, *attr);
30823077 } else {
30833078 return UnavailabilityDiagnosticInfo (
3084- UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, attr,
3085- semanticAttr->getDomain ());
3079+ UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, *attr);
30863080 }
30873081 break ;
30883082
30893083 case AvailableVersionComparison::Obsoleted:
30903084 return UnavailabilityDiagnosticInfo (
3091- UnavailabilityDiagnosticInfo::Status::Obsoleted, attr,
3092- semanticAttr->getDomain ());
3085+ UnavailabilityDiagnosticInfo::Status::Obsoleted, *attr);
30933086 }
30943087}
30953088
@@ -3161,29 +3154,26 @@ swift::getUnsatisfiedAvailabilityConstraint(
31613154 return std::nullopt ;
31623155
31633156 if (auto attr = decl->getUnavailableAttr ()) {
3164- auto semanticAttr = decl->getSemanticAvailableAttr (attr);
3165- if (!semanticAttr)
3166- return std::nullopt ;
3167-
31683157 if (isInsideCompatibleUnavailableDeclaration (decl, availabilityContext,
3169- attr))
3158+ * attr))
31703159 return std::nullopt ;
31713160
3172- switch (semanticAttr->getVersionAvailability (ctx)) {
3161+ auto parsedAttr = attr->getParsedAttr ();
3162+ switch (attr->getVersionAvailability (ctx)) {
31733163 case AvailableVersionComparison::Available:
31743164 case AvailableVersionComparison::PotentiallyUnavailable:
31753165 llvm_unreachable (" Decl should be unavailable" );
31763166
31773167 case AvailableVersionComparison::Unavailable:
3178- if ((semanticAttr ->isSwiftLanguageModeSpecific () ||
3179- semanticAttr ->isPackageDescriptionVersionSpecific ()) &&
3180- attr->Introduced .has_value ())
3181- return AvailabilityConstraint::forRequiresVersion (attr );
3168+ if ((attr ->isSwiftLanguageModeSpecific () ||
3169+ attr ->isPackageDescriptionVersionSpecific ()) &&
3170+ attr->getIntroduced () .has_value ())
3171+ return AvailabilityConstraint::forRequiresVersion (parsedAttr );
31823172
3183- return AvailabilityConstraint::forAlwaysUnavailable (attr );
3173+ return AvailabilityConstraint::forAlwaysUnavailable (parsedAttr );
31843174
31853175 case AvailableVersionComparison::Obsoleted:
3186- return AvailabilityConstraint::forObsoleted (attr );
3176+ return AvailabilityConstraint::forObsoleted (parsedAttr );
31873177 }
31883178 }
31893179
@@ -4131,11 +4121,12 @@ bool ExprAvailabilityWalker::diagnoseDeclRefAvailability(
41314121 if (D->getModuleContext ()->isBuiltinModule ())
41324122 return false ;
41334123
4134- if (auto *attr = D->getUnavailableAttr ()) {
4135- if (diagnoseIncDecRemoval (D, R, attr))
4124+ if (auto attr = D->getUnavailableAttr ()) {
4125+ auto parsedAttr = attr->getParsedAttr ();
4126+ if (diagnoseIncDecRemoval (D, R, parsedAttr))
41364127 return true ;
41374128 if (isa_and_nonnull<ApplyExpr>(call) &&
4138- diagnoseMemoryLayoutMigration (D, R, attr , cast<ApplyExpr>(call)))
4129+ diagnoseMemoryLayoutMigration (D, R, parsedAttr , cast<ApplyExpr>(call)))
41394130 return true ;
41404131 }
41414132
0 commit comments