llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (GS-GOAT) <details> <summary>Changes</summary> … #<!-- -->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 --- Full diff: https://github.com/llvm/llvm-project/pull/127211.diff 1 Files Affected: - (modified) clang/lib/Sema/TreeTransform.h (+13-11) ``````````diff 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) `````````` </details> https://github.com/llvm/llvm-project/pull/127211 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits