@@ -345,39 +345,39 @@ static bool computeContainedByDeploymentTarget(AvailabilityScope *scope,
345
345
/// unconditional unavailable declaration for the same platform.
346
346
static bool isInsideCompatibleUnavailableDeclaration(
347
347
const Decl *D, AvailabilityContext availabilityContext,
348
- const AvailableAttr * attr) {
348
+ const SemanticAvailableAttr & attr) {
349
349
auto contextPlatform = availabilityContext.getUnavailablePlatformKind();
350
350
if (!contextPlatform)
351
351
return false;
352
352
353
- if (!attr-> isUnconditionallyUnavailable())
353
+ if (!attr. isUnconditionallyUnavailable())
354
354
return false;
355
355
356
356
// Refuse calling universally unavailable functions from unavailable code,
357
357
// 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 () &&
360
360
!isa<TypeDecl>(D) && !isa<ExtensionDecl>(D))
361
361
return false;
362
362
363
363
// @_unavailableInEmbedded declarations may be used in contexts that are
364
364
// also @_unavailableInEmbedded.
365
- if (attr->isForEmbedded ())
365
+ if (attr.isEmbeddedSpecific ())
366
366
return availabilityContext.isUnavailableInEmbedded();
367
367
368
368
return (*contextPlatform == PlatformKind::none ||
369
369
*contextPlatform == declPlatform ||
370
370
inheritsAvailabilityFromPlatform(declPlatform, *contextPlatform));
371
371
}
372
372
373
- const AvailableAttr *
373
+ std::optional<SemanticAvailableAttr>
374
374
ExportContext::shouldDiagnoseDeclAsUnavailable(const Decl *D) const {
375
375
auto attr = D->getUnavailableAttr();
376
376
if (!attr)
377
- return nullptr ;
377
+ return std::nullopt ;
378
378
379
- if (isInsideCompatibleUnavailableDeclaration(D, Availability, attr))
380
- return nullptr ;
379
+ if (isInsideCompatibleUnavailableDeclaration(D, Availability, * attr))
380
+ return std::nullopt ;
381
381
382
382
return attr;
383
383
}
@@ -2996,7 +2996,9 @@ static bool diagnoseExplicitUnavailability(const ValueDecl *D, SourceRange R,
2996
2996
DeclAvailabilityFlags Flags) {
2997
2997
return diagnoseExplicitUnavailability(
2998
2998
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);
3000
3002
});
3001
3003
}
3002
3004
@@ -3019,20 +3021,18 @@ class UnavailabilityDiagnosticInfo {
3019
3021
3020
3022
private:
3021
3023
Status DiagnosticStatus;
3022
- const AvailableAttr *Attr;
3023
- AvailabilityDomain Domain;
3024
+ SemanticAvailableAttr Attr;
3024
3025
3025
3026
public:
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) {};
3031
3029
3032
3030
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
+ }
3036
3036
3037
3037
bool shouldHideDomainNameInUnversionedDiagnostics() const {
3038
3038
switch (getDomain().getKind()) {
@@ -3057,39 +3057,32 @@ class UnavailabilityDiagnosticInfo {
3057
3057
static std::optional<UnavailabilityDiagnosticInfo>
3058
3058
getExplicitUnavailabilityDiagnosticInfo(const Decl *decl,
3059
3059
const ExportContext &where) {
3060
- auto * attr = where.shouldDiagnoseDeclAsUnavailable(decl);
3060
+ auto attr = where.shouldDiagnoseDeclAsUnavailable(decl);
3061
3061
if (!attr)
3062
3062
return std::nullopt;
3063
3063
3064
- auto semanticAttr = decl->getSemanticAvailableAttr(attr);
3065
- if (!semanticAttr)
3066
- return std::nullopt;
3067
-
3068
3064
ASTContext &ctx = decl->getASTContext();
3069
3065
3070
- switch (semanticAttr ->getVersionAvailability(ctx)) {
3066
+ switch (attr ->getVersionAvailability(ctx)) {
3071
3067
case AvailableVersionComparison::Available:
3072
3068
case AvailableVersionComparison::PotentiallyUnavailable:
3073
3069
llvm_unreachable("These aren't considered unavailable");
3074
3070
3075
3071
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 ()) {
3079
3075
return UnavailabilityDiagnosticInfo(
3080
- UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, attr,
3081
- semanticAttr->getDomain());
3076
+ UnavailabilityDiagnosticInfo::Status::IntroducedInVersion, *attr);
3082
3077
} else {
3083
3078
return UnavailabilityDiagnosticInfo(
3084
- UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, attr,
3085
- semanticAttr->getDomain());
3079
+ UnavailabilityDiagnosticInfo::Status::AlwaysUnavailable, *attr);
3086
3080
}
3087
3081
break;
3088
3082
3089
3083
case AvailableVersionComparison::Obsoleted:
3090
3084
return UnavailabilityDiagnosticInfo(
3091
- UnavailabilityDiagnosticInfo::Status::Obsoleted, attr,
3092
- semanticAttr->getDomain());
3085
+ UnavailabilityDiagnosticInfo::Status::Obsoleted, *attr);
3093
3086
}
3094
3087
}
3095
3088
@@ -3161,29 +3154,26 @@ swift::getUnsatisfiedAvailabilityConstraint(
3161
3154
return std::nullopt;
3162
3155
3163
3156
if (auto attr = decl->getUnavailableAttr()) {
3164
- auto semanticAttr = decl->getSemanticAvailableAttr(attr);
3165
- if (!semanticAttr)
3166
- return std::nullopt;
3167
-
3168
3157
if (isInsideCompatibleUnavailableDeclaration(decl, availabilityContext,
3169
- attr))
3158
+ * attr))
3170
3159
return std::nullopt;
3171
3160
3172
- switch (semanticAttr->getVersionAvailability(ctx)) {
3161
+ auto parsedAttr = attr->getParsedAttr();
3162
+ switch (attr->getVersionAvailability(ctx)) {
3173
3163
case AvailableVersionComparison::Available:
3174
3164
case AvailableVersionComparison::PotentiallyUnavailable:
3175
3165
llvm_unreachable("Decl should be unavailable");
3176
3166
3177
3167
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 );
3182
3172
3183
- return AvailabilityConstraint::forAlwaysUnavailable(attr );
3173
+ return AvailabilityConstraint::forAlwaysUnavailable(parsedAttr );
3184
3174
3185
3175
case AvailableVersionComparison::Obsoleted:
3186
- return AvailabilityConstraint::forObsoleted(attr );
3176
+ return AvailabilityConstraint::forObsoleted(parsedAttr );
3187
3177
}
3188
3178
}
3189
3179
@@ -4131,11 +4121,12 @@ bool ExprAvailabilityWalker::diagnoseDeclRefAvailability(
4131
4121
if (D->getModuleContext()->isBuiltinModule())
4132
4122
return false;
4133
4123
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))
4136
4127
return true;
4137
4128
if (isa_and_nonnull<ApplyExpr>(call) &&
4138
- diagnoseMemoryLayoutMigration(D, R, attr , cast<ApplyExpr>(call)))
4129
+ diagnoseMemoryLayoutMigration(D, R, parsedAttr , cast<ApplyExpr>(call)))
4139
4130
return true;
4140
4131
}
4141
4132
0 commit comments