Skip to content

Commit a323e05

Browse files
committed
[Clang][P1061] Consolidate ResolvedUnexpandedPackExpr into FunctionParmPackExpr
1 parent d5a7a48 commit a323e05

File tree

13 files changed

+103
-135
lines changed

13 files changed

+103
-135
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+
auto 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: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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; }

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/lib/AST/DeclCXX.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3492,10 +3492,13 @@ VarDecl *BindingDecl::getHoldingVar() const {
34923492
return VD;
34933493
}
34943494

3495-
llvm::ArrayRef<Expr *> BindingDecl::getBindingPackExprs() const {
3495+
llvm::ArrayRef<BindingDecl *> BindingDecl::getBindingPackDecls() const {
34963496
assert(Binding && "expecting a pack expr");
3497-
auto *RP = cast<ResolvedUnexpandedPackExpr>(Binding);
3498-
return RP->getExprs();
3497+
auto *FP = cast<FunctionParmPackExpr>(Binding);
3498+
ValueDecl *const *First = FP->getNumExpansions() > 0 ? FP->begin() : nullptr;
3499+
assert((!First || isa<BindingDecl>(*First)) && "expecting a BindingDecl");
3500+
return llvm::ArrayRef<BindingDecl *>((BindingDecl *const *)First,
3501+
FP->getNumExpansions());
34993502
}
35003503

35013504
void DecompositionDecl::anchor() {}

clang/lib/AST/ExprCXX.cpp

Lines changed: 7 additions & 7 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

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -980,24 +980,24 @@ static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD,
980980
if (IsValid && HasPack) {
981981
// Create the pack expr and assign it to the binding.
982982
unsigned PackSize = MemberCount - Bindings.size() + 1;
983-
QualType PackType = S.Context.getPackExpansionType(
984-
S.Context.DependentTy, std::nullopt, /*ExpectsPackInType=*/false);
985-
BindingDecl *BD = (*BindingWithPackItr);
986-
auto *RP = ResolvedUnexpandedPackExpr::Create(S.Context, DD->getBeginLoc(),
987-
DecompType, PackSize);
988-
BD->setDecomposedDecl(DD);
989-
BD->setBinding(PackType, RP);
990983

991984
BindingDecl *BPack = *BindingWithPackItr;
985+
BPack->setDecomposedDecl(DD);
986+
SmallVector<ValueDecl *, 8> NestedBDs(PackSize);
992987
// Create the nested BindingDecls.
993-
for (Expr *&E : RP->getExprs()) {
994-
auto *NestedBD = BindingDecl::Create(S.Context, BPack->getDeclContext(),
995-
BPack->getLocation(),
996-
BPack->getIdentifier(), QualType());
988+
for (ValueDecl *&VD : NestedBDs) {
989+
BindingDecl *NestedBD = BindingDecl::Create(
990+
S.Context, BPack->getDeclContext(), BPack->getLocation(),
991+
BPack->getIdentifier(), QualType());
997992
NestedBD->setDecomposedDecl(DD);
998-
E = S.BuildDeclRefExpr(NestedBD, S.Context.DependentTy, VK_LValue,
999-
BPack->getLocation());
993+
VD = NestedBD;
1000994
}
995+
996+
QualType PackType = S.Context.getPackExpansionType(
997+
S.Context.DependentTy, PackSize, /*ExpectsPackInType=*/false);
998+
auto *PackExpr = FunctionParmPackExpr::Create(
999+
S.Context, PackType, BPack, BPack->getBeginLoc(), NestedBDs);
1000+
BPack->setBinding(PackType, PackExpr);
10011001
}
10021002

10031003
if (IsValid)

clang/lib/Sema/SemaExpr.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19430,7 +19430,7 @@ static ExprResult rebuildPotentialResultsAsNonOdrUsed(Sema &S, Expr *E,
1943019430
auto *FPPE = cast<FunctionParmPackExpr>(E);
1943119431
// If any of the declarations in the pack is odr-used, then the expression
1943219432
// as a whole constitutes an odr-use.
19433-
for (VarDecl *D : *FPPE)
19433+
for (ValueDecl *D : *FPPE)
1943419434
if (IsPotentialResultOdrUsed(D))
1943519435
return ExprEmpty();
1943619436

@@ -19705,7 +19705,7 @@ void Sema::CleanupVarDeclMarking() {
1970519705
MarkVarDeclODRUsed(cast<VarDecl>(ME->getMemberDecl()), ME->getMemberLoc(),
1970619706
*this);
1970719707
} else if (auto *FP = dyn_cast<FunctionParmPackExpr>(E)) {
19708-
for (VarDecl *VD : *FP)
19708+
for (ValueDecl *VD : *FP)
1970919709
MarkVarDeclODRUsed(VD, FP->getParameterPackLocation(), *this);
1971019710
} else {
1971119711
llvm_unreachable("Unexpected expression");
@@ -20081,7 +20081,7 @@ void Sema::MarkMemberReferenced(MemberExpr *E) {
2008120081
}
2008220082

2008320083
void Sema::MarkFunctionParmPackReferenced(FunctionParmPackExpr *E) {
20084-
for (VarDecl *VD : *E)
20084+
for (ValueDecl *VD : *E)
2008520085
MarkExprReferenced(*this, E->getParameterPackLocation(), VD, E, true,
2008620086
RefsMinusAssignments);
2008720087
}

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,10 +1574,10 @@ namespace {
15741574
SubstNonTypeTemplateParmExpr *E);
15751575

15761576
/// Rebuild a DeclRefExpr for a VarDecl reference.
1577-
ExprResult RebuildVarDeclRefExpr(VarDecl *PD, SourceLocation Loc);
1577+
ExprResult RebuildVarDeclRefExpr(ValueDecl *PD, SourceLocation Loc);
15781578

15791579
/// Transform a reference to a function or init-capture parameter pack.
1580-
ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E, VarDecl *PD);
1580+
ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E, ValueDecl *PD);
15811581

15821582
/// Transform a FunctionParmPackExpr which was built when we couldn't
15831583
/// expand a function parameter pack reference which refers to an expanded
@@ -2389,7 +2389,7 @@ TemplateInstantiator::TransformSubstNonTypeTemplateParmExpr(
23892389
SugaredConverted, E->getPackIndex());
23902390
}
23912391

2392-
ExprResult TemplateInstantiator::RebuildVarDeclRefExpr(VarDecl *PD,
2392+
ExprResult TemplateInstantiator::RebuildVarDeclRefExpr(ValueDecl *PD,
23932393
SourceLocation Loc) {
23942394
DeclarationNameInfo NameInfo(PD->getDeclName(), Loc);
23952395
return getSema().BuildDeclarationNameExpr(CXXScopeSpec(), NameInfo, PD);
@@ -2399,8 +2399,8 @@ ExprResult
23992399
TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
24002400
if (getSema().ArgumentPackSubstitutionIndex != -1) {
24012401
// We can expand this parameter pack now.
2402-
VarDecl *D = E->getExpansion(getSema().ArgumentPackSubstitutionIndex);
2403-
VarDecl *VD = cast_or_null<VarDecl>(TransformDecl(E->getExprLoc(), D));
2402+
ValueDecl *D = E->getExpansion(getSema().ArgumentPackSubstitutionIndex);
2403+
ValueDecl *VD = cast_or_null<ValueDecl>(TransformDecl(E->getExprLoc(), D));
24042404
if (!VD)
24052405
return ExprError();
24062406
return RebuildVarDeclRefExpr(VD, E->getExprLoc());
@@ -2412,11 +2412,11 @@ TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
24122412

24132413
// Transform each of the parameter expansions into the corresponding
24142414
// parameters in the instantiation of the function decl.
2415-
SmallVector<VarDecl *, 8> Vars;
2415+
SmallVector<ValueDecl *, 8> Vars;
24162416
Vars.reserve(E->getNumExpansions());
24172417
for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
24182418
I != End; ++I) {
2419-
VarDecl *D = cast_or_null<VarDecl>(TransformDecl(E->getExprLoc(), *I));
2419+
ValueDecl *D = cast_or_null<ValueDecl>(TransformDecl(E->getExprLoc(), *I));
24202420
if (!D)
24212421
return ExprError();
24222422
Vars.push_back(D);
@@ -2431,7 +2431,7 @@ TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
24312431

24322432
ExprResult
24332433
TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E,
2434-
VarDecl *PD) {
2434+
ValueDecl *PD) {
24352435
typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
24362436
llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found
24372437
= getSema().CurrentInstantiationScope->findInstantiationOf(PD);
@@ -2457,7 +2457,8 @@ TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E,
24572457
}
24582458

24592459
// We have either an unexpanded pack or a specific expansion.
2460-
return RebuildVarDeclRefExpr(cast<VarDecl>(TransformedDecl), E->getExprLoc());
2460+
return RebuildVarDeclRefExpr(cast<ValueDecl>(TransformedDecl),
2461+
E->getExprLoc());
24612462
}
24622463

24632464
ExprResult
@@ -2479,15 +2480,6 @@ TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
24792480
if (PD->isParameterPack())
24802481
return TransformFunctionParmPackRefExpr(E, PD);
24812482

2482-
if (BindingDecl *BD = dyn_cast<BindingDecl>(D); BD && BD->isParameterPack()) {
2483-
BD = cast_or_null<BindingDecl>(TransformDecl(BD->getLocation(), BD));
2484-
if (!BD)
2485-
return ExprError();
2486-
if (auto *RP =
2487-
dyn_cast_if_present<ResolvedUnexpandedPackExpr>(BD->getBinding()))
2488-
return TransformResolvedUnexpandedPackExpr(RP);
2489-
}
2490-
24912483
return inherited::TransformDeclRefExpr(E);
24922484
}
24932485

@@ -4683,7 +4675,7 @@ void LocalInstantiationScope::InstantiatedLocal(const Decl *D, Decl *Inst) {
46834675
#endif
46844676
Stored = Inst;
46854677
} else if (DeclArgumentPack *Pack = dyn_cast<DeclArgumentPack *>(Stored)) {
4686-
Pack->push_back(cast<VarDecl>(Inst));
4678+
Pack->push_back(cast<ValueDecl>(Inst));
46874679
} else {
46884680
assert(cast<Decl *>(Stored) == Inst && "Already instantiated this local");
46894681
}

0 commit comments

Comments
 (0)