在 Clang AST 中存储 Decl 节点

Storing Decl nodes in Clang AST

我正在尝试将所有 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'

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

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

以下是针对您的问题的正确解决方案:

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);
  }
}