问题描述
因此,我一直在努力理解为什么我不能使用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 (将#修改为@)