Author: Matheus Izvekov Date: 2025-04-11T18:04:18-03:00 New Revision: 4530922cfdacc5be25dbe499fc106cc3b009bf79
URL: https://github.com/llvm/llvm-project/commit/4530922cfdacc5be25dbe499fc106cc3b009bf79 DIFF: https://github.com/llvm/llvm-project/commit/4530922cfdacc5be25dbe499fc106cc3b009bf79.diff LOG: [clang] fix serialization for SubstNonTypeTemplateParmPackExpr (#135428) This fixes a PCM non-determinism regression reported here: https://github.com/llvm/llvm-project/pull/134560#issuecomment-2797744370 There was a bit in `SubstNonTypeTemplateParmPackExpr` which we missed to serialize, and that bit eventually propagates to `SubstNonTypeTemplateParmExpr`. As a drive by, improve serialization for PackIndex on SubstNonTypeTemplateParmExpr by using the newly introduced UnsignedOrNone helpers. There are no release notes since this regression was never released. Added: Modified: clang/lib/Serialization/ASTReaderStmt.cpp clang/lib/Serialization/ASTWriterStmt.cpp Removed: ################################################################################ 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<Decl>()); 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<Decl>(); + 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()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits