diff --git a/include/swift/AST/AvailabilityConstraint.h b/include/swift/AST/AvailabilityConstraint.h index 417bf06afddba..5d7c2bb648d48 100644 --- a/include/swift/AST/AvailabilityConstraint.h +++ b/include/swift/AST/AvailabilityConstraint.h @@ -59,11 +59,10 @@ class AvailabilityConstraint { }; private: - Kind kind; - SemanticAvailableAttr attr; + llvm::PointerIntPair attrAndKind; AvailabilityConstraint(Kind kind, SemanticAvailableAttr attr) - : kind(kind), attr(attr) {}; + : attrAndKind(attr, kind) {}; public: static AvailabilityConstraint @@ -84,8 +83,10 @@ class AvailabilityConstraint { return AvailabilityConstraint(Kind::IntroducedInNewerVersion, attr); } - Kind getKind() const { return kind; } - SemanticAvailableAttr getAttr() const { return attr; } + Kind getKind() const { return attrAndKind.getInt(); } + SemanticAvailableAttr getAttr() const { + return static_cast(attrAndKind.getPointer()); + } /// Returns the platform that this constraint applies to, or /// `PlatformKind::none` if it is not platform specific. diff --git a/lib/AST/Availability.cpp b/lib/AST/Availability.cpp index 935d47f345cda..e8eb2e97121c7 100644 --- a/lib/AST/Availability.cpp +++ b/lib/AST/Availability.cpp @@ -68,24 +68,24 @@ AvailabilityRange AvailabilityRange::forRuntimeTarget(const ASTContext &Ctx) { } PlatformKind AvailabilityConstraint::getPlatform() const { - return attr.getPlatform(); + return getAttr().getPlatform(); } std::optional AvailabilityConstraint::getRequiredNewerAvailabilityRange( ASTContext &ctx) const { - switch (kind) { + switch (getKind()) { case Kind::AlwaysUnavailable: case Kind::RequiresVersion: case Kind::Obsoleted: return std::nullopt; case Kind::IntroducedInNewerVersion: - return attr.getIntroducedRange(ctx); + return getAttr().getIntroducedRange(ctx); } } bool AvailabilityConstraint::isConditionallySatisfiable() const { - switch (kind) { + switch (getKind()) { case Kind::AlwaysUnavailable: case Kind::RequiresVersion: case Kind::Obsoleted: @@ -96,10 +96,10 @@ bool AvailabilityConstraint::isConditionallySatisfiable() const { } bool AvailabilityConstraint::isActiveForRuntimeQueries(ASTContext &ctx) const { - if (attr.getPlatform() == PlatformKind::none) + if (getAttr().getPlatform() == PlatformKind::none) return true; - return swift::isPlatformActive(attr.getPlatform(), ctx.LangOpts, + return swift::isPlatformActive(getAttr().getPlatform(), ctx.LangOpts, /*forTargetVariant=*/false, /*forRuntimeQuery=*/true); }