Clang AST节点什么时候会有多个parents?

When will a Clang AST node have multiple parents?

classclang::ASTContext有个方法:

DynTypedNodeList getParents(const NodeT &Node)

其中 return 是给定 AST 节点的 parent 节点列表。

通常AST作为树会是一个树结构,但是出于某些原因(可能是性能原因)Clang允许一个节点有多个parent。

在什么条件下(什么C++源代码模式),getParents()会return多于一个parent?

原答案(不正确)

AST是一棵树,每个节点恰好有一个parent。 getParents,但是,returns 不仅是 parent,而且是 parent 的 parent 等等。所以,实际上,该函数应该更好地命名为 getAncestors.

更新答案

原答案确实不正确,getParents returns正好是绝大多数AST节点的一个节点。这是来自 clang-tidy 的评论,涵盖了该主题:

The case that a Stmt has multiple parents is rare but does actually occur in the parts of the AST that we're interested in. Specifically, InitListExpr nodes cause ASTContext::getParent() to return multiple parents for certain nodes in their subtree because RecursiveASTVisitor visits both the syntactic and semantic forms of InitListExpr, and the parent-child relationships are different between the two forms.

也许还有其他节点,但我找不到相关信息。