在Clang中生成默认构造函数

时间:2019-01-03 21:23:22

标签: c++ clang++

我正在尝试使用插件从Clang中提取AST,我想获取默认构造函数的“源代码”。例如,在我的源代码中,我有:

class T { public: T() = default; }

在Clang AST中,构造函数对象的getBody()成员返回null。是否有某种方式可以将默认实现设为Stmt?在这种情况下,它将返回{},但在一般情况下,它将涉及调用父级构造函数等。

一个简单的示例,将以下内容写入文件:

class P { }
int main() {
  // P x;
  return 0;
}

此文件不会生成任何构造函数代码(您可以使用(clang++ -Xclang -ast-dump -fsyntax-only test-ctor.cpp转储AST,但是如果取消注释P x行,则同一命令将生成一个默认构造函数:

| CXXConstructorDecl 0x562bdb879eb0 <line:5:5, col:17> col:5 used P 'void () noexcept' default trivial
| `-CompoundStmt 0x562bdb87a570 <col:17>

谢谢!

2 个答案:

答案 0 :(得分:0)

基于this post和C ++ 11,

  

当默认使用构造函数(3.2)创建其类类型的对象(1.8)或在其首次声明后明确将其默认设置时,将隐式定义默认的默认构造函数,而不将其定义为删除。 >

因此,在代码中P x时有一个CXXConstructorDecl节点,即,对象x的类类型为P

答案 1 :(得分:0)

这可以通过Sema对象使用诸如DefineImplicitDefaultConstructor之类的功能来实现。 Sema对象可从CompilerInstance获得。