Skip to content

Commit f7c71f1

Browse files
authored
[Clang][P1061] Consolidate ResolvedUnpexandedPackExpr into FunctionParmPackExpr (#125394)
This merges the functionality of ResolvedUnexpandedPackExpr into FunctionParmPackExpr. I also added a test to show that #125103 should be fixed with this. I put the removal of ResolvedUnexpandedPackExpr in its own commit. Let me know what you think. Fixes #125103
1 parent 6a360b3 commit f7c71f1

29 files changed

+130
-355
lines changed

clang/include/clang/AST/DeclCXX.h

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4194,8 +4194,8 @@ class BindingDecl : public ValueDecl {
41944194
/// decomposition declaration, and when the initializer is type-dependent.
41954195
Expr *getBinding() const { return Binding; }
41964196

4197-
// Get the array of Exprs when the binding represents a pack.
4198-
llvm::ArrayRef<Expr *> getBindingPackExprs() const;
4197+
// Get the array of nested BindingDecls when the binding represents a pack.
4198+
llvm::ArrayRef<BindingDecl *> getBindingPackDecls() const;
41994199

42004200
/// Get the decomposition declaration that this binding represents a
42014201
/// decomposition of.
@@ -4246,10 +4246,8 @@ class DecompositionDecl final
42464246
for (auto *B : Bindings) {
42474247
B->setDecomposedDecl(this);
42484248
if (B->isParameterPack() && B->getBinding()) {
4249-
for (Expr *E : B->getBindingPackExprs()) {
4250-
auto *DRE = cast<DeclRefExpr>(E);
4251-
auto *NestedB = cast<BindingDecl>(DRE->getDecl());
4252-
NestedB->setDecomposedDecl(this);
4249+
for (BindingDecl *NestedBD : B->getBindingPackDecls()) {
4250+
NestedBD->setDecomposedDecl(this);
42534251
}
42544252
}
42554253
}
@@ -4278,25 +4276,21 @@ class DecompositionDecl final
42784276
// Provide a flattened range to visit each binding.
42794277
auto flat_bindings() const {
42804278
llvm::ArrayRef<BindingDecl *> Bindings = bindings();
4281-
llvm::ArrayRef<Expr *> PackExprs;
4279+
llvm::ArrayRef<BindingDecl *> PackBindings;
42824280

42834281
// Split the bindings into subranges split by the pack.
4284-
auto S1 = Bindings.take_until(
4282+
llvm::ArrayRef<BindingDecl *> BeforePackBindings = Bindings.take_until(
42854283
[](BindingDecl *BD) { return BD->isParameterPack(); });
42864284

4287-
Bindings = Bindings.drop_front(S1.size());
4285+
Bindings = Bindings.drop_front(BeforePackBindings.size());
42884286
if (!Bindings.empty()) {
4289-
PackExprs = Bindings.front()->getBindingPackExprs();
4287+
PackBindings = Bindings.front()->getBindingPackDecls();
42904288
Bindings = Bindings.drop_front();
42914289
}
42924290

4293-
auto S2 = llvm::map_range(PackExprs, [](Expr *E) {
4294-
auto *DRE = cast<DeclRefExpr>(E);
4295-
return cast<BindingDecl>(DRE->getDecl());
4296-
});
4297-
4298-
return llvm::concat<BindingDecl *>(std::move(S1), std::move(S2),
4299-
std::move(Bindings));
4291+
return llvm::concat<BindingDecl *const>(std::move(BeforePackBindings),
4292+
std::move(PackBindings),
4293+
std::move(Bindings));
43004294
}
43014295

43024296
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override;

clang/include/clang/AST/ExprCXX.h

Lines changed: 12 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4633,8 +4633,8 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
46334633
}
46344634
};
46354635

4636-
/// Represents a reference to a function parameter pack or init-capture pack
4637-
/// that has been substituted but not yet expanded.
4636+
/// Represents a reference to a function parameter pack, init-capture pack,
4637+
/// or binding pack that has been substituted but not yet expanded.
46384638
///
46394639
/// When a pack expansion contains multiple parameter packs at different levels,
46404640
/// this node is used to represent a function parameter pack at an outer level
@@ -4649,49 +4649,48 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
46494649
/// \endcode
46504650
class FunctionParmPackExpr final
46514651
: public Expr,
4652-
private llvm::TrailingObjects<FunctionParmPackExpr, VarDecl *> {
4652+
private llvm::TrailingObjects<FunctionParmPackExpr, ValueDecl *> {
46534653
friend class ASTReader;
46544654
friend class ASTStmtReader;
46554655
friend TrailingObjects;
46564656

46574657
/// The function parameter pack which was referenced.
4658-
VarDecl *ParamPack;
4658+
ValueDecl *ParamPack;
46594659

46604660
/// The location of the function parameter pack reference.
46614661
SourceLocation NameLoc;
46624662

46634663
/// The number of expansions of this pack.
46644664
unsigned NumParameters;
46654665

4666-
FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
4667-
SourceLocation NameLoc, unsigned NumParams,
4668-
VarDecl *const *Params);
4666+
FunctionParmPackExpr(QualType T, ValueDecl *ParamPack, SourceLocation NameLoc,
4667+
unsigned NumParams, ValueDecl *const *Params);
46694668

46704669
public:
46714670
static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T,
4672-
VarDecl *ParamPack,
4671+
ValueDecl *ParamPack,
46734672
SourceLocation NameLoc,
4674-
ArrayRef<VarDecl *> Params);
4673+
ArrayRef<ValueDecl *> Params);
46754674
static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context,
46764675
unsigned NumParams);
46774676

