@@ -758,9 +758,11 @@ CaseStmt::CaseStmt(CaseParentKind parentKind, SourceLoc itemIntroducerLoc,
758
758
: Stmt(StmtKind::Case, getDefaultImplicitFlag(implicit, itemIntroducerLoc)),
759
759
UnknownAttrLoc(unknownAttrLoc), ItemIntroducerLoc(itemIntroducerLoc),
760
760
ItemTerminatorLoc(itemTerminatorLoc), ParentKind(parentKind),
761
- BodyAndHasFallthrough(body, fallthroughStmt.isNonNull()),
762
- CaseBodyVariables(caseBodyVariables) {
761
+ BodyAndHasFallthrough(body, fallthroughStmt.isNonNull()) {
763
762
Bits.CaseStmt .NumPatterns = caseLabelItems.size ();
763
+ Bits.CaseStmt .NumCaseBodyVars = caseBodyVariables.size ();
764
+ ASSERT (Bits.CaseStmt .NumCaseBodyVars == caseBodyVariables.size () &&
765
+ " too many case body vars" );
764
766
assert (Bits.CaseStmt .NumPatterns > 0 &&
765
767
" case block must have at least one pattern" );
766
768
assert (
@@ -770,6 +772,9 @@ CaseStmt::CaseStmt(CaseParentKind parentKind, SourceLoc itemIntroducerLoc,
770
772
*getTrailingObjects<FallthroughStmt *>() = fallthroughStmt.get ();
771
773
}
772
774
775
+ std::uninitialized_copy (caseBodyVariables.begin (), caseBodyVariables.end (),
776
+ getCaseBodyVariablesBuffer ().begin ());
777
+
773
778
MutableArrayRef<CaseLabelItem> items{getTrailingObjects<CaseLabelItem>(),
774
779
static_cast <size_t >(Bits.CaseStmt .NumPatterns )};
775
780
@@ -914,10 +919,11 @@ CaseStmt *CaseStmt::create(ASTContext &ctx, CaseParentKind ParentKind,
914
919
BraceStmt *body, ArrayRef<VarDecl *> caseVarDecls,
915
920
std::optional<bool > implicit,
916
921
NullablePtr<FallthroughStmt> fallthroughStmt) {
917
- void *mem =
918
- ctx.Allocate (totalSizeToAlloc<FallthroughStmt *, CaseLabelItem>(
919
- fallthroughStmt.isNonNull (), caseLabelItems.size ()),
920
- alignof (CaseStmt));
922
+ void *mem = ctx.Allocate (
923
+ totalSizeToAlloc<FallthroughStmt *, CaseLabelItem, VarDecl *>(
924
+ fallthroughStmt.isNonNull (), caseLabelItems.size (),
925
+ caseVarDecls.size ()),
926
+ alignof (CaseStmt));
921
927
return ::new (mem)
922
928
CaseStmt (ParentKind, caseLoc, caseLabelItems, unknownAttrLoc, colonLoc,
923
929
body, caseVarDecls, implicit, fallthroughStmt);
0 commit comments