Skip to content

Commit 8432c3d

Browse files
committed
Only use a single CXXExpansionSelectExpr
1 parent 66a2c59 commit 8432c3d

22 files changed

+59
-200
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3375,16 +3375,8 @@ class TemplateParamObjectDecl : public ValueDecl,
33753375
/// 'CXXExpansionStmtInstantiation' is. The latter is also what's used for
33763376
/// codegen and constant evaluation.
33773377
///
3378-
/// There are three kinds of expansion statements; they correspond to three
3379-
/// derived classes of 'CXXExpansionStmtPattern'. There is also a fourth derived
3380-
/// class that is used if we don't know what kind of expansion statement we're
3381-
/// dealing with (because the thing we're expanding is dependent). See the
3382-
/// comment on those classes for more information about how they work:
3383-
///
3384-
/// 1. CXXEnumeratingExpansionStmtPattern
3385-
/// 2. CXXIteratingExpansionStmtPattern
3386-
/// 3. CXXDestructuringExpansionStmtPattern
3387-
/// 4. CXXDependentExpansionStmtPattern
3378+
/// There are different kinds of expansion statements; see the comment on
3379+
/// 'CXXExpansionStmtPattern' for more information.
33883380
///
33893381
/// As an example, if the user writes the following expansion statement:
33903382
/// \verbatim
@@ -3394,10 +3386,9 @@ class TemplateParamObjectDecl : public ValueDecl,
33943386
/// }
33953387
/// \endverbatim
33963388
///
3397-
/// The 'CXXExpansionStmtPattern' of this particular 'CXXExpansionStmtDecl' is a
3398-
/// 'CXXDestructuringExpansionStmtPattern', which stores, amongst other things,
3399-
/// the declaration of the variable 'x' as well as the expansion-initializer
3400-
/// 'a'.
3389+
/// The 'CXXExpansionStmtPattern' of this particular 'CXXExpansionStmtDecl'
3390+
/// stores, amongst other things, the declaration of the variable 'x' as well
3391+
/// as the expansion-initializer 'a'.
34013392
///
34023393
/// After expansion, we end up with a 'CXXExpansionStmtInstantiation' that
34033394
/// is *equivalent* to the AST shown below. Note that only the inner '{}' (i.e.

clang/include/clang/AST/ExprCXX.h

Lines changed: 6 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5499,20 +5499,19 @@ class BuiltinBitCastExpr final
54995499
}
55005500
};
55015501

