Skip to content

Commit dfc741e

Browse files
committed
AST: Optimize storage of VersionTuples in AvailableAttr.
Representing introduced, deprecated, and obsoleted versions at rest as optional version tuples is redundant, since the empty version tuple already represents "version not present". NFC.
1 parent 2908520 commit dfc741e

File tree

3 files changed

+25
-25
lines changed

3 files changed

+25
-25
lines changed

include/swift/AST/Attr.h

+14-7
Original file line numberDiff line numberDiff line change
@@ -754,26 +754,32 @@ class AvailableAttr : public DeclAttribute {
754754
const StringRef Message;
755755
const StringRef Rename;
756756

757-
const std::optional<llvm::VersionTuple> Introduced;
757+
const llvm::VersionTuple Introduced;
758758
const SourceRange IntroducedRange;
759-
const std::optional<llvm::VersionTuple> Deprecated;
759+
const llvm::VersionTuple Deprecated;
760760
const SourceRange DeprecatedRange;
761-
const std::optional<llvm::VersionTuple> Obsoleted;
761+
const llvm::VersionTuple Obsoleted;
762762
const SourceRange ObsoletedRange;
763763

764764
public:
765765
/// Returns the parsed version for `introduced:`.
766766
std::optional<llvm::VersionTuple> getRawIntroduced() const {
767+
if (Introduced.empty())
768+
return std::nullopt;
767769
return Introduced;
768770
}
769771

770772
/// Returns the parsed version for `deprecated:`.
771773
std::optional<llvm::VersionTuple> getRawDeprecated() const {
774+
if (Deprecated.empty())
775+
return std::nullopt;
772776
return Deprecated;
773777
}
774778

775779
/// Returns the parsed version for `obsoleted:`.
776780
std::optional<llvm::VersionTuple> getRawObsoleted() const {
781+
if (Obsoleted.empty())
782+
return std::nullopt;
777783
return Obsoleted;
778784
}
779785

@@ -3268,7 +3274,7 @@ class SemanticAvailableAttr final {
32683274

32693275
/// The version tuple written in source for the `introduced:` component.
32703276
std::optional<llvm::VersionTuple> getIntroduced() const {
3271-
return attr->Introduced;
3277+
return attr->getRawIntroduced();
32723278
}
32733279

32743280
/// The source range of the `introduced:` component.
@@ -3280,12 +3286,12 @@ class SemanticAvailableAttr final {
32803286

32813287
/// The version tuple written in source for the `deprecated:` component.
32823288
std::optional<llvm::VersionTuple> getDeprecated() const {
3283-
return attr->Deprecated;
3289+
return attr->getRawDeprecated();
32843290
}
32853291

32863292
/// The version tuple written in source for the `obsoleted:` component.
32873293
std::optional<llvm::VersionTuple> getObsoleted() const {
3288-
return attr->Obsoleted;
3294+
return attr->getRawObsoleted();
32893295
}
32903296

32913297
/// Returns the `message:` field of the attribute, or an empty string.
@@ -3318,7 +3324,8 @@ class SemanticAvailableAttr final {
33183324
/// Whether this attribute has an introduced, deprecated, or obsoleted
33193325
/// version.
33203326
bool isVersionSpecific() const {
3321-
return attr->Introduced || attr->Deprecated || attr->Obsoleted;
3327+
return getIntroduced().has_value() || getDeprecated().has_value() ||
3328+
getObsoleted().has_value();
33223329
}
33233330

33243331
/// Whether this is a language mode specific attribute.

lib/AST/Attr.cpp

+9-16
Original file line numberDiff line numberDiff line change
@@ -2108,8 +2108,6 @@ Type RawLayoutAttr::getResolvedCountType(StructDecl *sd) const {
21082108
ErrorType::get(ctx));
21092109
}
21102110

2111-
#define INIT_VER_TUPLE(X) X(X.empty() ? std::optional<llvm::VersionTuple>() : X)
2112-
21132111
AvailableAttr::AvailableAttr(
21142112
SourceLoc AtLoc, SourceRange Range, const AvailabilityDomain &Domain,
21152113
Kind Kind, StringRef Message, StringRef Rename,
@@ -2118,10 +2116,10 @@ AvailableAttr::AvailableAttr(
21182116
const llvm::VersionTuple &Obsoleted, SourceRange ObsoletedRange,
21192117
bool Implicit, bool IsSPI)
21202118
: DeclAttribute(DeclAttrKind::Available, AtLoc, Range, Implicit),
2121-
Domain(Domain), Message(Message), Rename(Rename),
2122-
INIT_VER_TUPLE(Introduced), IntroducedRange(IntroducedRange),
2123-
INIT_VER_TUPLE(Deprecated), DeprecatedRange(DeprecatedRange),
2124-
INIT_VER_TUPLE(Obsoleted), ObsoletedRange(ObsoletedRange) {
2119+
Domain(Domain), Message(Message), Rename(Rename), Introduced(Introduced),
2120+
IntroducedRange(IntroducedRange), Deprecated(Deprecated),
2121+
DeprecatedRange(DeprecatedRange), Obsoleted(Obsoleted),
2122+
ObsoletedRange(ObsoletedRange) {
21252123
Bits.AvailableAttr.Kind = static_cast<uint8_t>(Kind);
21262124
Bits.AvailableAttr.HasComputedSemanticAttr = false;
21272125
Bits.AvailableAttr.HasDomain = true;
@@ -2130,8 +2128,6 @@ AvailableAttr::AvailableAttr(
21302128
Bits.AvailableAttr.IsSPI = IsSPI;
21312129
}
21322130

2133-
#undef INIT_VER_TUPLE
2134-
21352131
AvailableAttr *AvailableAttr::createUniversallyUnavailable(ASTContext &C,
21362132
StringRef Message,
21372133
StringRef Rename) {
@@ -2199,12 +2195,9 @@ bool BackDeployedAttr::isActivePlatform(const ASTContext &ctx,
21992195
AvailableAttr *AvailableAttr::clone(ASTContext &C, bool implicit) const {
22002196
return new (C) AvailableAttr(
22012197
implicit ? SourceLoc() : AtLoc, implicit ? SourceRange() : getRange(),
2202-
Domain, getKind(), Message, Rename,
2203-
Introduced ? *Introduced : llvm::VersionTuple(),
2204-
implicit ? SourceRange() : IntroducedRange,
2205-
Deprecated ? *Deprecated : llvm::VersionTuple(),
2206-
implicit ? SourceRange() : DeprecatedRange,
2207-
Obsoleted ? *Obsoleted : llvm::VersionTuple(),
2198+
Domain, getKind(), Message, Rename, Introduced,
2199+
implicit ? SourceRange() : IntroducedRange, Deprecated,
2200+
implicit ? SourceRange() : DeprecatedRange, Obsoleted,
22082201
implicit ? SourceRange() : ObsoletedRange, implicit, isSPI());
22092202
}
22102203

@@ -2294,7 +2287,7 @@ SemanticAvailableAttr::getVersionAvailability(const ASTContext &ctx) const {
22942287
return AvailableVersionComparison::Unavailable;
22952288

22962289
llvm::VersionTuple queryVersion = getActiveVersion(ctx);
2297-
std::optional<llvm::VersionTuple> ObsoletedVersion = attr->Obsoleted;
2290+
std::optional<llvm::VersionTuple> ObsoletedVersion = getObsoleted();
22982291

22992292
StringRef ObsoletedPlatform;
23002293
llvm::VersionTuple RemappedObsoletedVersion;
@@ -2307,7 +2300,7 @@ SemanticAvailableAttr::getVersionAvailability(const ASTContext &ctx) const {
23072300
if (ObsoletedVersion && *ObsoletedVersion <= queryVersion)
23082301
return AvailableVersionComparison::Obsoleted;
23092302

2310-
std::optional<llvm::VersionTuple> IntroducedVersion = attr->Introduced;
2303+
std::optional<llvm::VersionTuple> IntroducedVersion = getIntroduced();
23112304
StringRef IntroducedPlatform;
23122305
llvm::VersionTuple RemappedIntroducedVersion;
23132306
if (AvailabilityInference::updateIntroducedPlatformForFallback(

lib/AST/Availability.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -794,10 +794,10 @@ SemanticAvailableAttr::getIntroducedRange(const ASTContext &Ctx) const {
794794
assert(getDomain().isActive(Ctx));
795795

796796
auto *attr = getParsedAttr();
797-
if (!attr->Introduced.has_value())
797+
if (!attr->getRawIntroduced().has_value())
798798
return AvailabilityRange::alwaysAvailable();
799799

800-
llvm::VersionTuple IntroducedVersion = attr->Introduced.value();
800+
llvm::VersionTuple IntroducedVersion = attr->getRawIntroduced().value();
801801
StringRef Platform;
802802
llvm::VersionTuple RemappedIntroducedVersion;
803803
if (AvailabilityInference::updateIntroducedPlatformForFallback(

0 commit comments

Comments
 (0)