| 1 | // REQUIRES: static-analyzer |
| 2 | // RUN: %check_clang_tidy %s google-explicit-constructor,clang-diagnostic-unused-variable,clang-analyzer-core.UndefinedBinaryOperatorResult,modernize-avoid-c-arrays,cppcoreguidelines-avoid-c-arrays,cppcoreguidelines-pro-type-member-init %t -- -extra-arg=-Wunused-variable -- -I%S/Inputs/nolint |
| 3 | |
| 4 | #include "trigger_warning.h" |
| 5 | void I(int& Out) { |
| 6 | int In; |
| 7 | A1(In, Out); |
| 8 | } |
| 9 | // CHECK-MESSAGES-NOT: trigger_warning.h:{{.*}} warning |
| 10 | // CHECK-MESSAGES-NOT: :[[@LINE-4]]:{{.*}} note |
| 11 | |
| 12 | class A { A(int i); }; |
| 13 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: single-argument constructors must be marked explicit |
| 14 | |
| 15 | class B { B(int i); }; // NOLINT |
| 16 | |
| 17 | class C { C(int i); }; // NOLINT(for-some-other-check) |
| 18 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: single-argument constructors must be marked explicit |
| 19 | |
| 20 | class C1 { C1(int i); }; // NOLINT() |
| 21 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit |
| 22 | |
| 23 | class C2 { C2(int i); }; // NOLINT(*) |
| 24 | |
| 25 | class C3 { C3(int i); }; // NOLINT(not-closed-bracket-is-treated-as-skip-all |
| 26 | |
| 27 | class C4 { C4(int i); }; // NOLINT(google-explicit-constructor) |
| 28 | |
| 29 | class C5 { C5(int i); }; // NOLINT(some-check, google-explicit-constructor) |
| 30 | |
| 31 | class C6 { C6(int i); }; // NOLINT without-brackets-skip-all |
| 32 | |
| 33 | // Other NOLINT* types (e.g. NEXTLINE) should not be misconstrued as a NOLINT: |
| 34 | class C7 { C7(int i); }; // NOLINTNEXTLINE |
| 35 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit |
| 36 | |
| 37 | // NOLINT must be UPPERCASE: |
| 38 | // NOLINTnextline |
| 39 | class C8 { C8(int i); }; // nolint |
| 40 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit |
| 41 | |
| 42 | // Unrecognized marker: |
| 43 | // NOLINTNEXTLINEXYZ |
| 44 | class C9 { C9(int i); }; // NOLINTXYZ |
| 45 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit |
| 46 | |
| 47 | // C-style comments are supported: |
| 48 | class C10 { C10(int i); }; /* NOLINT */ |
| 49 | /* NOLINT */ class C11 { C11(int i); }; |
| 50 | |
| 51 | // Multiple NOLINTs in the same comment: |
| 52 | class C12 { C12(int i); }; // NOLINT(some-other-check) NOLINT(google-explicit-constructor) |
| 53 | class C13 { C13(int i); }; // NOLINT(google-explicit-constructor) NOLINT(some-other-check) |
| 54 | class C14 { C14(int i); }; // NOLINTNEXTLINE(some-other-check) NOLINT(google-explicit-constructor) |
| 55 | |
| 56 | // NOLINTNEXTLINE(google-explicit-constructor) NOLINT(some-other-check) |
| 57 | class C15 { C15(int i); }; |
| 58 | |
| 59 | // Any text after a NOLINT expression is treated as a comment: |
| 60 | class C16 { C16(int i); }; // NOLINT: suppress check because <reason> |
| 61 | class C17 { C17(int i); }; // NOLINT(google-explicit-constructor): suppress check because <reason> |
| 62 | |
| 63 | // NOLINT must appear in its entirety on one line: |
| 64 | class C18 { C18(int i); }; /* NOL |
| 65 | INT */ |
| 66 | // CHECK-MESSAGES: :[[@LINE-2]]:13: warning: single-argument constructors must be marked explicit |
| 67 | |
| 68 | /* NO |
| 69 | LINT */ class C19 { C19(int i); }; |
| 70 | // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: single-argument constructors must be marked explicit |
| 71 | |
| 72 | // Spaces between items in the comma-separated check list are ignroed: |
| 73 | class C20 { C20(int i); }; // NOLINT( google-explicit-constructor ) |
| 74 | class C21 { C21(int i); }; // NOLINT( google-explicit-constructor , some-other-check ) |
| 75 | class C22 { C22(int i); }; // NOLINT(google-explicit- constructor) |
| 76 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: single-argument constructors must be marked explicit |
| 77 | |
| 78 | // If there is a space between "NOLINT" and the bracket, it is treated as a regular NOLINT: |
| 79 | class C23 { C23(int i); }; // NOLINT (some-other-check) |
| 80 | |
| 81 | void f() { |
| 82 | int i; |
| 83 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: unused variable 'i' [clang-diagnostic-unused-variable] |
| 84 | int j; // NOLINT |
| 85 | int k; // NOLINT(clang-diagnostic-unused-variable) |
| 86 | } |
| 87 | |
| 88 | #define MACRO(X) class X { X(int i); }; |
| 89 | MACRO(D) |
| 90 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: single-argument constructors must be marked explicit |
| 91 | MACRO(E) // NOLINT |
| 92 | |
| 93 | #define MACRO_NOARG class F { F(int i); }; |
| 94 | MACRO_NOARG // NOLINT |
| 95 | |
| 96 | #define MACRO_NOLINT class G { G(int i); }; // NOLINT |
| 97 | MACRO_NOLINT |
| 98 | |
| 99 | // Check that we can suppress diagnostics about macro arguments (as opposed to |
| 100 | // diagnostics about the macro contents itself). |
| 101 | #define MACRO_SUPPRESS_DIAG_FOR_ARG_1(X) \ |
| 102 | class X { \ |
| 103 | X(int i); /* NOLINT(google-explicit-constructor) */ \ |
| 104 | }; |
| 105 | |
| 106 | MACRO_SUPPRESS_DIAG_FOR_ARG_1(G1) |
| 107 | |
| 108 | #define MACRO_SUPPRESS_DIAG_FOR_ARG_2(X) \ |
| 109 | struct X { /* NOLINT(cppcoreguidelines-pro-type-member-init) */ \ |
| 110 | int a = 0; \ |
| 111 | int b; \ |
| 112 | }; |
| 113 | |
| 114 | MACRO_SUPPRESS_DIAG_FOR_ARG_2(G2) |
| 115 | |
| 116 | #define DOUBLE_MACRO MACRO(H) // NOLINT |
| 117 | DOUBLE_MACRO |
| 118 | |
| 119 | class D1 { D1(int x); }; // NOLINT(google*) |
| 120 | class D2 { D2(int x); }; // NOLINT(*explicit-constructor) |
| 121 | class D3 { D3(int x); }; // NOLINT(*explicit*) |
| 122 | class D4 { D4(int x); }; // NOLINT(-explicit-constructor) |
| 123 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: single-argument constructors must be marked explicit |
| 124 | class D5 { D5(int x); }; // NOLINT(google*,-google*) |
| 125 | class D6 { D6(int x); }; // NOLINT(*,-google*) |
| 126 | |
| 127 | int array1[10]; |
| 128 | // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead [cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays] |
| 129 | |
| 130 | int array2[10]; // NOLINT(cppcoreguidelines-avoid-c-arrays) |
| 131 | // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] |
| 132 | |
| 133 | int array3[10]; // NOLINT(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) |
| 134 | int array4[10]; // NOLINT(*-avoid-c-arrays) |
| 135 | |
| 136 | // CHECK-MESSAGES: Suppressed 36 warnings (36 NOLINT) |
| 137 | |