获取Clang AST节点类型的可靠方法

获取Clang AST节点类型的可靠方法,clang,language-lawyer,clang++,llvm-clang,Clang,Language Lawyer,Clang++,Llvm Clang,我正在编写一个工具,它使用了Clang的抽象语法树,似乎有些节点的类型信息不正确。以下面的程序为例, struct P{…}; P&ret_ref(P&x){return x;} P&ret_rref(P&x){return x;} 使用叮当声转储语法树会产生以下结果: |-FunctionDecl 0x28ca4d8行:117:4返回参考'P&(P&)' ||-ParmVarDecl 0x28ca420列:15个已用x'P&' ||-复合材料STMT 0x28ca5d8 ||`-Return

我正在编写一个工具,它使用了Clang的抽象语法树,似乎有些节点的类型信息不正确。以下面的程序为例,

struct P{…};
P&ret_ref(P&x){return x;}
P&ret_rref(P&x){return x;}
使用叮当声转储语法树会产生以下结果:

|-FunctionDecl 0x28ca4d8行:117:4返回参考'P&(P&)'
||-ParmVarDecl 0x28ca420列:15个已用x'P&'
||-复合材料STMT 0x28ca5d8
||`-ReturnStmt 0x28ca598
||`-DeclRefExpr 0x28ca578'P'左值ParmVar 0x28ca420'x'P&'
|-FunctionDecl 0x28ca800行:128:5已使用ret_rref“P&&(P&)”
||-ParmVarDecl 0x28ca600列:17个已用x'P&'
||-复合材料STMT 0x28ca938
||`-返回STMT 0x28ca900
||`-CXXStaticCastXPR 0x28ca8d0'P'X值静态\U转换
|| `DeclRefExpr 0x28ca8a0'P'左值ParmVar 0x28ca600'x''P&'
请注意,
DeclRefExpr
节点具有类型
p
(尽管它们包含的
ParmVar
是类型
p&
)。类似地,请注意,
cxstaticcastexpr
也有类型
P
,而它(显然?)应该有类型
P&
(毕竟是强制转换)


这是clang故意做的事吗?我误解了C++规范所说的内容吗?这是叮当作响的虫子吗?

谢谢!这有什么原因吗?忘记这些信息似乎很奇怪。关于“为什么”,这可能是有用的。谢谢这有什么原因吗?忘记这些信息似乎很奇怪。关于“为什么”,这可能是有用的。