46784677
/// Get the parameter pack which this expression refers to.
4679-
VarDecl *getParameterPack() const { return ParamPack; }
4678+
ValueDecl *getParameterPack() const { return ParamPack; }
46804679

46814680
/// Get the location of the parameter pack.
46824681
SourceLocation getParameterPackLocation() const { return NameLoc; }
46834682

46844683
/// Iterators over the parameters which the parameter pack expanded
46854684
/// into.
4686-
using iterator = VarDecl * const *;
4687-
iterator begin() const { return getTrailingObjects<VarDecl *>(); }
4685+
using iterator = ValueDecl *const *;
4686+
iterator begin() const { return getTrailingObjects<ValueDecl *>(); }
46884687
iterator end() const { return begin() + NumParameters; }
46894688

46904689
/// Get the number of parameters in this parameter pack.
46914690
unsigned getNumExpansions() const { return NumParameters; }
46924691

46934692
/// Get an expansion of the parameter pack by index.
4694-
VarDecl *getExpansion(unsigned I) const { return begin()[I]; }
4693+
ValueDecl *getExpansion(unsigned I) const { return begin()[I]; }
46954694

46964695
SourceLocation getBeginLoc() const LLVM_READONLY { return NameLoc; }
46974696
SourceLocation getEndLoc() const LLVM_READONLY { return NameLoc; }
@@ -5319,59 +5318,6 @@ class BuiltinBitCastExpr final
53195318
}
53205319
};
53215320

5322-
// Represents an unexpanded pack where the list of expressions are
5323-
// known. These are used when structured bindings introduce a pack.
5324-
class ResolvedUnexpandedPackExpr final
5325-
: public Expr,
5326-
private llvm::TrailingObjects<ResolvedUnexpandedPackExpr, Expr *> {
5327-
friend class ASTStmtReader;
5328-
friend class ASTStmtWriter;
5329-
friend TrailingObjects;
5330-
5331-
SourceLocation BeginLoc;
5332-
unsigned NumExprs;
5333-
5334-
ResolvedUnexpandedPackExpr(SourceLocation BL, QualType QT, unsigned NumExprs);
5335-
5336-
public:
5337-
static ResolvedUnexpandedPackExpr *CreateDeserialized(ASTContext &C,
5338-
unsigned NumExprs);
5339-
static ResolvedUnexpandedPackExpr *
5340-
Create(ASTContext &C, SourceLocation BeginLoc, QualType T, unsigned NumExprs);
5341-
static ResolvedUnexpandedPackExpr *Create(ASTContext &C,
5342-
SourceLocation BeginLoc, QualType T,
5343-
llvm::ArrayRef<Expr *> Exprs);
5344-
5345-
unsigned getNumExprs() const { return NumExprs; }
5346-
5347-
llvm::MutableArrayRef<Expr *> getExprs() {
5348-
return {getTrailingObjects<Expr *>(), NumExprs};
5349-
}
5350-
5351-
llvm::ArrayRef<Expr *> getExprs() const {
5352-
return {getTrailingObjects<Expr *>(), NumExprs};
5353-
}
5354-
5355-
Expr *getExpansion(unsigned Idx) { return getExprs()[Idx]; }
5356-
Expr *getExpansion(unsigned Idx) const { return getExprs()[Idx]; }
5357-
5358-
// Iterators
5359-
child_range children() {
5360-
return child_range((Stmt **)getTrailingObjects<Expr *>(),
5361-
(Stmt **)getTrailingObjects<Expr *>() + getNumExprs());
5362-
}
5363-
5364-
SourceLocation getBeginLoc() const LLVM_READONLY { return BeginLoc; }
5365-
SourceLocation getEndLoc() const LLVM_READONLY { return BeginLoc; }
5366-
5367-
// Returns the resolved pack of a decl or nullptr
5368-
static ResolvedUnexpandedPackExpr *getFromDecl(Decl *);
5369-
5370-
static bool classof(const Stmt *T) {
5371-
return T->getStmtClass() == ResolvedUnexpandedPackExprClass;
5372-
}
5373-
};
5374-
53755321
} // namespace clang
53765322

