diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 715aaf6452264..f41cfcc53a35d 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -2226,10 +2226,7 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( E->AssociatedDeclAndRef.setPointer(readDeclAs()); E->AssociatedDeclAndRef.setInt(CurrentUnpackingBits->getNextBit()); E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12); - if (CurrentUnpackingBits->getNextBit()) - E->PackIndex = Record.readInt(); - else - E->PackIndex = 0; + E->PackIndex = Record.readUnsignedOrNone().toInternalRepresentation(); E->Final = CurrentUnpackingBits->getNextBit(); E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation(); E->Replacement = Record.readSubExpr(); @@ -2239,6 +2236,7 @@ void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( SubstNonTypeTemplateParmPackExpr *E) { VisitExpr(E); E->AssociatedDecl = readDeclAs(); + E->Final = CurrentUnpackingBits->getNextBit(); E->Index = Record.readInt(); TemplateArgument ArgPack = Record.readTemplateArgument(); if (ArgPack.getKind() != TemplateArgument::Pack) diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 939b37c547349..b9eabd5ddb64c 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -2228,9 +2228,7 @@ void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr( Record.AddDeclRef(E->getAssociatedDecl()); CurrentPackingBits.addBit(E->isReferenceParameter()); CurrentPackingBits.addBits(E->getIndex(), /*Width=*/12); - CurrentPackingBits.addBit((bool)E->getPackIndex()); - if (auto PackIndex = E->getPackIndex()) - Record.push_back(*PackIndex + 1); + Record.writeUnsignedOrNone(E->getPackIndex()); CurrentPackingBits.addBit(E->getFinal()); Record.AddSourceLocation(E->getNameLoc()); @@ -2242,6 +2240,7 @@ void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr( SubstNonTypeTemplateParmPackExpr *E) { VisitExpr(E); Record.AddDeclRef(E->getAssociatedDecl()); + CurrentPackingBits.addBit(E->getFinal()); Record.push_back(E->getIndex()); Record.AddTemplateArgument(E->getArgumentPack()); Record.AddSourceLocation(E->getParameterPackLocation());