Bug in .clang-tidy parsing?

Hi all,

Not sure if this is a bug or i’m just misunderstanding how configuration for .clang-tidy is supposed to work.

In my .clang-tidy I have specified the checks to be run as follows:

Checks: >

-*,

cert-*,

clang-analyzer-*,

cppcoreguidelines-pro-*,

-cppcoreguidelines-pro-bounds-pointer-arithmetic,

misc-*,

modernize-*,

performance-*,

What I expect when I run clang-tidy is that it will run all the checks except for cppcoreguidelines-pro-bounds-pointer-arithmetic and the llvm and readability checks. Instead, clang-tidy seems to run every check. If I change the list to just be something like this:

Checks: >

-*,

cert-*,

clang-analyzer-*,

Then the expected behavior occurs, only the cert and clang-analyzer checks are run. But if I add anything more, for example:

Checks: >

-*,

cert-*,

clang-analyzer-*,

modernize-*,

Then again, all checks are run, not just cert, clang-analyzer and modernize. Is this expected behavior?

+alex

The issue seems to be that the LLVM’s YAML parser doesn’t implement multiline literal folding, which results in the checks list containing line breaks. Clang-tidy doesn’t drop newlines in the checks list (because I haven’t recognized the limitation of our YAML parser when reviewing https://reviews.llvm.org/D30567), and the list of checks is misinterpreted.

There are (at least) two solutions:

  1. Ideally, YAML parser would benefit from the support of multiline literal folding.
  2. As a quick workaround, we can trim newlines from the checks list.

I’ve committed a workaround (2) in r310491.

Thanks for the quick turnaround! I also discovered that if I list every single check explicitly and don’t use any wildcards apart from the first “-*”, then only the listed checks are used and everything seems to work, e.g.: