Pet*_*ter 7 c++ clang abstract-syntax-tree libtooling
考虑以下结构体定义foo.cc:
struct Foo
{
int &bar;
};
Run Code Online (Sandbox Code Playgroud)
因为bar具有引用类型,所以隐式普通默认构造函数Foo::Foo()被隐式删除。然而,这个事实似乎并没有反映在 clang 生成的 AST 中。例如,运行clang -Xclang -ast-dump foo.cc结果为:
struct Foo
{
int &bar;
};
Run Code Online (Sandbox Code Playgroud)
所以这里看起来像存在一个隐式的普通默认构造函数,但没有提到它被删除。同样,clang::CXXRecordDeclAPI 似乎也没有提供确定这一点的方法。但此时(语义分析之后)该信息不应该可用吗?如何使用 clang AST API 来查明某个类的隐式普通默认构造函数是否被隐式删除?
小智 0
隐式构造函数不存在于CXXRecordDecl节点下的 AST 中,而仅存在于DefinitionData.
您可以Sema::ForceDeclarationOfImplicitMembers在 AST 插件中使用来获取构造函数,然后检查是否被删除。
// force declaration of implict constructors
clang::Sema &sema = Instance.getSema();
sema.ForceDeclarationOfImplicitMembers(const_cast<CXXRecordDecl*>(cxxRecordDecl));
// then check whether constructor is deleted
for (const auto* ctor : cxxRecordDecl->ctors()) {
if (ctor->isDeleted() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |