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-g...@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) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits