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