clang整洁在启用c++20的情况下编译时会发出警告



我最近更新了我的项目及其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整洁配置选项都不会导致此错误。我在原始配置文件中几乎所有这些都有,并删除了不会导致错误的部分。似乎只有TemplateParameterTypeTemplateParameter子选项受此影响。我已经测试了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添加同一行。

相关内容

  • 没有找到相关文章