@@ -758,9 +758,11 @@ CaseStmt::CaseStmt(CaseParentKind parentKind, SourceLoc itemIntroducerLoc,
758758 : Stmt(StmtKind::Case, getDefaultImplicitFlag(implicit, itemIntroducerLoc)),
759759 UnknownAttrLoc(unknownAttrLoc), ItemIntroducerLoc(itemIntroducerLoc),
760760 ItemTerminatorLoc(itemTerminatorLoc), ParentKind(parentKind),
761- BodyAndHasFallthrough(body, fallthroughStmt.isNonNull()),
762- CaseBodyVariables(caseBodyVariables) {
761+ BodyAndHasFallthrough(body, fallthroughStmt.isNonNull()) {
763762 Bits.CaseStmt .NumPatterns = caseLabelItems.size ();
763+ Bits.CaseStmt .NumCaseBodyVars = caseBodyVariables.size ();
764+ ASSERT (Bits.CaseStmt .NumCaseBodyVars == caseBodyVariables.size () &&
765+ " too many case body vars" );
764766 assert (Bits.CaseStmt .NumPatterns > 0 &&
765767 " case block must have at least one pattern" );
766768 assert (
@@ -770,6 +772,9 @@ CaseStmt::CaseStmt(CaseParentKind parentKind, SourceLoc itemIntroducerLoc,
770772 *getTrailingObjects<FallthroughStmt *>() = fallthroughStmt.get ();
771773 }
772774
775+ std::uninitialized_copy (caseBodyVariables.begin (), caseBodyVariables.end (),
776+ getCaseBodyVariablesBuffer ().begin ());
777+
773778 MutableArrayRef<CaseLabelItem> items{getTrailingObjects<CaseLabelItem>(),
774779 static_cast <size_t >(Bits.CaseStmt .NumPatterns )};
775780
@@ -914,10 +919,11 @@ CaseStmt *CaseStmt::create(ASTContext &ctx, CaseParentKind ParentKind,
914919 BraceStmt *body, ArrayRef<VarDecl *> caseVarDecls,
915920 std::optional<bool > implicit,
916921 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));
921927 return ::new (mem)
922928 CaseStmt (ParentKind, caseLoc, caseLabelItems, unknownAttrLoc, colonLoc,
923929 body, caseVarDecls, implicit, fallthroughStmt);
0 commit comments