You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:25:04