Clang AST中的表达式大小对于成员访问不正确

Clang AST中的表达式大小对于成员访问不正确,clang,llvm-clang,libtooling,Clang,Llvm Clang,Libtooling,假设我有以下代码: struct S { int abcd = 0; }; int main() { S s; return s.abcd; } 对应的AST部分: -FunctionDecl 0x563ddd3a3e20 <line:5:1, line:8:1> line:5:5 main 'int ()' `-CompoundStmt 0x563ddd3a4570 <col:12, line:8:1> |-DeclStmt 0x563ddd3a44e

假设我有以下代码:

struct S {
int abcd = 0;
};

int main() {
S s;
return s.abcd;
}
对应的AST部分:

 -FunctionDecl 0x563ddd3a3e20 <line:5:1, line:8:1> line:5:5 main 'int ()'
  `-CompoundStmt 0x563ddd3a4570 <col:12, line:8:1>
    |-DeclStmt 0x563ddd3a44e0 <line:6:1, col:4>
    | `-VarDecl 0x563ddd3a3f40 <col:1, col:3> col:3 used s 'S' callinit
    |   `-CXXConstructExpr 0x563ddd3a44b8 <col:3> 'S' 'void () noexcept'
    `-ReturnStmt 0x563ddd3a4560 <line:7:1, col:10>
      `-ImplicitCastExpr 0x563ddd3a4548 <col:8, col:10> 'int' <LValueToRValue>
        `-MemberExpr 0x563ddd3a4518 <col:8, col:10> 'int' lvalue .abcd 0x563ddd3a3d10
          `-DeclRefExpr 0x563ddd3a44f8 <col:8> 'S' lvalue Var 0x563ddd3a3f40 's' 'S'
`-FunctionDecl 0x562842792e20行:5:5 main'int()'
`-复合材料STMT 0x562842793590
|-DeclStmt 0x5628427934e0
|`-VarDecl 0x562842792f40列:3个使用了s's'callinit
|`-cxxxconstructexpr 0x5628427934b8的“”无效()无异常'
`-返回STMT 0x562842793580
`-隐式卡斯特xpr 0x562842793568“int”
`-ParenExpr 0x562842793548“内部”左值
`-MemberExpr 0x562842793518“int”左值。abcd 0x562842792d10
`-DeclRefExpr 0x5628427934f8的左值变量0x562842792f40的
另外,您可以看到
ParenExpr
跨越8-15列,而
MemberExpr
跨越9-11列,这暴露了后面的AST节点的奇怪性

我错过什么了吗

我正在进行源代码到源代码的转换,我希望得到表达式/语句的正确大小。现在我不知道怎么做<原始return语句的code>getEndLoc()还返回
(点运算符)的位置


clangversion9.0.1

我决定向cfe-dev邮件列表寻求帮助,以下是我学到的

似乎我完全误解了
getBeginLoc()
/
getEndLoc()
的含义
getBeginLoc()
返回第一个令牌的起始位置,而
getEndLoc()
返回最后一个令牌的起始位置

要获取令牌的结尾,可以使用
Lexer::getLocForEndOfToken(…)

文档也可能有帮助:

int main() {
S s;
return (s.abcd);
}
`-FunctionDecl 0x562842792e20 <line:5:1, line:8:1> line:5:5 main 'int ()'
  `-CompoundStmt 0x562842793590 <col:12, line:8:1>
    |-DeclStmt 0x5628427934e0 <line:6:1, col:4>
    | `-VarDecl 0x562842792f40 <col:1, col:3> col:3 used s 'S' callinit
    |   `-CXXConstructExpr 0x5628427934b8 <col:3> 'S' 'void () noexcept'
    `-ReturnStmt 0x562842793580 <line:7:1, col:15>
      `-ImplicitCastExpr 0x562842793568 <col:8, col:15> 'int' <LValueToRValue>
        `-ParenExpr 0x562842793548 <col:8, col:15> 'int' lvalue
          `-MemberExpr 0x562842793518 <col:9, col:11> 'int' lvalue .abcd 0x562842792d10
            `-DeclRefExpr 0x5628427934f8 <col:9> 'S' lvalue Var 0x562842792f40 's' 'S'