Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ clang ASTContext.getParents始终返回空列表_C++_Clang_Llvm_Abstract Syntax Tree - Fatal编程技术网

C++ clang ASTContext.getParents始终返回空列表

C++ clang ASTContext.getParents始终返回空列表,c++,clang,llvm,abstract-syntax-tree,C++,Clang,Llvm,Abstract Syntax Tree,我正在基于这个示例使用LibTooling为clang4.0编写一个工具。给定当前语句stmt,我希望在AST中获取它的直接父级。因此,我尝试使用以下代码转储stmt的所有父级(用于测试目的): 我是否错过了使用getParents的任何内容(初始化、设置) 问题来自以下几行: const Stmt currentStmt = *s; 这样做的目的是复制一份声明上下文->getParents()通过查找将参数作为子节点传递的节点来工作。但是由于currentsmt只存在于堆栈中,而不在上下文

我正在基于这个示例使用LibTooling为clang4.0编写一个工具。给定当前语句stmt,我希望在AST中获取它的直接父级。因此,我尝试使用以下代码转储stmt的所有父级(用于测试目的):


我是否错过了使用getParents的任何内容(初始化、设置)

问题来自以下几行:

const Stmt  currentStmt = *s;
这样做的目的是复制一份声明<代码>上下文->getParents()通过查找将参数作为子节点传递的节点来工作。但是由于
currentsmt
只存在于堆栈中,而不在上下文中,因此它无法找到任何这样的节点

通过将
currentsmt
作为对s所指节点的引用:

const Stmt& currentStmt = *s;

然后,您将向上下文传递它自身中的实际节点实例,而clang将成功地找到父节点。

我对
const Stmt currentsmt=*s感到困惑。我想你的意思是
constmt¤tsmt=*s我不确定这是否是问题的原因,但这很可能会让clang误以为这是一个类似但不同的语句,没有父语句。我从未使用过clang,但使用过其他几个解析/AST库。在处理的某些(通常是早期)阶段,某些信息不可用是很常见的,即使节点的API仍然保持不变(基本上是因为在每个处理阶段重新创建新节点对象的成本太高)。您确定API没有对getParents()函数指定这样的限制吗?@Frank
const Stmt¤tsmt=*s成功了,谢谢。如果你有很好的解释,请回答下面的问题,这样我可以把你的答案标记为正确ans@jwatkins:我检查了文档,似乎没有这样的限制。您可以使用parentStmt->dumpPretty(*astContext);如果dump()的结果让您感到困惑。
const Stmt  currentStmt = *s;
const Stmt& currentStmt = *s;