[clang] [clang][NFC] Clean up InitializedEntitiy booleans. (PR #185335)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 8 18:41:13 PDT 2026
https://github.com/efriedma-quic created https://github.com/llvm/llvm-project/pull/185335
As discussed in #182203, use enums instead.
I tried to name/use them appropriately, but I'm not sure sure I'm really happy with the results; suggestions welcome.
>From 48d28f4d0c2b62ffd859ababde43c972b9e13d2a Mon Sep 17 00:00:00 2001
From: Eli Friedman <efriedma at qti.qualcomm.com>
Date: Sun, 8 Mar 2026 18:36:39 -0700
Subject: [PATCH] [clang][NFC] Clean up InitializedEntitiy booleans.
As discussed in #182203, use enums instead.
I tried to name/use them appropriately, but I'm not sure sure I'm really
happy with the results; suggestions welcome.
---
clang/include/clang/Sema/Initialization.h | 75 +++++++++++++----------
clang/lib/Sema/SemaDeclCXX.cpp | 19 +++---
clang/lib/Sema/SemaExprCXX.cpp | 9 +--
clang/lib/Sema/SemaInit.cpp | 2 +-
4 files changed, 60 insertions(+), 45 deletions(-)
diff --git a/clang/include/clang/Sema/Initialization.h b/clang/include/clang/Sema/Initialization.h
index 1978ac41c58a4..b9d6a63a6c6e4 100644
--- a/clang/include/clang/Sema/Initialization.h
+++ b/clang/include/clang/Sema/Initialization.h
@@ -136,6 +136,19 @@ class alignas(8) InitializedEntity {
// that diagnostic text needs to be updated as well.
};
+ enum NRVOKind { NoNRVO, NRVOAllowed };
+
+ enum NewArrayKind {
+ KnownLengthNewArray,
+ UnknownLengthNewArray,
+ };
+
+ enum ImplicitFieldInitKind { NotImplicitFieldInit, ImplicitFieldInit };
+
+ enum DefaultMemberInitKind { NotDefaultMemberInit, DefaultMemberInit };
+
+ enum ParenAggInitKind { NotParenAggInit, ParenAggInit };
+
private:
/// The kind of entity being initialized.
EntityKind Kind;
@@ -159,11 +172,11 @@ class alignas(8) InitializedEntity {
/// Whether the entity being initialized may end up using the
/// named return value optimization (NRVO).
- bool NRVO;
+ NRVOKind IsNRVO;
/// When Kind == EK_New, whether this is initializing an array of runtime
/// size (which needs an array filler).
- bool VariableLengthArrayNew;
+ NewArrayKind IsVariableLengthArrayNew;
};
struct VD {
@@ -174,11 +187,11 @@ class alignas(8) InitializedEntity {
/// When Kind == EK_Member, whether this is an implicit member
/// initialization in a copy or move constructor. These can perform array
/// copies.
- bool IsImplicitFieldInit;
+ ImplicitFieldInitKind IsImplicitFieldInit;
/// When Kind == EK_Member, whether this is the initial initialization
/// check for a default member initializer.
- bool IsDefaultMemberInit;
+ DefaultMemberInitKind IsDefaultMemberInit;
};
struct C {
@@ -225,24 +238,24 @@ class alignas(8) InitializedEntity {
/// Create the initialization entity for a variable.
InitializedEntity(VarDecl *Var, EntityKind EK = EK_Variable)
- : Kind(EK), Type(Var->getType()), Variable{Var, false, false} {}
+ : Kind(EK), Type(Var->getType()),
+ Variable{Var, NotImplicitFieldInit, NotDefaultMemberInit} {}
/// Create the initialization entity for the result of a
/// function, throwing an object, performing an explicit cast, or
/// initializing a parameter for which there is no declaration.
InitializedEntity(EntityKind Kind, SourceLocation Loc, QualType Type,
- bool NRVO = false, bool VariableLengthArrayNew = false)
+ NRVOKind IsNRVO = NoNRVO,
+ NewArrayKind VariableLengthArrayNew = KnownLengthNewArray)
: Kind(Kind), Type(Type) {
- new (&LocAndNRVO) LN;
- LocAndNRVO.Location = Loc;
- LocAndNRVO.NRVO = NRVO;
- LocAndNRVO.VariableLengthArrayNew = VariableLengthArrayNew;
+ new (&LocAndNRVO) LN{Loc, IsNRVO, VariableLengthArrayNew};
}
/// Create the initialization entity for a member subobject.
InitializedEntity(FieldDecl *Member, const InitializedEntity *Parent,
- bool Implicit, bool DefaultMemberInit,
- bool IsParenAggInit = false)
+ ImplicitFieldInitKind Implicit,
+ DefaultMemberInitKind DefaultMemberInit,
+ ParenAggInitKind IsParenAggInit)
: Kind(IsParenAggInit ? EK_ParenAggInitMember : EK_Member),
Parent(Parent), Type(Member->getType()),
Variable{Member, Implicit, DefaultMemberInit} {}
@@ -254,9 +267,7 @@ class alignas(8) InitializedEntity {
/// Create the initialization entity for a lambda capture.
InitializedEntity(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc)
: Kind(EK_LambdaCapture), Type(FieldType) {
- new (&Capture) C;
- Capture.VarID = VarID;
- Capture.Location = Loc;
+ new (&Capture) C{VarID, Loc};
}
public:
@@ -307,7 +318,7 @@ class alignas(8) InitializedEntity {
Entity.Kind = EK_TemplateParameter;
Entity.Type = T;
Entity.Parent = nullptr;
- Entity.Variable = {Param, false, false};
+ Entity.Variable = {Param, NotImplicitFieldInit, NotDefaultMemberInit};
return Entity;
}
@@ -340,10 +351,11 @@ class alignas(8) InitializedEntity {
}
/// Create the initialization entity for an object allocated via new.
- static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type,
- bool VariableLengthArrayNew) {
- return InitializedEntity(EK_New, NewLoc, Type, /*NRVO=*/false,
- VariableLengthArrayNew);
+ static InitializedEntity
+ InitializeNew(SourceLocation NewLoc, QualType Type,
+ NewArrayKind IsVariableLengthArrayNew) {
+ return InitializedEntity(EK_New, NewLoc, Type, NoNRVO,
+ IsVariableLengthArrayNew);
}
/// Create the initialization entity for a temporary.
@@ -392,32 +404,33 @@ class alignas(8) InitializedEntity {
/// Create the initialization entity for a member subobject.
static InitializedEntity
- InitializeMember(FieldDecl *Member,
- const InitializedEntity *Parent = nullptr,
- bool Implicit = false) {
- return InitializedEntity(Member, Parent, Implicit, false);
+ InitializeMember(FieldDecl *Member, const InitializedEntity *Parent = nullptr,
+ ImplicitFieldInitKind Implicit = NotImplicitFieldInit) {
+ return InitializedEntity(Member, Parent, Implicit, NotDefaultMemberInit,
+ NotParenAggInit);
}
/// Create the initialization entity for a member subobject.
static InitializedEntity
InitializeMember(IndirectFieldDecl *Member,
const InitializedEntity *Parent = nullptr,
- bool Implicit = false) {
- return InitializedEntity(Member->getAnonField(), Parent, Implicit, false);
+ ImplicitFieldInitKind Implicit = NotImplicitFieldInit) {
+ return InitializedEntity(Member->getAnonField(), Parent, Implicit,
+ NotDefaultMemberInit, NotParenAggInit);
}
/// Create the initialization entity for a member subobject initialized via
/// parenthesized aggregate init.
static InitializedEntity InitializeMemberFromParenAggInit(FieldDecl *Member) {
- return InitializedEntity(Member, /*Parent=*/nullptr, /*Implicit=*/false,
- /*DefaultMemberInit=*/false,
- /*IsParenAggInit=*/true);
+ return InitializedEntity(Member, /*Parent=*/nullptr, NotImplicitFieldInit,
+ NotDefaultMemberInit, NotParenAggInit);
}
/// Create the initialization entity for a default member initializer.
static InitializedEntity
InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member) {
- return InitializedEntity(Member, nullptr, false, true);
+ return InitializedEntity(Member, nullptr, NotImplicitFieldInit,
+ DefaultMemberInit, NotParenAggInit);
}
/// Create the initialization entity for an array element.
@@ -513,7 +526,7 @@ class alignas(8) InitializedEntity {
/// Determine whether this is an array new with an unknown bound.
bool isVariableLengthArrayNew() const {
- return getKind() == EK_New && LocAndNRVO.VariableLengthArrayNew;
+ return getKind() == EK_New && LocAndNRVO.IsVariableLengthArrayNew;
}
/// Is this the implicit initialization of a member of a class from
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 2ae6e5de0e3ee..469868b039b58 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -5044,10 +5044,10 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
}
InitializedEntity Entity =
- Indirect ? InitializedEntity::InitializeMember(Indirect, nullptr,
- /*Implicit*/ true)
- : InitializedEntity::InitializeMember(Field, nullptr,
- /*Implicit*/ true);
+ Indirect ? InitializedEntity::InitializeMember(
+ Indirect, nullptr, InitializedEntity::ImplicitFieldInit)
+ : InitializedEntity::InitializeMember(
+ Field, nullptr, InitializedEntity::ImplicitFieldInit);
// Direct-initialize to use the copy constructor.
InitializationKind InitKind =
@@ -5078,10 +5078,10 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
if (FieldBaseElementType->isRecordType()) {
InitializedEntity InitEntity =
- Indirect ? InitializedEntity::InitializeMember(Indirect, nullptr,
- /*Implicit*/ true)
- : InitializedEntity::InitializeMember(Field, nullptr,
- /*Implicit*/ true);
+ Indirect ? InitializedEntity::InitializeMember(
+ Indirect, nullptr, InitializedEntity::ImplicitFieldInit)
+ : InitializedEntity::InitializeMember(
+ Field, nullptr, InitializedEntity::ImplicitFieldInit);
InitializationKind InitKind =
InitializationKind::CreateDefault(Loc);
@@ -5282,7 +5282,8 @@ static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
if (DIE.isInvalid())
return true;
- auto Entity = InitializedEntity::InitializeMember(Field, nullptr, true);
+ auto Entity = InitializedEntity::InitializeMember(
+ Field, nullptr, InitializedEntity::ImplicitFieldInit);
SemaRef.checkInitializerLifetime(Entity, DIE.get());
CXXCtorInitializer *Init;
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 5a5bbf4d900dc..1312c78f96751 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -2206,9 +2206,8 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
<< /*array*/ 2
<< (*ArraySize ? (*ArraySize)->getSourceRange() : TypeRange));
- InitializedEntity Entity =
- InitializedEntity::InitializeNew(StartLoc, AllocType,
- /*VariableLengthArrayNew=*/false);
+ InitializedEntity Entity = InitializedEntity::InitializeNew(
+ StartLoc, AllocType, InitializedEntity::KnownLengthNewArray);
AllocType = DeduceTemplateSpecializationFromInitializer(
AllocTypeInfo, Entity, Kind, Exprs);
if (AllocType.isNull())
@@ -2592,7 +2591,9 @@ ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal,
bool VariableLengthArrayNew = ArraySize && *ArraySize && !KnownArraySize;
InitializedEntity Entity = InitializedEntity::InitializeNew(
- StartLoc, InitType, VariableLengthArrayNew);
+ StartLoc, InitType,
+ VariableLengthArrayNew ? InitializedEntity::UnknownLengthNewArray
+ : InitializedEntity::KnownLengthNewArray);
InitializationSequence InitSeq(*this, Entity, Kind, Exprs);
ExprResult FullInit = InitSeq.Perform(*this, Entity, Kind, Exprs);
if (FullInit.isInvalid())
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 48be03bb2f0f8..9dd0b948747e3 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -3847,7 +3847,7 @@ bool InitializedEntity::allowsNRVO() const {
switch (getKind()) {
case EK_Result:
case EK_Exception:
- return LocAndNRVO.NRVO;
+ return LocAndNRVO.IsNRVO;
case EK_StmtExprResult:
case EK_Variable:
More information about the cfe-commits
mailing list