Skip to content

Commit dda9d89

Browse files
committed
[Clang][P1061] Fix crash
1 parent ea249ac commit dda9d89

File tree

4 files changed

+18
-14
lines changed

4 files changed

+18
-14
lines changed

clang/include/clang/AST/DeclCXX.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4199,8 +4199,16 @@ class DecompositionDecl final
41994199
NumBindings(Bindings.size()) {
42004200
std::uninitialized_copy(Bindings.begin(), Bindings.end(),
42014201
getTrailingObjects<BindingDecl *>());
4202-
for (auto *B : Bindings)
4202+
for (auto *B : Bindings) {
42034203
B->setDecomposedDecl(this);
4204+
if (B->isParameterPack()) {
4205+
for (Expr *E : B->getBindingPackExprs()) {
4206+
auto *DRE = cast<DeclRefExpr>(E);
4207+
auto *NestedB = cast<BindingDecl>(DRE->getDecl());
4208+
NestedB->setDecomposedDecl(this);
4209+
}
4210+
}
4211+
}
42044212
}
42054213

42064214
void anchor() override;

clang/lib/AST/DeclCXX.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3426,6 +3426,8 @@ VarDecl *BindingDecl::getHoldingVar() const {
34263426
}
34273427

34283428
llvm::ArrayRef<Expr *> BindingDecl::getBindingPackExprs() const {
3429+
if (!Binding)
3430+
return {};
34293431
auto *RP = cast<ResolvedUnexpandedPackExpr>(Binding);
34303432
return RP->getExprs();
34313433
}

clang/lib/AST/ExprCXX.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@ ResolvedUnexpandedPackExpr::Create(ASTContext &Ctx, SourceLocation BL,
19961996
new (Mem) ResolvedUnexpandedPackExpr(BL, T, NumExprs);
19971997

19981998
auto Exprs = New->getExprs();
1999-
std::fill(Exprs.begin(), Exprs.end(), nullptr);
1999+
std::uninitialized_fill(Exprs.begin(), Exprs.end(), nullptr);
20002000

20012001
return New;
20022002
}
@@ -2005,7 +2005,7 @@ ResolvedUnexpandedPackExpr *
20052005
ResolvedUnexpandedPackExpr::Create(ASTContext &Ctx, SourceLocation BL,
20062006
QualType T, ArrayRef<Expr *> Exprs) {
20072007
auto *New = Create(Ctx, BL, T, Exprs.size());
2008-
std::copy(Exprs.begin(), Exprs.end(), New->getExprs().begin());
2008+
std::uninitialized_copy(Exprs.begin(), Exprs.end(), New->getExprs().begin());
20092009
return New;
20102010
}
20112011

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -981,20 +981,14 @@ static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD,
981981
}
982982

983983
if (IsValid && HasPack) {
984-
TemplateTypeParmDecl *DummyTemplateParam = TemplateTypeParmDecl::Create(
985-
S.Context, S.Context.getTranslationUnitDecl(),
986-
/*KeyLoc*/ SourceLocation(), /*NameLoc*/ SourceLocation(),
987-
/*TemplateDepth*/ 0, /*AutoParameterPosition*/ 0,
988-
/*Identifier*/ nullptr, false, /*IsParameterPack*/ true);
989-
990984
// create the pack expr and assign it to the binding
991985
unsigned PackSize = MemberCount - Bindings.size() + 1;
992986
QualType PackType = S.Context.getPackExpansionType(
993-
QualType(DummyTemplateParam->getTypeForDecl(), 0), PackSize);
994-
(*BindingWithPackItr)
995-
->setBinding(PackType,
996-
ResolvedUnexpandedPackExpr::Create(
997-
S.Context, DD->getBeginLoc(), DecompType, PackSize));
987+
S.Context.DependentTy, std::nullopt, /*ExpectsPackInType=*/false);
988+
BindingDecl *BD = (*BindingWithPackItr);
989+
BD->setBinding(PackType,
990+
ResolvedUnexpandedPackExpr::Create(
991+
S.Context, DD->getBeginLoc(), DecompType, PackSize));
998992
}
999993

1000994
if (IsValid)

0 commit comments

Comments
 (0)