我最近更新了我的项目及其CI管道,以使用C++20功能。当我将编译器设置更改为使用C++20时,clang整洁开始为我所有检查的文件发出以下警告(我将其视为错误(:
error: invalid case style for template parameter 'expr-type' [readability-identifier-naming,-warnings-as-errors]
我可以使用CMake和clang整洁的配置文件将其缩小到以下最小示例:
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(clang_tidy_warning LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(clang_tidy_warning main.cpp)
.叮当作响
Checks: >
readability-*,
WarningsAsErrors: '*'
CheckOptions:
- {key: readability-identifier-naming.TemplateParameterCase, value: lower_case}
- {key: readability-identifier-naming.TypeTemplateParameterCase, value: CamelCase }
- {key: readability-identifier-naming.TemplateParameterPrefix, value: t_ }
- {key: readability-identifier-naming.TypeTemplateParameterPrefix, value: T_ }
main.cpp
#include <iostream>
int main() { return 0; }
您应该能够在Ubuntu 20.04中使用以下命令在根目录中复制它:
mkdir build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=DEBUG ..
run-clang-tidy-12 -quiet
如果您执行以下操作之一,错误/警告将消失:
- 从配置文件中删除指定的检查选项
- 将c++标准设置为17
- 删除主文件中的
#include
用另一个标准库头交换iostream
没有帮助,但我还没有测试它们。同样值得一提的是,所有其他可能的clang整洁配置选项都不会导致此错误。我在原始配置文件中几乎所有这些都有,并删除了不会导致错误的部分。似乎只有TemplateParameter
和TypeTemplateParameter
子选项受此影响。我已经测试了clang-time版本9、10和12。所有这些都会发出相同的警告。我还测试了将不同的编译器(clang 12和gcc10(传递给CMake。没有更改任何内容(我想不知道clang整洁是否受到编译器选择的影响(。我使用的是Ubuntu 20.04(最新版本(,您也可以在GitHub操作运行程序中重现错误。
所以我的问题是。这是一个(已知的(错误,还是在这个叮当作响的整洁设置中与C++20不兼容?如果它是已知的,你能给我解释一下为什么会发生这种情况以及如何修复它吗?
编辑
正如劳伦斯·本森在评论中提到的,这可能也与操作系统有关。他不能在Mac上复制,但可以在Ubuntu上复制。
相关错误报告
这是0x5453发现的相关错误报告的链接:点击我
更新:作为";Buster";在评论中指出,错误报告已被移动此处
此错误在版本14中仍未修复。
然而,作为";薛定谔朱;已经在问题评论中暗示并且如用户所示;saitou1024";在Github上的错误报告中,可以使用readability-identifier-naming.TypeTemplateParameterIgnoredRegexp
来解决这个问题。
将CheckOptions
下的以下行添加到clang整洁的配置文件中:
CheckOptions:
- {key: readability-identifier-naming.TypeTemplateParameterIgnoredRegexp, value: expr-type}
对我来说,这解决了这个问题,现在我可以再次将readability-identifier-naming
警告视为错误,以在CI管道中强制执行命名约定。
附加说明:
由于上面的行只影响TypeTemplateParameter
选项,并且在指定TemplateParameter
选项时也会出现错误,请注意还有一个TemplateParameterIgnoredRegexp
选项。因此,如果这种解决方法不能为您解决问题,请尝试使用TemplateParameterIgnoredRegexp
添加同一行。