5502-
/// Helper that selects an expression from an expansion init list depending
5502+
/// Helper that selects an expression from an InitListExpr depending
55035503
/// on the current expansion index.
55045504
///
5505-
/// \see CXXEnumeratingExpansionStmtPattern
5506-
class CXXExpansionInitListSelectExpr : public Expr {
5505+
/// \see CXXExpansionStmtPattern
5506+
class CXXExpansionSelectExpr : public Expr {
55075507
friend class ASTStmtReader;
55085508

55095509
enum SubExpr { RANGE, INDEX, COUNT };
55105510
Expr *SubExprs[COUNT];
55115511

55125512
public:
5513-
CXXExpansionInitListSelectExpr(EmptyShell Empty);
5514-
CXXExpansionInitListSelectExpr(const ASTContext &C,
5515-
InitListExpr *Range, Expr *Idx);
5513+
CXXExpansionSelectExpr(EmptyShell Empty);
5514+
CXXExpansionSelectExpr(const ASTContext &C, InitListExpr *Range, Expr *Idx);
55165515

55175516
InitListExpr *getRangeExpr() {
55185517
return cast<InitListExpr>(SubExprs[RANGE]);
@@ -5543,61 +5542,9 @@ class CXXExpansionInitListSelectExpr : public Expr {
55435542
}
55445543

55455544
static bool classof(const Stmt *T) {
5546-
return T->getStmtClass() == CXXExpansionInitListSelectExprClass;
5545+
return T->getStmtClass() == CXXExpansionSelectExprClass;
55475546
}
55485547
};
5549-
5550-
/// This class serves the same purpose as CXXExpansionInitListSelectExpr, but
5551-
/// for destructuring expansion statements; that is, instead of selecting among
5552-
/// a list of expressions, it selects from a list of 'BindingDecl's.
5553-
///
5554-
/// \see CXXEnumeratingExpansionStmtPattern
5555-
/// \see CXXDestructuringExpansionStmtPattern
5556-
class CXXDestructuringExpansionSelectExpr : public Expr {
5557-
friend class ASTStmtReader;
5558-
5559-
DecompositionDecl *Decomposition;
5560-
Expr *Index;
5561-
5562-
public:
5563-
CXXDestructuringExpansionSelectExpr(EmptyShell Empty);
5564-
CXXDestructuringExpansionSelectExpr(const ASTContext &C,
5565-
DecompositionDecl *Decomposition,
5566-
Expr *Index);
5567-
5568-
DecompositionDecl *getDecompositionDecl() {
5569-
return cast<DecompositionDecl>(Decomposition);
5570-
}
5571-
5572-
const DecompositionDecl *getDecompositionDecl() const {
5573-
return cast<DecompositionDecl>(Decomposition);
5574-
}
5575-
5576-
void setDecompositionDecl(DecompositionDecl *E) { Decomposition = E; }
5577-
5578-
Expr *getIndexExpr() { return Index; }
5579-
const Expr *getIndexExpr() const { return Index; }
5580-
void setIndexExpr(Expr *E) { Index = E; }
5581-
5582-
SourceLocation getBeginLoc() const { return Decomposition->getBeginLoc(); }
5583-
SourceLocation getEndLoc() const { return Decomposition->getEndLoc(); }
5584-
5585-
child_range children() {
5586-
return child_range(reinterpret_cast<Stmt **>(&Index),
5587-
reinterpret_cast<Stmt **>(&Index + 1));
5588-
}
5589-
5590-
const_child_range children() const {
5591-
return const_child_range(
5592-
reinterpret_cast<Stmt **>(const_cast<Expr **>(&Index)),
5593-
reinterpret_cast<Stmt **>(const_cast<Expr **>(&Index + 1)));
5594-
}
5595-
5596-
static bool classof(const Stmt *T) {
5597-
return T->getStmtClass() == CXXDestructuringExpansionSelectExprClass;
5598-
}
5599-
};
5600-
56015548
} // namespace clang
56025549

56035550
#endif // LLVM_CLANG_AST_EXPRCXX_H

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3127,8 +3127,7 @@ DEF_TRAVERSE_STMT(RequiresExpr, {
31273127

31283128
DEF_TRAVERSE_STMT(CXXExpansionStmtPattern, {})
31293129
DEF_TRAVERSE_STMT(CXXExpansionStmtInstantiation, {})
3130-
DEF_TRAVERSE_STMT(CXXExpansionInitListSelectExpr, {})
3131-
DEF_TRAVERSE_STMT(CXXDestructuringExpansionSelectExpr, {})
3130+
DEF_TRAVERSE_STMT(CXXExpansionSelectExpr, {})
31323131

31333132
// These literals (all of them) do not need any action.
31343133
DEF_TRAVERSE_STMT(IntegerLiteral, {})

clang/include/clang/AST/StmtCXX.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,14 @@ class CoreturnStmt : public Stmt {
554554
/// Here, the '{ 1, 2, 3 }' is parsed as an 'InitListExpr'. This node
555555
/// handles storing (and pack-expanding) the individual expressions.
556556
///
557-
/// Sema then wraps this with a 'CXXExpansionInitListSelectExpr', which also
557+
/// Sema then wraps this with a 'CXXExpansionSelectExpr', which also
558558
/// contains a reference to an integral NTTP that is used as the expansion
559559
/// index; this index is either dependent (if the expansion-size is dependent),
560560
/// or set to a value of I in the I-th expansion during the expansion process.
561561
///
562-
/// The actual expansion is done by 'BuildCXXExpansionInitListSelectExpr()': for
562+
/// The actual expansion is done by 'BuildCXXExpansionSelectExpr()': for
563563
/// example, during the 2nd expansion of '{ a, b, c }', I is equal to 1, and
564-
/// BuildCXXExpansionInitListSelectExpr(), when called via TreeTransform,
564+
/// BuildCXXExpansionSelectExpr(), when called via TreeTransform,
565565
/// 'instantiates' the expression '{ a, b, c }' to just 'b'.
566566
///
567567
/// 2. Represents an unexpanded iterating expansion statement.
@@ -601,9 +601,8 @@ class CoreturnStmt : public Stmt {
601601
/// }
602602
/// \endverbatim
603603
///
604-
/// Sema wraps the initializer with a CXXDestructuringExpansionSelectExpr, which
605-
/// selects a binding based on the current expansion index; this is analogous to
606-
/// how 'CXXExpansionInitListSelectExpr' is used.
604+
/// Sema wraps the initializer with a CXXExpansionSelectExpr, which selects a
605+
/// binding based on the current expansion index.
607606
///
608607
/// 4. Represents an expansion statement whose expansion-initializer is
609608
/// type-dependent.

clang/include/clang/AST/TextNodeDumper.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,8 +313,6 @@ class TextNodeDumper
313313
void VisitSizeOfPackExpr(const SizeOfPackExpr *Node);
314314
void
315315
VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *Node);
316-
void VisitCXXDestructuringExpansionSelectExpr(
317-
const CXXDestructuringExpansionSelectExpr *Node);
318316
void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node);
319317
void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node);
320318
void VisitObjCMessageExpr(const ObjCMessageExpr *Node);

clang/include/clang/Basic/StmtNodes.td

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,7 @@ def ConceptSpecializationExpr : StmtNode<Expr>;
183183
def RequiresExpr : StmtNode<Expr>;
184184

185185
// C++26 Expansion statement support expressions
186-
def CXXExpansionInitListSelectExpr : StmtNode<Expr>;
187-
def CXXDestructuringExpansionSelectExpr : StmtNode<Expr>;
186+
def CXXExpansionSelectExpr : StmtNode<Expr>;
188187

189188
// Obj-C Expressions.
190189
def ObjCStringLiteral : StmtNode<Expr>;

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,18 +1923,17 @@ enum StmtCode {
19231923
EXPR_TYPE_TRAIT, // TypeTraitExpr
19241924
EXPR_ARRAY_TYPE_TRAIT, // ArrayTypeTraitIntExpr
19251925

1926-
EXPR_PACK_EXPANSION, // PackExpansionExpr
1927-
EXPR_PACK_INDEXING, // PackIndexingExpr
1928-
EXPR_SIZEOF_PACK, // SizeOfPackExpr
1929-
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM, // SubstNonTypeTemplateParmExpr
1930-
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK, // SubstNonTypeTemplateParmPackExpr
1931-
EXPR_FUNCTION_PARM_PACK, // FunctionParmPackExpr
1932-
EXPR_MATERIALIZE_TEMPORARY, // MaterializeTemporaryExpr
1933-
EXPR_CXX_FOLD, // CXXFoldExpr
1934-
EXPR_CONCEPT_SPECIALIZATION, // ConceptSpecializationExpr
1935-
EXPR_REQUIRES, // RequiresExpr
1936-
EXPR_CXX_EXPANSION_INIT_LIST_SELECT, // CXXExpansionInitListSelectExpr
1937-
EXPR_CXX_DESTRUCTURING_EXPANSION_SELECT, // CXXDestructuringExpansionSelectExpr
1926+
EXPR_PACK_EXPANSION, // PackExpansionExpr
1927+
EXPR_PACK_INDEXING, // PackIndexingExpr
1928+
EXPR_SIZEOF_PACK, // SizeOfPackExpr
1929+
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM, // SubstNonTypeTemplateParmExpr
1930+
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK, // SubstNonTypeTemplateParmPackExpr
1931+
EXPR_FUNCTION_PARM_PACK, // FunctionParmPackExpr
1932+
EXPR_MATERIALIZE_TEMPORARY, // MaterializeTemporaryExpr
1933+
EXPR_CXX_FOLD, // CXXFoldExpr
1934+
EXPR_CONCEPT_SPECIALIZATION, // ConceptSpecializationExpr
1935+
EXPR_REQUIRES, // RequiresExpr
1936+
EXPR_CXX_EXPANSION_SELECT, // CXXExpansionSelectExpr
19381937

19391938
// CUDA
19401939
EXPR_CUDA_KERNEL_CALL, // CUDAKernelCallExpr

clang/lib/AST/ASTImporter.cpp

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -704,10 +704,7 @@ namespace clang {
704704
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr *E);
705705
ExpectedStmt VisitPseudoObjectExpr(PseudoObjectExpr *E);
706706
ExpectedStmt VisitCXXParenListInitExpr(CXXParenListInitExpr *E);
707-
ExpectedStmt
708-
VisitCXXExpansionInitListSelectExpr(CXXExpansionInitListSelectExpr *E);
709-
ExpectedStmt VisitCXXDestructuringExpansionSelectExpr(
710-
CXXDestructuringExpansionSelectExpr *E);
707+
ExpectedStmt VisitCXXExpansionSelectExpr(CXXExpansionSelectExpr *E);
711708

712709
// Helper for chaining together multiple imports. If an error is detected,
713710
// subsequent imports will return default constructed nodes, so that failure
@@ -9457,28 +9454,16 @@ ASTNodeImporter::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {
94579454
ToInitLoc, ToBeginLoc, ToEndLoc);
94589455
}
94599456

9460-
ExpectedStmt ASTNodeImporter::VisitCXXExpansionInitListSelectExpr(
9461-
CXXExpansionInitListSelectExpr *E) {
9457+
ExpectedStmt ASTNodeImporter::VisitCXXExpansionSelectExpr(
9458+
CXXExpansionSelectExpr *E) {
94629459
Error Err = Error::success();
94639460
auto ToRange = importChecked(Err, E->getRangeExpr());
94649461
auto ToIndex = importChecked(Err, E->getIndexExpr());
94659462
if (Err)
94669463
return std::move(Err);
94679464

94689465
return new (Importer.getToContext())
9469-
CXXExpansionInitListSelectExpr(Importer.getToContext(), ToRange, ToIndex);
9470-
}
9471-
9472-
ExpectedStmt ASTNodeImporter::VisitCXXDestructuringExpansionSelectExpr(
9473-
CXXDestructuringExpansionSelectExpr *E) {
9474-
Error Err = Error::success();
9475-
auto ToDecompositionDecl = importChecked(Err, E->getDecompositionDecl());
9476-
auto ToIndex = importChecked(Err, E->getIndexExpr());
9477-
if (Err)
9478-
return std::move(Err);
9479-
9480-
return new (Importer.getToContext()) CXXDestructuringExpansionSelectExpr(
9481-
Importer.getToContext(), ToDecompositionDecl, ToIndex);
9466+
CXXExpansionSelectExpr(Importer.getToContext(), ToRange, ToIndex);
94829467
}
94839468

94849469
Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,

clang/lib/AST/Expr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3688,8 +3688,7 @@ bool Expr::HasSideEffects(const ASTContext &Ctx,
36883688
case FunctionParmPackExprClass:
36893689
case RecoveryExprClass:
36903690
case CXXFoldExprClass:
3691-
case CXXExpansionInitListSelectExprClass:
3692-
case CXXDestructuringExpansionSelectExprClass:
3691+
case CXXExpansionSelectExprClass:
36933692
// Make a conservative assumption for dependent nodes.
36943693
return IncludePossibleEffects;
36953694

clang/lib/AST/ExprCXX.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,26 +2021,14 @@ CXXFoldExpr::CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee,
20212021
setDependence(computeDependence(this));
20222022
}
20232023

2024-
CXXExpansionInitListSelectExpr::CXXExpansionInitListSelectExpr(EmptyShell Empty)
2025-
: Expr(CXXExpansionInitListSelectExprClass, Empty) {}
2024+
CXXExpansionSelectExpr::CXXExpansionSelectExpr(EmptyShell Empty)
2025+
: Expr(CXXExpansionSelectExprClass, Empty) {}
20262026

2027-
CXXExpansionInitListSelectExpr::CXXExpansionInitListSelectExpr(
2027+
CXXExpansionSelectExpr::CXXExpansionSelectExpr(
20282028
const ASTContext &C, InitListExpr *Range, Expr *Idx)
2029-
: Expr(CXXExpansionInitListSelectExprClass, C.DependentTy, VK_PRValue,
2029+
: Expr(CXXExpansionSelectExprClass, C.DependentTy, VK_PRValue,
20302030
OK_Ordinary) {
20312031
setDependence(ExprDependence::TypeValueInstantiation);
20322032
SubExprs[RANGE] = Range;
20332033
SubExprs[INDEX] = Idx;
20342034
}
2035-
2036-
CXXDestructuringExpansionSelectExpr::CXXDestructuringExpansionSelectExpr(
2037-
EmptyShell Empty)
2038-
: Expr(CXXDestructuringExpansionSelectExprClass, Empty) {}
2039-
2040-
CXXDestructuringExpansionSelectExpr::CXXDestructuringExpansionSelectExpr(
2041-
const ASTContext &C, DecompositionDecl *Decomposition, Expr *Index)
2042-
: Expr(CXXDestructuringExpansionSelectExprClass, C.DependentTy, VK_PRValue,
2043-
OK_Ordinary),
2044-
Decomposition(Decomposition), Index(Index) {
2045-
setDependence(ExprDependence::TypeValueInstantiation);
2046-
}

0 commit comments

Comments
 (0)