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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...