如何在varDecl中匹配模板参数的Sugared QualType区分size_t实例?
Clang-Tidy区分size_t与uint64_t模板实例化的问题
背景
C++内置类型无确定大小(仅规定最小值),因此要求所有整数类型使用显式typedef以保证跨平台、编译器及CPU架构的大小一致,唯一例外是size_t(因它是std::vector::size()等常见操作的返回类型)。我们希望通过clang-tidy检测x86架构下MSVC中size_t使用导致的“窄化转换”警告。
问题
给定如下模板函数:
template <typename T> void foo() { int64_t i{0}; T v = i; }
需要区分变量v的varDecl是来自foo<size_t>()调用,还是无问题的foo<uint64_t>()调用。
已尝试方案
观察到FunctionTemplateDecl下存在函数模板实例化,尝试用如下匹配规则获取varDecl的类型:
m varDecl( hasType(substTemplateTypeParmType( hasReplacementType(qualType()) )) )
但替换类型已被“解糖”,丢失了size_t的声明名称。尽管SubstTemplateTypeParmType文档指出其用于记录类型原先是模板参数,永远非规范类型,且类中包含isSugared()和desugar()方法,本应保留size_t的typedef语法糖。
疑问
- 我的假设(
SubstTemplateTypeParmType应返回带语法糖的类型)是否错误? - 是否可以从
varDecl回溯到FunctionTemplateDecl,获取所用特化并从中得到带语法糖的类型?
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

