Skip to content

Commit 2f29829

Browse files
authored
[Clang][P1061] Fix invalid pack binding crash (#135129)
1 parent a62b9b3 commit 2f29829

File tree

3 files changed

+10
-5
lines changed

3 files changed

+10
-5
lines changed

clang/include/clang/AST/DeclCXX.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4281,7 +4281,7 @@ class DecompositionDecl final
42814281
[](BindingDecl *BD) { return BD->isParameterPack(); });
42824282

42834283
Bindings = Bindings.drop_front(BeforePackBindings.size());
4284-
if (!Bindings.empty()) {
4284+
if (!Bindings.empty() && Bindings.front()->getBinding()) {
42854285
PackBindings = Bindings.front()->getBindingPackDecls();
42864286
Bindings = Bindings.drop_front();
42874287
}

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,11 +1597,10 @@ Decl *TemplateDeclInstantiator::VisitDecompositionDecl(DecompositionDecl *D) {
15971597
auto *NewDD = cast_if_present<DecompositionDecl>(
15981598
VisitVarDecl(D, /*InstantiatingVarTemplate=*/false, &NewBindingArray));
15991599

1600-
if (!NewDD || NewDD->isInvalidDecl())
1600+
if (!NewDD || NewDD->isInvalidDecl()) {
16011601
for (auto *NewBD : NewBindings)
16021602
NewBD->setInvalidDecl();
1603-
1604-
if (OldBindingPack) {
1603+
} else if (OldBindingPack) {
16051604
// Mark the bindings in the pack as instantiated.
16061605
auto Bindings = NewDD->bindings();
16071606
BindingDecl *NewBindingPack = *llvm::find_if(

clang/test/SemaCXX/cxx2c-binding-pack-nontemplate.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
// RUN: %clang_cc1 -std=c++23 -verify=cxx23,nontemplate -fsyntax-only -Wc++26-extensions %s
44

55
void decompose_array() {
6-
int arr[4] = {1, 2, 3, 6};
6+
constexpr int arr[4] = {1, 2, 3, 6};
77
// cxx26-warning@+3 {{structured binding packs are incompatible with C++ standards before C++2c}}
88
// cxx23-warning@+2 {{structured binding packs are a C++2c extension}}
99
// nontemplate-error@+1 {{pack declaration outside of template}}
1010
auto [x, ...rest, y] = arr;
11+
12+
// cxx26-warning@+4 {{structured binding packs are incompatible with C++ standards before C++2c}}
13+
// cxx23-warning@+3 {{structured binding packs are a C++2c extension}}
14+
// nontemplate-error@+2 {{decomposition declaration cannot be declared 'constexpr'}}
15+
// nontemplate-error@+1 {{pack declaration outside of template}}
16+
constexpr auto [x_c, ...rest_c, y_c] = arr;
1117
}

0 commit comments

Comments
 (0)