如何解决Clang Libtooling-为类模板的隐式实例生成ClassTemplateSpecializationDecl
因此,我一直在努力理解为什么我不能使用ASTVisitor分析隐式声明的模板。此源代码例如:
template<class T>
struct Z{ };
Z<int> a; // implicit instantiation of Z<int>
将使用以下命令生成以下AST转储:
-Xclang -ast-dump -fSyntax-only temp.cpp
|-ClasstemplateDecl 0xeb29b90 <temp.cpp:2:1,line:4:3> line:3:8 Z
| |-TemplateTypeParmDecl 0xeb29a28 <line:2:10,col:16> col:16 class depth 0 index 0 T
| |-CXXRecordDecl 0xeb29b00 <line:3:1,line:4:3> line:3:8 struct Z deFinition
| | |-DeFinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
| | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
| | | |-copyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
| | | |-MoveConstructor exists simple trivial needs_implicit
| | | |-copyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
| | | |-MoveAssignment exists simple trivial needs_implicit
| | | `-Destructor simple irrelevant trivial needs_implicit
| | `-CXXRecordDecl 0xeb29df8 <col:1,col:8> col:8 implicit struct Z
| `-ClasstemplateSpecializationDecl 0xeb29eb8 <line:2:1,line:4:3> line:3:8 struct Z deFinition
| |-DeFinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
| | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr
| | |-copyConstructor simple trivial has_const_param implicit_has_const_param
| | |-MoveConstructor exists simple trivial
| | |-copyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param
| | |-MoveAssignment exists simple trivial needs_implicit
| | `-Destructor simple irrelevant trivial needs_implicit
| |-TemplateArgument type 'int'
| |-CXXRecordDecl 0xeb2a190 prev 0xeb29eb8 <col:1,col:8> col:8 implicit struct Z
| |-CXXConstructorDecl 0xeb2a250 <col:8> col:8 implicit used constexpr Z 'void () noexcept' inline default trivial
| | `-CompoundStmt 0xeb2a740 <col:8>
| |-CXXConstructorDecl 0xeb2a3a0 <col:8> col:8 implicit constexpr Z 'void (const Z<int> &)' inline default trivial noexcept-unevaluated 0xeb2a3a0
| | `-ParmVarDecl 0xeb2a4d0 <col:8> col:8 'const Z<int> &'
| `-CXXConstructorDecl 0xeb2a570 <col:8> col:8 implicit constexpr Z 'void (Z<int> &&)' inline default trivial noexcept-unevaluated 0xeb2a570
| `-ParmVarDecl 0xeb2a6a0 <col:8> col:8 'Z<int> &&'
`-VarDecl 0xeb2a078 <line:6:1,col:8> col:8 a 'Z<int>':'Z<int>' callinit
`-CXXConstructExpr 0xeb2a750 <col:8> 'Z<int>':'Z<int>' 'void () noexcept'
具有用于隐式声明的ClasstemplateSpecializationDecl。但是如果我使用:
bool VisitClasstemplateDecl(ClasstemplateDecl *tempDecl) {
llvm::errs() << "\nTemplate: " << tempDecl->getDeclName().getAsstring();
if(tempDecl->specializations().empty()){
llvm::errs() << " - has no specializations\n";
}
return true;
}
bool VisitClasstemplateSpecializationDecl(ClasstemplateSpecializationDecl *tempDecl) {
llvm::errs() << "\nSpecialization : " << tempDecl->getDeclName().getAsstring();
return true;
}
作为我的libclang工具的一部分,它将导致输出:
Template: Z - has no specializations
VisitClasstemplateDecl
声明Z没有专长,并且从未访问过VisitClasstemplateSpecializationDecl
。
如果我将隐式实例化更改为显式实例,即template struct Z<double>;
,则VisitClasstemplateDecl
仍说Z没有专长,但访问了VisitClasstemplateSpecializationDecl
:
Template: Z - has no specializations
SpecialIzation : Z
为什么ASTVisitor会忽略转储中出现的隐式ClasstemplateSpecializationDecls?为什么ClasstemplateDecl::specializations()
似乎根本不起作用?以及如何从隐式实例化的模板中获取ClasstemplateSpecializationDecl?
非常感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。