Skip to content

Commit 1a7bdb4

Browse files
committed
AST: Shave a yak in ProtocolDecl
1 parent 839063c commit 1a7bdb4

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

include/swift/AST/Decl.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
598598
IsComputingSemanticMembers : 1
599599
);
600600

601-
SWIFT_INLINE_BITFIELD_FULL(ProtocolDecl, NominalTypeDecl, 1+1+1+1+1+1+1+1+1+1+1+1+1+8,
601+
SWIFT_INLINE_BITFIELD_FULL(ProtocolDecl, NominalTypeDecl, 1+1+1+1+1+1+1+1+1+1+1+1+1+1+8,
602602
/// Whether the \c RequiresClass bit is valid.
603603
RequiresClassValid : 1,
604604

@@ -625,6 +625,9 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
625625
/// Whether we've computed the inherited protocols list yet.
626626
InheritedProtocolsValid : 1,
627627

628+
/// Whether we have computed a requirement signature.
629+
HasRequirementSignature : 1,
630+
628631
/// Whether we have a lazy-loaded requirement signature.
629632
HasLazyRequirementSignature : 1,
630633

@@ -5126,7 +5129,7 @@ class ProtocolDecl final : public NominalTypeDecl {
51265129

51275130
/// The generic signature representing exactly the new requirements introduced
51285131
/// by this protocol.
5129-
std::optional<RequirementSignature> RequirementSig;
5132+
RequirementSignature RequirementSig;
51305133

51315134
/// Returns the cached result of \c requiresClass or \c None if it hasn't yet
51325135
/// been computed.
@@ -5435,7 +5438,7 @@ class ProtocolDecl final : public NominalTypeDecl {
54355438

54365439
/// Has the requirement signature been computed yet?
54375440
bool isRequirementSignatureComputed() const {
5438-
return RequirementSig.has_value();
5441+
return Bits.ProtocolDecl.HasRequirementSignature;
54395442
}
54405443

54415444
void setRequirementSignature(RequirementSignature requirementSig);

lib/AST/Decl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6436,6 +6436,8 @@ ProtocolDecl::ProtocolDecl(DeclContext *DC, SourceLoc ProtocolLoc,
64366436
Bits.ProtocolDecl.KnownProtocol = 0;
64376437
Bits.ProtocolDecl.HasAssociatedTypes = 0;
64386438
Bits.ProtocolDecl.HasLazyAssociatedTypes = 0;
6439+
Bits.ProtocolDecl.HasRequirementSignature = 0;
6440+
Bits.ProtocolDecl.HasLazyRequirementSignature = 0;
64396441
Bits.ProtocolDecl.ProtocolRequirementsValid = false;
64406442
setTrailingWhereClause(TrailingWhere);
64416443
}
@@ -6682,12 +6684,13 @@ bool ProtocolDecl::isComputingRequirementSignature() const {
66826684

66836685
void ProtocolDecl::setRequirementSignature(RequirementSignature requirementSig) {
66846686
RequirementSig = requirementSig;
6687+
Bits.ProtocolDecl.HasRequirementSignature = 1;
66856688
}
66866689

66876690
void
66886691
ProtocolDecl::setLazyRequirementSignature(LazyMemberLoader *lazyLoader,
66896692
uint64_t requirementSignatureData) {
6690-
assert(!RequirementSig && "requirement signature already set");
6693+
assert(!isRequirementSignatureComputed() && "requirement signature already set");
66916694

66926695
auto contextData = static_cast<LazyProtocolData *>(
66936696
getASTContext().getOrCreateLazyContextData(this, lazyLoader));

lib/AST/TypeCheckRequests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ std::optional<RequirementSignature>
330330
RequirementSignatureRequest::getCachedResult() const {
331331
auto proto = std::get<0>(getStorage());
332332
if (proto->isRequirementSignatureComputed())
333-
return *proto->RequirementSig;
333+
return proto->RequirementSig;
334334

335335
return std::nullopt;
336336
}

0 commit comments

Comments
 (0)