Skip to content

Commit 986d0db

Browse files
authored
[Clang] Fix AST dump for {CXXDefaultArgExpr, CXXDefaultInitExpr} (#88269)
This PR fix a AST dump issue since #80001 When Clang dumps `CXXDefaultArgExpr`/`CXXDefaultInitExpr`, there has no recursively dump the complete `CXXDefaultArgExpr`/`CXXDefaultInitExpr`. Since this PR, Clang will recursively dump a `CXXDefaultArgExpr`/`CXXDefaultInitExpr` node, even if the node has no rewritten init. *Consider*: ``` struct A { int arr[1]; }; struct B { const A &a = A{{0}}; }; void test() { B b{}; } ``` *Before*: ``` `-FunctionDecl <line:9:1, line:11:1> line:9:6 test 'void ()' `-CompoundStmt <col:13, line:11:1> `-DeclStmt <line:10:3, col:8> `-VarDecl <col:3, col:7> col:5 b 'B' listinit `-InitListExpr <col:6, col:7> 'B' `-CXXDefaultInitExpr <col:7> 'const A' lvalue has rewritten init `-ExprWithCleanups <line:6:16, col:21> 'const A' lvalue ``` *After*: ``` `-FunctionDecl 0x15a9455a8 <line:9:1, line:11:1> line:9:6 test 'void ()' `-CompoundStmt 0x15a945850 <col:13, line:11:1> `-DeclStmt 0x15a945838 <line:10:3, col:8> `-VarDecl 0x15a945708 <col:3, col:7> col:5 b 'B' listinit `-InitListExpr 0x15a9457b0 <col:6, col:7> 'B' `-CXXDefaultInitExpr 0x15a9457f8 <col:7> 'const A' lvalue has rewritten init `-ExprWithCleanups 0x15a945568 <line:6:16, col:21> 'const A' lvalue `-MaterializeTemporaryExpr 0x15a945500 <col:16, col:21> 'const A' lvalue extended by Field 0x15a945160 'a' 'const A &' `-ImplicitCastExpr 0x15a9454e8 <col:16, col:21> 'const A' <NoOp> `-CXXFunctionalCastExpr 0x15a9454c0 <col:16, col:21> 'A' functional cast to A <NoOp> `-InitListExpr 0x15a9452c0 <col:17, col:21> 'A' `-InitListExpr 0x15a945308 <col:18, col:20> 'int[1]' `-IntegerLiteral 0x15a945210 <col:19> 'int' 0 ``` --------- Signed-off-by: yronglin <[email protected]>
1 parent 2c2377d commit 986d0db

File tree

9 files changed

+3090
-12
lines changed

9 files changed

+3090
-12
lines changed

clang/include/clang/AST/ASTNodeTraverser.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,14 @@ class ASTNodeTraverser
932932
Visit(TArg);
933933
}
934934

935+
void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node) {
936+
Visit(Node->getExpr());
937+
}
938+
939+
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node) {
940+
Visit(Node->getExpr());
941+
}
942+
935943
// Implements Visit methods for Attrs.
936944
#include "clang/AST/AttrNodeTraverse.inc"
937945
};

clang/include/clang/AST/JSONNodeDumper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ class JSONNodeDumper
310310
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE);
311311
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *ME);
312312
void VisitRequiresExpr(const RequiresExpr *RE);
313+
void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node);
314+
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node);
313315

314316
void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE);
315317
void VisitObjCMessageExpr(const ObjCMessageExpr *OME);

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,6 +1576,14 @@ void JSONNodeDumper::VisitMaterializeTemporaryExpr(
15761576
attributeOnlyIfTrue("boundToLValueRef", MTE->isBoundToLvalueReference());
15771577
}
15781578

1579+
void JSONNodeDumper::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node) {
1580+
attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1581+
}
1582+
1583+
void JSONNodeDumper::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node) {
1584+
attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1585+
}
1586+
15791587
void JSONNodeDumper::VisitCXXDependentScopeMemberExpr(
15801588
const CXXDependentScopeMemberExpr *DSME) {
15811589
JOS.attribute("isArrow", DSME->isArrow());

clang/lib/AST/TextNodeDumper.cpp

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,23 +1450,13 @@ void TextNodeDumper::VisitExpressionTraitExpr(const ExpressionTraitExpr *Node) {
14501450
}
14511451

14521452
void TextNodeDumper::VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node) {
1453-
if (Node->hasRewrittenInit()) {
1453+
if (Node->hasRewrittenInit())
14541454
OS << " has rewritten init";
1455-
AddChild([=] {
1456-
ColorScope Color(OS, ShowColors, StmtColor);
1457-
Visit(Node->getExpr());
1458-
});
1459-
}
14601455
}
14611456

14621457
void TextNodeDumper::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node) {
1463-
if (Node->hasRewrittenInit()) {
1458+
if (Node->hasRewrittenInit())
14641459
OS << " has rewritten init";
1465-
AddChild([=] {
1466-
ColorScope Color(OS, ShowColors, StmtColor);
1467-
Visit(Node->getExpr());
1468-
});
1469-
}
14701460
}
14711461

14721462
void TextNodeDumper::VisitMaterializeTemporaryExpr(

0 commit comments

Comments
 (0)