1 // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h
2 // RUN: %check_clang_tidy -std=c++17 -check-suffix=NORMAL %s modernize-concat-nested-namespaces %t -- -header-filter=".*" -- -I %T
3 // RUN: FileCheck -input-file=%T/modernize-concat-nested-namespaces.h %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h -check-prefix=CHECK-FIXES
4 // Restore header file and re-run with c++20:
5 // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h
6 // RUN: %check_clang_tidy -std=c++20 -check-suffixes=NORMAL,CPP20 %s modernize-concat-nested-namespaces %t -- -header-filter=".*" -- -I %T
7 // RUN: FileCheck -input-file=%T/modernize-concat-nested-namespaces.h %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h -check-prefix=CHECK-FIXES
8
9 #include "modernize-concat-nested-namespaces.h"
10 // CHECK-MESSAGES-NORMAL-DAG: modernize-concat-nested-namespaces.h:1:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
11
12 namespace n1 {}
13
14 namespace n2 {
15 namespace n3 {
16 void t();
17 }
18 namespace n4 {
19 void t();
20 }
21 } // namespace n2
22
23 namespace n6 {
24 namespace [[deprecated]] attr_ns {
25 void t();
26 } // namespace attr_ns
27 } // namespace n6
28
29 namespace n7 {
30 void t();
31
32 namespace n8 {
33 void t();
34 }
35 } // namespace n7
36
37 namespace n9 {
38 namespace n10 {
39 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
40 // CHECK-FIXES-NORMAL: namespace n9::n10
41 void t();
42 } // namespace n10
43 } // namespace n9
44 // CHECK-FIXES-NORMAL: }
45
46 namespace n11 {
47 namespace n12 {
48 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
49 // CHECK-FIXES-NORMAL: namespace n11::n12
50 namespace n13 {
51 void t();
52 }
53 namespace n14 {
54 void t();
55 }
56 } // namespace n12
57 } // namespace n11
58 // CHECK-FIXES-NORMAL: }
59
60 namespace n15 {
61 namespace n16 {
62 void t();
63 }
64
65 inline namespace n17 {
66 void t();
67 }
68
69 namespace n18 {
70 namespace n19 {
71 namespace n20 {
72 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
73 // CHECK-FIXES-NORMAL: namespace n18::n19::n20
74 void t();
75 } // namespace n20
76 } // namespace n19
77 } // namespace n18
78 // CHECK-FIXES-NORMAL: }
79
80 namespace n21 {
81 void t();
82 }
83 } // namespace n15
84
85 namespace n22 {
86 namespace {
87 void t();
88 }
89 } // namespace n22
90
91 namespace n23 {
92 namespace {
93 namespace n24 {
94 namespace n25 {
95 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
96 // CHECK-FIXES-NORMAL: namespace n24::n25
97 void t();
98 } // namespace n25
99 } // namespace n24
100 // CHECK-FIXES-NORMAL: }
101 } // namespace
102 } // namespace n23
103
104 namespace n26::n27 {
105 namespace n28 {
106 namespace n29::n30 {
107 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
108 // CHECK-FIXES-NORMAL: namespace n26::n27::n28::n29::n30 {
t()109 void t() {}
110 } // namespace n29::n30
111 } // namespace n28
112 } // namespace n26::n27
113 // CHECK-FIXES-NORMAL: }
114
115 namespace n31 {
116 namespace n32 {}
117 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
118 } // namespace n31
119
120 namespace n33 {
121 namespace n34 {
122 namespace n35 {}
123 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
124 } // namespace n34
125 namespace n36 {
126 void t();
127 }
128 } // namespace n33
129
130 namespace n37::n38 {
131 void t();
132 }
133
134 #define IEXIST
135 namespace n39 {
136 namespace n40 {
137 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
138 // CHECK-FIXES-NORMAL: namespace n39::n40
139 #ifdef IEXIST
t()140 void t() {}
141 #endif
142 } // namespace n40
143 } // namespace n39
144 // CHECK-FIXES-NORMAL: } // namespace n39::n40
145
146 namespace n41 {
147 namespace n42 {
148 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
149 // CHECK-FIXES-NORMAL: namespace n41::n42
150 #ifdef IDONTEXIST
t()151 void t() {}
152 #endif
153 } // namespace n42
154 } // namespace n41
155 // CHECK-FIXES-NORMAL: } // namespace n41::n42
156
157
158 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
159 namespace n43 {
160 #define N43_INNER
161 namespace n44 {
foo()162 void foo() {}
163 } // namespace n44
164 #undef N43_INNER
165 } // namespace n43
166 // CHECK-FIXES-NORMAL: #define N43_INNER
167 // CHECK-FIXES-NORMAL: namespace n43::n44 {
168 // CHECK-FIXES-NORMAL: } // namespace n43::n44
169 // CHECK-FIXES-NORMAL: #undef N43_INNER
170
171 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
172 namespace n45{
173 #define N45_INNER
174 namespace n46
175 {
176 #pragma clang diagnostic push
177 namespace n47 {
foo()178 void foo() {}
179 } // namespace n47
180 #pragma clang diagnostic pop
181 } // namespace n46
182 #undef N45_INNER
183 } // namespace n45
184 // CHECK-FIXES-NORMAL: #define N45_INNER
185 // CHECK-FIXES-NORMAL: #pragma clang diagnostic push
186 // CHECK-FIXES-NORMAL: namespace n45::n46::n47 {
187 // CHECK-FIXES-NORMAL: } // namespace n45::n46::n47
188 // CHECK-FIXES-NORMAL: #pragma clang diagnostic pop
189 // CHECK-FIXES-NORMAL: #undef N45_INNER
190
191 inline namespace n48 {
192 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
193 namespace n49 {
194 namespace n50 {
195 // CHECK-FIXES-NORMAL: namespace n49::n50 {
foo()196 void foo() {}
197 }
198 }
199 }
200
201 // CHECK-MESSAGES-CPP20-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
202 namespace n51 {
203 inline namespace n52 {
204 namespace n53 {
205 // CHECK-FIXES-CPP20: namespace n51::inline n52::n53 {
foo()206 void foo() {}
207 }
208 }
209 }
210
211 #if __cplusplus >= 202002L
212 // CHECK-MESSAGES-CPP20-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
213 namespace n54 {
214 namespace n55::inline n56::n57 {
215 namespace n58 {
216 // CHECK-FIXES-CPP20: namespace n54::n55::inline n56::n57::n58 {
217 void foo() {}
218 }
219 }
220 }
221 #endif
222
223 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
224 namespace avoid_add_close_comment {
225 namespace inner {
226 void foo() {}
227 }
228 }
229 // CHECK-FIXES-NORMAL: namespace avoid_add_close_comment::inner {
230 // CHECK-FIXES-NORMAL-NOT: } // namespace avoid_add_close_comment::inner
231
232 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
233 namespace avoid_change_close_comment {
234 namespace inner {
235 void foo() {}
236 } // namespace inner and other comments
237 } // namespace avoid_change_close_comment and other comments
238 // CHECK-FIXES-NORMAL: namespace avoid_change_close_comment::inner {
239 // CHECK-FIXES-NORMAL-NOT: } // namespace avoid_add_close_comment::inner
240
241 namespace /*::*/ comment_colon_1 {
242 void foo() {}
243 } // namespace comment_colon_1
244 // CHECK-FIXES-NORMAL: namespace /*::*/ comment_colon_1 {
245
246 // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
247 namespace /*::*/ comment_colon_2 {
248 namespace comment_colon_2 {
249 void foo() {}
250 } // namespace comment_colon_2
251 } // namespace comment_colon_2
252
253 int main() {
254 n26::n27::n28::n29::n30::t();
255 #ifdef IEXIST
256 n39::n40::t();
257 #endif
258
259 #ifdef IDONTEXIST
260 n41::n42::t();
261 #endif
262
263 return 0;
264 }
265