我试图提取一个AST从Clang使用一个插件,我想得到的“源代码”的默认构造函数。
例如,在我的源代码中,我有:
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条答案
按热度按时间uajslkp61#
这可以通过
Sema
对象使用以下函数来实现:DefineImplicitDefaultConstructor
。Sema
对象可从CompilerInstance
获得。k3bvogb12#
基于this post和C++11语言,
一个默认的且未定义为删除的构造函数,当它被odr使用(3.2)来创建一个其类类型的对象(1.8)时,或者当它在第一次声明后被显式默认时,它被隐式定义。
因此,当
P x
在代码中时,有一个CXXConstructorDecl节点,即对象x
由其类类型P
创建。