[PATCH] D111208: [clang-tidy] Support globbing in NOLINT* expressions

Salman Javed via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 8 02:15:31 PDT 2021


salman-javed-nz added a comment.

What should happen with the following code:

  // NOLINTBEGIN(google*)
  
  // NOLINTEND(google-explicit-constructor)
  // NOLINTEND(google-runtime-operator)

and this code:

  // NOLINTBEGIN(google-explicit-constructor)
  // NOLINTBEGIN(google-runtime-operator)
  
  // NOLINTEND(google*)

At the moment, Clang-Tidy does not allow mixing "check-specific" `NOLINTBEGIN/END`s with "global" ones. See discussion in D108560#3020444 <https://reviews.llvm.org/D108560#3020444>. So the following is not a supported construct:

  // NOLINTBEGIN(google-explicit-constructor)
  // NOLINTEND(*)

How should Clang-Tidy behave when mixing check-specific `NOLINTBEGIN/END`s with globbed ones?



================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:349
+      // Allow specifying a few checks with a glob expression.
+      GlobList Globs(ChecksStr);
+      if (!Globs.contains(CheckName))
----------------
What happens when `CheckStr` is empty?
How has Clang-Tidy treated `// NOLINT()` in the past? Does this patch change the behaviour? What //should // be the "right" behaviour?


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:353
+      if (SuppressionIsSpecific)
+        *SuppressionIsSpecific = true;
     }
----------------
So when this function is called with args `Line = "NOLINTBEGIN(google*)"` and `CheckName = "google-explicit-constructor"`, it will return true with `*SuppressionIsSpecific = true`.
Should `*SuppressionIsSpecific = false` instead here?


================
Comment at: clang-tools-extra/docs/clang-tidy/index.rst:341
+    // Silence all warnings from the "google" module
+    Foo(bool param);  // NOLINT(google*)
+
----------------
To match the spacing in the above lines.


================
Comment at: clang-tools-extra/docs/clang-tidy/index.rst:344
+    // Silence all warnings, *except* the ones from the "google" module
+    Foo(bool param);  // NOLINT(*,-google*)
+
----------------



================
Comment at: clang-tools-extra/docs/clang-tidy/index.rst:347
+    // No warnings are suppressed, due to double negation
+    Foo(bool param);  // NOLINT(-google*)
   };
----------------
carlosgalvezp wrote:
> salman-javed-nz wrote:
> > Would anyone do this on purpose, or is this a user error?
> I don't see any use case here, no. I just thought to document it to clarify the double negation that's happening, in case a user gets confused and doesn't see the warning being suppressed.
> 
> Do you think it brings value or does more harm than good?



================
Comment at: clang-tools-extra/test/clang-tidy/infrastructure/nolint.cpp:63
+
+class D6 { D6(int x); }; // NOLINT(*,-google*)
+// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit
----------------
How about changing `class D6` so that it violates 2 checks: a google one and a non-google one.
Then you can confirm whether the `*` in `NOLINT(*,-google*)` is working.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111208/new/

https://reviews.llvm.org/D111208



More information about the cfe-commits mailing list