Search code examples
c++c++20clang-tidy

clang-tidy emits warning when compiling with c++20 enabled


I recently updated my project and its CI pipelines to use C++20 features. When I changed the compiler settings to use C++20, clang-tidy started to emit the following warning (I treat them as errors) for all my checked files:

error: invalid case style for template parameter 'expr-type' [readability-identifier-naming,-warnings-as-errors]

I could narrow it down to the following minimal example using CMake and a clang-tidy config file:

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)

.clang-tidy

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; }

You should be able to reproduce it in Ubuntu 20.04 with the following commands starting in the root directory:

mkdir build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=DEBUG ..
run-clang-tidy-12  -quiet

The error/warning disappears if you do one of the following things:

  • remove the specified check options from the config file
  • set the c++ standard to 17
  • remove the #include in the main file

Exchanging iostream with another standard library header didn't help, but I have not tested them all. It is also worth mentioning that all other possible clang-tidy configuration options do not cause this error. I had nearly all of them in the original config file and removed the ones that do not cause the error. It seems like only the TemplateParameter and TypeTemplateParameter suboptions are affected by this. I have tested clang-tidy versions 9, 10, and 12. All emit the same warning. I also tested passing different compilers (clang 12 and gcc10) to CMake. Did not change anything (do not know if clang-tidy is even affected by the compiler choice, I guess not). I am using Ubuntu 20.04 (up-to-date) and you can also reproduce the error in a GitHub action runner.

So my questions are. Is this a (known) bug or is there any incompatibility with C++ 20 in this clang-tidy setup? If it is already known, can you give me an explanation of why it occurs and how to fix it?

EDIT

As Lawrence Benson mentioned in the comments, this might be also OS-related. He couldn't reproduce on a Mac, but on Ubuntu.

Related bug report

Here is the link to a related bug report found by 0x5453: click me

Update: As "Buster" pointed out in the comments, the bug report has been moved here


Solution

  • This bug is still not fixed in version 14.

    However, as "Schrodinger ZHU" already hinted in the question comments and as shown by the user "saitou1024" in the bug report on Github, one can use readability-identifier-naming.TypeTemplateParameterIgnoredRegexp to work around this problem.

    Add the following line under CheckOptions to your clang-tidy configuration file:

    CheckOptions:  
      - {key: readability-identifier-naming.TypeTemplateParameterIgnoredRegexp, value: expr-type}
    

    For me, this fixed the issue and I can now treat readability-identifier-naming warnings as errors again to enforce naming conventions in a CI pipeline.

    Additional note:

    Since the line above only affects the TypeTemplateParameter options and the bug also occurred when TemplateParameter options were specified, note that there is also a TemplateParameterIgnoredRegexp option. So in case this workaround doesn't fix the problem for you, try adding the same line using TemplateParameterIgnoredRegexp.