微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RecursiveASTVisitor 不访问 clang::VarDecl

如何解决RecursiveASTVisitor 不访问 clang::VarDecl

我有以下 c 代码 test1.c

double multiply(double x,double y) {
    return x * y * y;
}

int main(int argc,char const *argv[])
{
    double a;

    int b;

    float d;

    double x = 3.0;
    double y = 5.0;

    double z = multiply(x,y);

    return 0;
}

我试图通过实现 bool VistvarDecl(clang::VarDecl *vardecl) 来让 RecursiveASTVisitor 访问变量声明 (clang::VarDecl)。但是,即使我设法访问了 AST 中的所有其他节点,也从未访问过 clang::VarDecl 节点。此外,在 clang-query 上使用 test1.c可以匹配 varDecl

我的 RecursiveASTVistor 如下:

struct MyASTVisitor : public clang::RecursiveASTVistor<MyASTVisitor> {

  bool VistvarDecl(clang::VarDecl *vardecl) {
     llvm::outs() << "Found a VarDecl";
  };

  bool VisitFunctionDecl(clang::FunctionDecl *decl) {
     llvm::outs() << "Found a FunctionDecl";
  };

  // other functions implemented similarly just to see if it visits properly
  bool VisitParmVarmDecl(clang::ParmVarDecl *paramvardecl);
  bool VisitCallExpr(clang::CallExpr *callexpr);
  bool VisitImplicitCastExpr(clang::ImplicitCastExpr *castexpr);
  bool VisitBinaryOperator(clang::BinaryOperator *bo);
  bool VisitDeclStmt(clang::DeclStmt *declstmt);
  bool VisitDeclRefExpr(clang::DeclRefExpr *declrefexpr);
  bool VisitFloatingLiteral(clang::FloatingLiteral *floatliteral);
};

struct MyASTConsumer : public clang::ASTConsumer {

  bool HandletopLevelDecl(clang::DeclGroupRef DR) override {
    for (clang::DeclGroupRef::iterator b = DR.begin(),e = DR.end(); b != e; ++b) {
        Visitor.TraverseDecl(*b);
     }
     return true;
  }
private: 
  MyASTVisitor Visitor;
};

有谁知道 clang::VarDecl 节点是唯一未被 RecursiveASTVisitor 访问但与 clang-query 匹配的节点吗?

下面给出了来自 clang 的 AST 转储:

TranslationUnitDecl 0x7fba2300ce08 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fba2300d6a0 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x7fba2300d3a0 '__int128'
|-TypedefDecl 0x7fba2300d710 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fba2300d3c0 'unsigned __int128'
|-TypedefDecl 0x7fba2300da18 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-recordtype 0x7fba2300d7f0 'struct __NSConstantString_tag'
|   `-Record 0x7fba2300d768 '__NSConstantString_tag'
|-TypedefDecl 0x7fba2300dab0 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fba2300da70 'char *'
|   `-BuiltinType 0x7fba2300cea0 'char'
|-TypedefDecl 0x7fba2300dda8 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fba2300dd50 'struct __va_list_tag [1]' 1
|   `-recordtype 0x7fba2300db90 'struct __va_list_tag'
|     `-Record 0x7fba2300db08 '__va_list_tag'
|-FunctionDecl 0x7fba22829370 <test4.c:2:1,line:4:1> line:2:8 used multiply 'double (double,double)'
| |-ParmVarDecl 0x7fba22829218 <col:17,col:24> col:24 used x 'double'
| |-ParmVarDecl 0x7fba22829298 <col:27,col:34> col:34 used y 'double'
| `-CompoundStmt 0x7fba22829560 <col:37,line:4:1>
|   `-ReturnStmt 0x7fba22829550 <line:3:2,col:17>
|     `-BinaryOperator 0x7fba22829530 <col:9,col:17> 'double' '*'
|       |-BinaryOperator 0x7fba228294d8 <col:9,col:13> 'double' '*'
|       | |-ImplicitCastExpr 0x7fba228294a8 <col:9> 'double' <LValuetoRValue>
|       | | `-DeclRefExpr 0x7fba22829468 <col:9> 'double' lvalue ParmVar 0x7fba22829218 'x' 'double'
|       | `-ImplicitCastExpr 0x7fba228294c0 <col:13> 'double' <LValuetoRValue>
|       |   `-DeclRefExpr 0x7fba22829488 <col:13> 'double' lvalue ParmVar 0x7fba22829298 'y' 'double'
|       `-ImplicitCastExpr 0x7fba22829518 <col:17> 'double' <LValuetoRValue>
|         `-DeclRefExpr 0x7fba228294f8 <col:17> 'double' lvalue ParmVar 0x7fba22829298 'y' 'double'
`-FunctionDecl 0x7fba228297d0 <line:6:1,line:22:1> line:6:5 main 'int (int,const char **)'
  |-ParmVarDecl 0x7fba22829590 <col:10,col:14> col:14 argc 'int'
  |-ParmVarDecl 0x7fba228296b0 <col:20,col:37> col:32 argv 'const char **':'const char **'
  `-CompoundStmt 0x7fba22829da8 <line:7:1,line:22:1>
    |-DeclStmt 0x7fba22829928 <line:10:2,col:10>
    | `-VarDecl 0x7fba228298c0 <col:2,col:9> col:9 a 'double'
    |-DeclStmt 0x7fba228299c0 <line:12:2,col:7>
    | `-VarDecl 0x7fba22829958 <col:2,col:6> col:6 b 'int'
    |-DeclStmt 0x7fba22829a58 <line:14:2,col:9>
    | `-VarDecl 0x7fba228299f0 <col:2,col:8> col:8 d 'float'
    |-DeclStmt 0x7fba22829b10 <line:16:2,col:16>
    | `-VarDecl 0x7fba22829a88 <col:2,col:13> col:9 used x 'double' cinit
    |   `-FloatingLiteral 0x7fba22829af0 <col:13> 'double' 3.000000e+00
    |-DeclStmt 0x7fba22829bc8 <line:17:2,col:16>
    | `-VarDecl 0x7fba22829b40 <col:2,col:13> col:9 used y 'double' cinit
    |   `-FloatingLiteral 0x7fba22829ba8 <col:13> 'double' 5.000000e+00
    |-DeclStmt 0x7fba22829d60 <line:19:2,col:26>
    | `-VarDecl 0x7fba22829bf8 <col:2,col:25> col:9 z 'double' cinit
    |   `-CallExpr 0x7fba22829d00 <col:13,col:25> 'double'
    |     |-ImplicitCastExpr 0x7fba22829ce8 <col:13> 'double (*)(double,double)' <FunctionToPointerDecay>
    |     | `-DeclRefExpr 0x7fba22829c60 <col:13> 'double (double,double)' Function 0x7fba22829370 'multiply' 'double (double,double)'
    |     |-ImplicitCastExpr 0x7fba22829d30 <col:22> 'double' <LValuetoRValue>
    |     | `-DeclRefExpr 0x7fba22829c80 <col:22> 'double' lvalue Var 0x7fba22829a88 'x' 'double'
    |     `-ImplicitCastExpr 0x7fba22829d48 <col:24> 'double' <LValuetoRValue>
    |       `-DeclRefExpr 0x7fba22829ca0 <col:24> 'double' lvalue Var 0x7fba22829b40 'y' 'double'
    `-ReturnStmt 0x7fba22829d98 <line:21:2,col:9>
      `-IntegerLiteral 0x7fba22829d78 <col:9> 'int' 0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。