微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clang Libtooling-为类模板的隐式实例生成ClassTemplateSpecializationDecl

如何解决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 举报,一经查实,本站将立刻删除。