【问题标题】:Storing Decl nodes in Clang AST在 Clang AST 中存储 Decl 节点
【发布时间】:2016-06-15 03:58:38
【问题描述】:

我正在尝试将所有 FunctionDecl 节点存储在一个向量中,以便将来可以访问它们。该用例将用于单步执行函数(例如,函数 a 调用函数 b,我希望能够在函数 b 节点上调用 VisitDecl)

所有这些节点的存储都在 ASTConsumer 内的 HandleTopLevelDecl 中完成:

std::vector<Decl> vec;

virtual bool HandleTopLevelDecl (DeclGroupRef DG) {
  for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
    Decl *D = *i;
    vec.push_back(*D);
  }
} 

但是,在编译过程中出现错误 '~Decl' is a protected member of 'clang::Decl'

任何人都可以对此有所了解吗?

【问题讨论】:

    标签: c++ clang abstract-syntax-tree llvm-clang clang-static-analyzer


    【解决方案1】:

    问题是您将Decl 实例的副本放入您的数组中。这些对象的创建和删除是其他类的责任,因此您只能引用一个实例。

    这里是您问题的正确解决方案:

    std::vector<Decl *> vec;
    
    virtual bool HandleTopLevelDecl (DeclGroupRef DG) {
      for (DeclGroupRef::iterator i = DG.begin(), e = DG.end(); i != e; ++i) {
        Decl *D = *i;
        vec.push_back(D);
      }
    }
    

    【讨论】:

    • 谢谢!这解决了将其添加到向量的问题。现在剩下要做的就是检查我是否可以访问存储在向量中的节点。干杯。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2015-08-28
    • 2014-02-14
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多