[clang] Fixing the logic issue in TransformTypos::TransformDesignatedInitExpr… (PR #127211)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 14 05:47:13 PST 2025
https://github.com/GS-GOAT created https://github.com/llvm/llvm-project/pull/127211
… #126113
-Transforming Indices: For array designators, transform the index expression and update ExprChanged if it's modified.
-Correct Initializer Check: Compare the transformed initializer against the original to accurately track changes.
-Single Initializer Transformation: The initializer is processed once, not per designator, as each DesignatedInitExpr has one initializer.
Fixes #126113
>From ba3bcf29c041487e8f23189bffd04b2d2fed9f41 Mon Sep 17 00:00:00 2001
From: GS-GOAT <86884129+GS-GOAT at users.noreply.github.com>
Date: Fri, 14 Feb 2025 13:46:23 +0530
Subject: [PATCH] Fixing the logic issue in
TransformTypos::TransformDesignatedInitExpr #126113
-Transforming Indices: For array designators, transform the index expression
and update ExprChanged if it's modified.
-Correct Initializer Check: Compare the transformed initializer against the
original to accurately track changes.
-Single Initializer Transformation: The initializer is processed once, not
per designator, as each DesignatedInitExpr has one initializer.
Fixes #126113
---
clang/lib/Sema/TreeTransform.h | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index fc1e3f7d58f4d..81388b2783fad 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -13634,12 +13634,12 @@ ExprResult
TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
Designation Desig;
- // transform the initializer value
+ // Transform the initializer value once.
ExprResult Init = getDerived().TransformExpr(E->getInit());
if (Init.isInvalid())
return ExprError();
- // transform the designators.
+ // Transform the designators.
SmallVector<Expr*, 4> ArrayExprs;
bool ExprChanged = false;
for (const DesignatedInitExpr::Designator &D : E->designators()) {
@@ -13649,7 +13649,7 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl()));
if (Field != D.getFieldDecl())
// Rebuild the expression when the transformed FieldDecl is
- // different to the already assigned FieldDecl.
+ // different from the already assigned FieldDecl.
ExprChanged = true;
if (Field->isAnonymousStructOrUnion())
continue;
@@ -13665,21 +13665,22 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
}
if (D.isArrayDesignator()) {
- ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
- if (Index.isInvalid())
+ // Transform the array index expression.
+ ExprResult NewIndex = getDerived().TransformExpr(E->getArrayIndex(D));
+ if (NewIndex.isInvalid())
return ExprError();
- Desig.AddDesignator(
- Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
+ Desig.AddDesignator(Designator::CreateArrayDesignator(
+ NewIndex.get(), D.getLBracketLoc()));
- ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
- ArrayExprs.push_back(Index.get());
+ // Check if the transformed index is different from the original.
+ ExprChanged = ExprChanged || NewIndex.get() != E->getArrayIndex(D);
+ ArrayExprs.push_back(NewIndex.get());
continue;
}
assert(D.isArrayRangeDesignator() && "New kind of designator?");
- ExprResult Start
- = getDerived().TransformExpr(E->getArrayRangeStart(D));
+ ExprResult Start = getDerived().TransformExpr(E->getArrayRangeStart(D));
if (Start.isInvalid())
return ExprError();
@@ -13697,6 +13698,7 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
ArrayExprs.push_back(End.get());
}
+ // Compare the transformed initializer against the original.
if (!getDerived().AlwaysRebuild() &&
Init.get() == E->getInit() &&
!ExprChanged)
More information about the cfe-commits
mailing list