我正在编写一个使用Clang抽象语法树的工具,似乎某些节点的类型信息不正确。以下面的程序为例,
struct P { ... };
P& ret_ref(P& x) { return x; }
P&& ret_rref(P& x) { return x; }
用clang转储语法树会产生以下结果:
|-FunctionDecl 0x28ca4d8 <line:117:1, line:119:1> line:117:4 ret_ref 'P &(P &)'
| |-ParmVarDecl 0x28ca420 <col:12, col:15> col:15 used x 'P &'
| |-CompoundStmt 0x28ca5d8 <col:18, line:119:1>
| | `-ReturnStmt 0x28ca598 <line:118:5, col:12>
| | `-DeclRefExpr 0x28ca578 <col:12> 'P' lvalue ParmVar 0x28ca420 'x' 'P &'
|-FunctionDecl 0x28ca800 <line:128:1, line:130:1> line:128:5 used ret_rref 'P &&(P &)'
| |-ParmVarDecl 0x28ca600 <col:14, col:17> col:17 used x 'P &'
| |-CompoundStmt 0x28ca938 <col:20, line:130:1>
| | `-ReturnStmt 0x28ca900 <line:129:5, col:30>
| | `-CXXStaticCastExpr 0x28ca8d0 <col:12, col:30> 'P' xvalue static_cast<struct P &&> <NoOp>
| | `-DeclRefExpr 0x28ca8a0 <col:29> 'P' lvalue ParmVar 0x28ca600 'x' 'P &'
请注意,DeclRefExpr
节点的类型为P
(尽管它们包含的ParmVar
的类型为P&
)。同样,请注意,CXXStaticCastExpr
也具有类型P
,当它(显然吗?)应具有类型P&&
(毕竟是强制转换)。
这是clang故意做的事情吗?我是否误解了C ++规范所说的内容?这是Clang中的错误吗?