53775323
#endif // LLVM_CLANG_AST_EXPRCXX_H

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2950,7 +2950,6 @@ DEF_TRAVERSE_STMT(FunctionParmPackExpr, {})
29502950
DEF_TRAVERSE_STMT(CXXFoldExpr, {})
29512951
DEF_TRAVERSE_STMT(AtomicExpr, {})
29522952
DEF_TRAVERSE_STMT(CXXParenListInitExpr, {})
2953-
DEF_TRAVERSE_STMT(ResolvedUnexpandedPackExpr, {})
29542953

29552954
DEF_TRAVERSE_STMT(MaterializeTemporaryExpr, {
29562955
if (S->getLifetimeExtendedTemporaryDecl()) {

clang/include/clang/Basic/StmtNodes.td

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ def MaterializeTemporaryExpr : StmtNode<Expr>;
163163
def LambdaExpr : StmtNode<Expr>;
164164
def CXXFoldExpr : StmtNode<Expr>;
165165
def CXXParenListInitExpr: StmtNode<Expr>;
166-
def ResolvedUnexpandedPackExpr : StmtNode<Expr>;
167166

168167
// C++ Coroutines expressions
169168
def CoroutineSuspendExpr : StmtNode<Expr, 1>;

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,7 @@ void threadSafetyCleanup(BeforeSet *Cache);
232232

233233
// FIXME: No way to easily map from TemplateTypeParmTypes to
234234
// TemplateTypeParmDecls, so we have this horrible PointerUnion.
235-
typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *,
236-
ResolvedUnexpandedPackExpr *>,
235+
typedef std::pair<llvm::PointerUnion<const TemplateTypeParmType *, NamedDecl *>,
237236
SourceLocation>
238237
UnexpandedParameterPack;
239238

clang/include/clang/Sema/Template.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ enum class TemplateSubstitutionKind : char {
365365
class LocalInstantiationScope {
366366
public:
367367
/// A set of declarations.
368-
using DeclArgumentPack = SmallVector<VarDecl *, 4>;
368+
using DeclArgumentPack = SmallVector<ValueDecl *, 4>;
369369

370370
private:
371371
/// Reference to the semantic analysis that is performing

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1908,7 +1908,6 @@ enum StmtCode {
19081908
EXPR_PACK_EXPANSION, // PackExpansionExpr
19091909
EXPR_PACK_INDEXING, // PackIndexingExpr
19101910
EXPR_SIZEOF_PACK, // SizeOfPackExpr
1911-
EXPR_RESOLVED_UNEXPANDED_PACK, // ResolvedUnexpandedPackExpr
19121911
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM, // SubstNonTypeTemplateParmExpr
19131912
EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK, // SubstNonTypeTemplateParmPackExpr
19141913
EXPR_FUNCTION_PARM_PACK, // FunctionParmPackExpr

clang/lib/AST/DeclCXX.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3504,10 +3504,13 @@ VarDecl *BindingDecl::getHoldingVar() const {
35043504
return VD;
35053505
}
35063506

3507-
llvm::ArrayRef<Expr *> BindingDecl::getBindingPackExprs() const {
3507+
llvm::ArrayRef<BindingDecl *> BindingDecl::getBindingPackDecls() const {
35083508
assert(Binding && "expecting a pack expr");
3509-
auto *RP = cast<ResolvedUnexpandedPackExpr>(Binding);
3510-
return RP->getExprs();
3509+
auto *FP = cast<FunctionParmPackExpr>(Binding);
3510+
ValueDecl *const *First = FP->getNumExpansions() > 0 ? FP->begin() : nullptr;
3511+
assert((!First || isa<BindingDecl>(*First)) && "expecting a BindingDecl");
3512+
return llvm::ArrayRef<BindingDecl *>(
3513+
reinterpret_cast<BindingDecl *const *>(First), FP->getNumExpansions());
35113514
}
35123515

35133516
void DecompositionDecl::anchor() {}

clang/lib/AST/Expr.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3672,7 +3672,6 @@ bool Expr::HasSideEffects(const ASTContext &Ctx,
36723672
case PackIndexingExprClass:
36733673
case HLSLOutArgExprClass:
36743674
case OpenACCAsteriskSizeExprClass:
3675-
case ResolvedUnexpandedPackExprClass:
36763675
// These never have a side-effect.
36773676
return false;
36783677

clang/lib/AST/ExprCXX.cpp

Lines changed: 7 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,31 +1779,31 @@ TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const {
17791779
return TemplateArgument(llvm::ArrayRef(Arguments, NumArguments));
17801780
}
17811781

1782-
FunctionParmPackExpr::FunctionParmPackExpr(QualType T, VarDecl *ParamPack,
1782+
FunctionParmPackExpr::FunctionParmPackExpr(QualType T, ValueDecl *ParamPack,
17831783
SourceLocation NameLoc,
17841784
unsigned NumParams,
1785-
VarDecl *const *Params)
1785+
ValueDecl *const *Params)
17861786
: Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary),
17871787
ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) {
17881788
if (Params)
17891789
std::uninitialized_copy(Params, Params + NumParams,
1790-
getTrailingObjects<VarDecl *>());
1790+
getTrailingObjects<ValueDecl *>());
17911791
setDependence(ExprDependence::TypeValueInstantiation |
17921792
ExprDependence::UnexpandedPack);
17931793
}
17941794

17951795
FunctionParmPackExpr *
17961796
FunctionParmPackExpr::Create(const ASTContext &Context, QualType T,
1797-
VarDecl *ParamPack, SourceLocation NameLoc,
1798-
ArrayRef<VarDecl *> Params) {
1799-
return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(Params.size())))
1797+
ValueDecl *ParamPack, SourceLocation NameLoc,
1798+
ArrayRef<ValueDecl *> Params) {
1799+
return new (Context.Allocate(totalSizeToAlloc<ValueDecl *>(Params.size())))
18001800
FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data());
18011801
}
18021802

18031803
FunctionParmPackExpr *
18041804
FunctionParmPackExpr::CreateEmpty(const ASTContext &Context,
18051805
unsigned NumParams) {
1806-
return new (Context.Allocate(totalSizeToAlloc<VarDecl *>(NumParams)))
1806+
return new (Context.Allocate(totalSizeToAlloc<ValueDecl *>(NumParams)))
18071807
FunctionParmPackExpr(QualType(), nullptr, SourceLocation(), 0, nullptr);
18081808
}
18091809

@@ -1965,52 +1965,3 @@ CXXFoldExpr::CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee,
19651965
SubExprs[SubExpr::RHS] = RHS;
19661966
setDependence(computeDependence(this));
19671967
}
1968-
1969-
ResolvedUnexpandedPackExpr::ResolvedUnexpandedPackExpr(SourceLocation BL,
1970-
QualType QT,
1971-
unsigned NumExprs)
1972-
: Expr(ResolvedUnexpandedPackExprClass, QT, VK_PRValue, OK_Ordinary),
1973-
BeginLoc(BL), NumExprs(NumExprs) {
1974-
// C++ [temp.dep.expr]p3
1975-
// An id-expression is type-dependent if it is
1976-
// - associated by name lookup with a pack
1977-
setDependence(ExprDependence::TypeValueInstantiation |
1978-
ExprDependence::UnexpandedPack);
1979-
}
1980-
1981-
ResolvedUnexpandedPackExpr *
1982-
ResolvedUnexpandedPackExpr::CreateDeserialized(ASTContext &Ctx,
1983-
unsigned NumExprs) {
1984-
void *Mem = Ctx.Allocate(totalSizeToAlloc<Expr *>(NumExprs),
1985-
alignof(ResolvedUnexpandedPackExpr));
1986-
return new (Mem)
1987-
ResolvedUnexpandedPackExpr(SourceLocation(), QualType(), NumExprs);
1988-
}
1989-
1990-
ResolvedUnexpandedPackExpr *
1991-
ResolvedUnexpandedPackExpr::Create(ASTContext &Ctx, SourceLocation BL,
1992-
QualType T, unsigned NumExprs) {
1993-
void *Mem = Ctx.Allocate(totalSizeToAlloc<Expr *>(NumExprs),
1994-
alignof(ResolvedUnexpandedPackExpr));
1995-
ResolvedUnexpandedPackExpr *New =
1996-
new (Mem) ResolvedUnexpandedPackExpr(BL, T, NumExprs);
1997-
1998-
auto Exprs = New->getExprs();
1999-
std::uninitialized_fill(Exprs.begin(), Exprs.end(), nullptr);
2000-
2001-
return New;
2002-
}
2003-
2004-
ResolvedUnexpandedPackExpr *
2005-
ResolvedUnexpandedPackExpr::Create(ASTContext &Ctx, SourceLocation BL,
2006-
QualType T, ArrayRef<Expr *> Exprs) {
2007-
auto *New = Create(Ctx, BL, T, Exprs.size());
2008-
std::uninitialized_copy(Exprs.begin(), Exprs.end(), New->getExprs().begin());
2009-
return New;
2010-
}
2011-
2012-
ResolvedUnexpandedPackExpr *ResolvedUnexpandedPackExpr::getFromDecl(Decl *D) {
2013-
if (auto *BD = dyn_cast<BindingDecl>(D))
2014-
return dyn_cast_if_present<ResolvedUnexpandedPackExpr>(BD->getBinding());
2015-
return nullptr;
2016-
}

clang/lib/AST/ExprClassification.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -451,13 +451,6 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
451451
case Expr::PackExpansionExprClass:
452452
return ClassifyInternal(Ctx, cast<PackExpansionExpr>(E)->getPattern());
453453

454-
case Expr::ResolvedUnexpandedPackExprClass: {
455-
if (cast<ResolvedUnexpandedPackExpr>(E)->getNumExprs() > 0)
456-
return ClassifyInternal(
457-
Ctx, cast<ResolvedUnexpandedPackExpr>(E)->getExpansion(0));
458-
return Cl::CL_LValue;
459-
}
460-
461454
case Expr::MaterializeTemporaryExprClass:
462455
return cast<MaterializeTemporaryExpr>(E)->isBoundToLvalueReference()
463456
? Cl::CL_LValue

clang/lib/AST/ExprConstant.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17253,7 +17253,6 @@ static ICEDiag CheckICE(const Expr* E, const ASTContext &Ctx) {
1725317253
case Expr::SYCLUniqueStableNameExprClass:
1725417254
case Expr::CXXParenListInitExprClass:
1725517255
case Expr::HLSLOutArgExprClass:
17256-
case Expr::ResolvedUnexpandedPackExprClass:
1725717256
return ICEDiag(IK_NotICE, E->getBeginLoc());
1725817257

1725917258
case Expr::InitListExprClass: {

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4932,8 +4932,7 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
49324932
case Expr::AtomicExprClass:
49334933
case Expr::SourceLocExprClass:
49344934
case Expr::EmbedExprClass:
4935-
case Expr::BuiltinBitCastExprClass:
4936-
case Expr::ResolvedUnexpandedPackExprClass: {
4935+
case Expr::BuiltinBitCastExprClass: {
49374936
NotPrimaryExpr();
49384937
if (!NullOut) {
49394938
// As bad as this diagnostic is, it's better than crashing.

clang/lib/AST/StmtPrinter.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2609,15 +2609,6 @@ void StmtPrinter::VisitPackIndexingExpr(PackIndexingExpr *E) {
26092609
OS << "]";
26102610
}
26112611

2612-
void StmtPrinter::VisitResolvedUnexpandedPackExpr(
2613-
ResolvedUnexpandedPackExpr *E) {
2614-
OS << "<<resolved pack(";
2615-
llvm::interleave(
2616-
E->getExprs().begin(), E->getExprs().end(),
2617-
[this](auto *X) { PrintExpr(X); }, [this] { OS << ", "; });
2618-
OS << ")>>";
2619-
}
2620-
26212612
void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
26222613
SubstNonTypeTemplateParmPackExpr *Node) {
26232614
OS << *Node->getParameterPack();

0 commit comments

Comments
 (0)