Skip to content

Commit ba3bcf2

Browse files
committed
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
1 parent 2077d40 commit ba3bcf2

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

clang/lib/Sema/TreeTransform.h

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13634,12 +13634,12 @@ ExprResult
1363413634
TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
1363513635
Designation Desig;
1363613636

13637-
// transform the initializer value
13637+
// Transform the initializer value once.
1363813638
ExprResult Init = getDerived().TransformExpr(E->getInit());
1363913639
if (Init.isInvalid())
1364013640
return ExprError();
1364113641

13642-
// transform the designators.
13642+
// Transform the designators.
1364313643
SmallVector<Expr*, 4> ArrayExprs;
1364413644
bool ExprChanged = false;
1364513645
for (const DesignatedInitExpr::Designator &D : E->designators()) {
@@ -13649,7 +13649,7 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
1364913649
getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl()));
1365013650
if (Field != D.getFieldDecl())
1365113651
// Rebuild the expression when the transformed FieldDecl is
13652-
// different to the already assigned FieldDecl.
13652+
// different from the already assigned FieldDecl.
1365313653
ExprChanged = true;
1365413654
if (Field->isAnonymousStructOrUnion())
1365513655
continue;
@@ -13665,21 +13665,22 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
1366513665
}
1366613666

1366713667
if (D.isArrayDesignator()) {
13668-
ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
13669-
if (Index.isInvalid())
13668+
// Transform the array index expression.
13669+
ExprResult NewIndex = getDerived().TransformExpr(E->getArrayIndex(D));
13670+
if (NewIndex.isInvalid())
1367013671
return ExprError();
1367113672

13672-
Desig.AddDesignator(
13673-
Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
13673+
Desig.AddDesignator(Designator::CreateArrayDesignator(
13674+
NewIndex.get(), D.getLBracketLoc()));
1367413675

13675-
ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
13676-
ArrayExprs.push_back(Index.get());
13676+
// Check if the transformed index is different from the original.
13677+
ExprChanged = ExprChanged || NewIndex.get() != E->getArrayIndex(D);
13678+
ArrayExprs.push_back(NewIndex.get());
1367713679
continue;
1367813680
}
1367913681

1368013682
assert(D.isArrayRangeDesignator() && "New kind of designator?");
13681-
ExprResult Start
13682-
= getDerived().TransformExpr(E->getArrayRangeStart(D));
13683+
ExprResult Start = getDerived().TransformExpr(E->getArrayRangeStart(D));
1368313684
if (Start.isInvalid())
1368413685
return ExprError();
1368513686

@@ -13697,6 +13698,7 @@ TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
1369713698
ArrayExprs.push_back(End.get());
1369813699
}
1369913700

13701+
// Compare the transformed initializer against the original.
1370013702
if (!getDerived().AlwaysRebuild() &&
1370113703
Init.get() == E->getInit() &&
1370213704
!ExprChanged)

0 commit comments

Comments
 (0)