Skip to content

Commit ea249ac

Browse files
committed
[Clang][P1061] Move rebuild of resolved packs into TreeTransform
1 parent 360708d commit ea249ac

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2490,7 +2490,9 @@ TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
24902490
return TransformFunctionParmPackRefExpr(E, PD);
24912491

24922492
if (BindingDecl *BD = dyn_cast<BindingDecl>(D); BD && BD->isParameterPack()) {
2493-
BD = cast<BindingDecl>(TransformDecl(BD->getLocation(), BD));
2493+
BD = cast_or_null<BindingDecl>(TransformDecl(BD->getLocation(), BD));
2494+
if (!BD)
2495+
return ExprError();
24942496
if (auto *RP =
24952497
dyn_cast_if_present<ResolvedUnexpandedPackExpr>(BD->getBinding())) {
24962498
return TransformResolvedUnexpandedPackExpr(RP);
@@ -2671,18 +2673,7 @@ ExprResult TemplateInstantiator::TransformResolvedUnexpandedPackExpr(
26712673
E->getExpansion(getSema().ArgumentPackSubstitutionIndex));
26722674
}
26732675

2674-
if (!AlwaysRebuild())
2675-
return E;
2676-
2677-
SmallVector<Expr *, 12> NewExprs;
2678-
if (TransformExprs(E->getExprs().begin(), E->getNumExprs(),
2679-
/*IsCall=*/false, NewExprs))
2680-
return ExprError();
2681-
2682-
// NOTE: The type is just a superficial PackExpansionType
2683-
// that needs no substitution.
2684-
return ResolvedUnexpandedPackExpr::Create(SemaRef.Context, E->getBeginLoc(),
2685-
E->getType(), NewExprs);
2676+
return inherited::TransformResolvedUnexpandedPackExpr(E);
26862677
}
26872678

26882679
QualType TemplateInstantiator::TransformSubstTemplateTypeParmPackType(

clang/lib/Sema/TreeTransform.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3676,6 +3676,13 @@ class TreeTransform {
36763676
FullySubstituted);
36773677
}
36783678

3679+
ExprResult RebuildResolvedUnexpandedPackExpr(SourceLocation BeginLoc,
3680+
QualType T,
3681+
ArrayRef<Expr *> Exprs) {
3682+
return ResolvedUnexpandedPackExpr::Create(SemaRef.Context, BeginLoc, T,
3683+
Exprs);
3684+
}
3685+
36793686
/// Build a new expression representing a call to a source location
36803687
/// builtin.
36813688
///
@@ -15994,8 +16001,19 @@ TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
1599416001
template <typename Derived>
1599516002
ExprResult TreeTransform<Derived>::TransformResolvedUnexpandedPackExpr(
1599616003
ResolvedUnexpandedPackExpr *E) {
15997-
// Default behavior is to do nothing with this transformation.
15998-
return E;
16004+
bool ArgumentChanged = false;
16005+
SmallVector<Expr *, 12> NewExprs;
16006+
if (TransformExprs(E->getExprs().begin(), E->getNumExprs(),
16007+
/*IsCall=*/false, NewExprs, &ArgumentChanged))
16008+
return ExprError();
16009+
16010+
if (!AlwaysRebuild() && !ArgumentChanged)
16011+
return E;
16012+
16013+
// NOTE: The type is just a superficial PackExpansionType
16014+
// that needs no substitution.
16015+
return RebuildResolvedUnexpandedPackExpr(E->getBeginLoc(), E->getType(),
16016+
NewExprs);
1599916017
}
1600016018

1600116019
template<typename Derived>

0 commit comments

Comments
 (0)