[clang] [clang] fix serialization for SubstNonTypeTemplateParmPackExpr (PR #135428)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 11 12:54:50 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Matheus Izvekov (mizvekov)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/135428.diff
2 Files Affected:
- (modified) clang/lib/Serialization/ASTReaderStmt.cpp (+2-4)
- (modified) clang/lib/Serialization/ASTWriterStmt.cpp (+2-3)
``````````diff
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());
``````````
</details>
https://github.com/llvm/llvm-project/pull/135428
More information about the cfe-commits
mailing list