xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/concat-nested-namespaces.cpp (revision 96ec447a6ae39edff92674e9849de2bf21bfd430)
189a1d03eSRichard // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h
2*32aaacc6SCongcong Cai // RUN: %check_clang_tidy -std=c++17 -check-suffix=NORMAL %s modernize-concat-nested-namespaces %t -- -header-filter=".*" -- -I %T
389a1d03eSRichard // RUN: FileCheck -input-file=%T/modernize-concat-nested-namespaces.h %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h -check-prefix=CHECK-FIXES
489a1d03eSRichard // Restore header file and re-run with c++20:
589a1d03eSRichard // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h
6*32aaacc6SCongcong Cai // RUN: %check_clang_tidy -std=c++20 -check-suffixes=NORMAL,CPP20 %s modernize-concat-nested-namespaces %t -- -header-filter=".*" -- -I %T
789a1d03eSRichard // RUN: FileCheck -input-file=%T/modernize-concat-nested-namespaces.h %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h -check-prefix=CHECK-FIXES
889a1d03eSRichard 
989a1d03eSRichard #include "modernize-concat-nested-namespaces.h"
10*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: modernize-concat-nested-namespaces.h:1:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
1189a1d03eSRichard 
1289a1d03eSRichard namespace n1 {}
1389a1d03eSRichard 
1489a1d03eSRichard namespace n2 {
1589a1d03eSRichard namespace n3 {
1689a1d03eSRichard void t();
1789a1d03eSRichard }
1889a1d03eSRichard namespace n4 {
1989a1d03eSRichard void t();
2089a1d03eSRichard }
2189a1d03eSRichard } // namespace n2
2289a1d03eSRichard 
23bdf7fd82SCongcong Cai namespace n6 {
24bdf7fd82SCongcong Cai namespace [[deprecated]] attr_ns {
25bdf7fd82SCongcong Cai void t();
26bdf7fd82SCongcong Cai } // namespace attr_ns
27bdf7fd82SCongcong Cai } // namespace n6
28bdf7fd82SCongcong Cai 
2989a1d03eSRichard namespace n7 {
3089a1d03eSRichard void t();
3189a1d03eSRichard 
3289a1d03eSRichard namespace n8 {
3389a1d03eSRichard void t();
3489a1d03eSRichard }
3589a1d03eSRichard } // namespace n7
3689a1d03eSRichard 
3789a1d03eSRichard namespace n9 {
3889a1d03eSRichard namespace n10 {
39*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
40*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n9::n10
4189a1d03eSRichard void t();
4289a1d03eSRichard } // namespace n10
4389a1d03eSRichard } // namespace n9
44*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: }
4589a1d03eSRichard 
4689a1d03eSRichard namespace n11 {
4789a1d03eSRichard namespace n12 {
48*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
49*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n11::n12
5089a1d03eSRichard namespace n13 {
5189a1d03eSRichard void t();
5289a1d03eSRichard }
5389a1d03eSRichard namespace n14 {
5489a1d03eSRichard void t();
5589a1d03eSRichard }
5689a1d03eSRichard } // namespace n12
5789a1d03eSRichard } // namespace n11
58*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: }
5989a1d03eSRichard 
6089a1d03eSRichard namespace n15 {
6189a1d03eSRichard namespace n16 {
6289a1d03eSRichard void t();
6389a1d03eSRichard }
6489a1d03eSRichard 
6589a1d03eSRichard inline namespace n17 {
6689a1d03eSRichard void t();
6789a1d03eSRichard }
6889a1d03eSRichard 
6989a1d03eSRichard namespace n18 {
7089a1d03eSRichard namespace n19 {
7189a1d03eSRichard namespace n20 {
72*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
73*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n18::n19::n20
7489a1d03eSRichard void t();
7589a1d03eSRichard } // namespace n20
7689a1d03eSRichard } // namespace n19
7789a1d03eSRichard } // namespace n18
78*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: }
7989a1d03eSRichard 
8089a1d03eSRichard namespace n21 {
8189a1d03eSRichard void t();
8289a1d03eSRichard }
8389a1d03eSRichard } // namespace n15
8489a1d03eSRichard 
8589a1d03eSRichard namespace n22 {
8689a1d03eSRichard namespace {
8789a1d03eSRichard void t();
8889a1d03eSRichard }
8989a1d03eSRichard } // namespace n22
9089a1d03eSRichard 
9189a1d03eSRichard namespace n23 {
9289a1d03eSRichard namespace {
9389a1d03eSRichard namespace n24 {
9489a1d03eSRichard namespace n25 {
95*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
96*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n24::n25
9789a1d03eSRichard void t();
9889a1d03eSRichard } // namespace n25
9989a1d03eSRichard } // namespace n24
100*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: }
10189a1d03eSRichard } // namespace
10289a1d03eSRichard } // namespace n23
10389a1d03eSRichard 
10489a1d03eSRichard namespace n26::n27 {
10589a1d03eSRichard namespace n28 {
10689a1d03eSRichard namespace n29::n30 {
107*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
108*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n26::n27::n28::n29::n30 {
t()10989a1d03eSRichard void t() {}
11089a1d03eSRichard } // namespace n29::n30
11189a1d03eSRichard } // namespace n28
11289a1d03eSRichard } // namespace n26::n27
113*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: }
11489a1d03eSRichard 
11589a1d03eSRichard namespace n31 {
11689a1d03eSRichard namespace n32 {}
117*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
11889a1d03eSRichard } // namespace n31
11989a1d03eSRichard 
12089a1d03eSRichard namespace n33 {
12189a1d03eSRichard namespace n34 {
12289a1d03eSRichard namespace n35 {}
123*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
12489a1d03eSRichard } // namespace n34
12589a1d03eSRichard namespace n36 {
12689a1d03eSRichard void t();
12789a1d03eSRichard }
12889a1d03eSRichard } // namespace n33
12989a1d03eSRichard 
13089a1d03eSRichard namespace n37::n38 {
13189a1d03eSRichard void t();
13289a1d03eSRichard }
13389a1d03eSRichard 
13489a1d03eSRichard #define IEXIST
13589a1d03eSRichard namespace n39 {
13689a1d03eSRichard namespace n40 {
137*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
138*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n39::n40
13989a1d03eSRichard #ifdef IEXIST
t()14089a1d03eSRichard void t() {}
14189a1d03eSRichard #endif
14289a1d03eSRichard } // namespace n40
14389a1d03eSRichard } // namespace n39
144*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: } // namespace n39::n40
14589a1d03eSRichard 
14689a1d03eSRichard namespace n41 {
14789a1d03eSRichard namespace n42 {
148*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
149*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n41::n42
15089a1d03eSRichard #ifdef IDONTEXIST
t()15189a1d03eSRichard void t() {}
15289a1d03eSRichard #endif
15389a1d03eSRichard } // namespace n42
15489a1d03eSRichard } // namespace n41
155*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: } // namespace n41::n42
15692910a51SCongcong Cai 
15792910a51SCongcong Cai 
158*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
15992910a51SCongcong Cai namespace n43 {
16092910a51SCongcong Cai #define N43_INNER
16192910a51SCongcong Cai namespace n44 {
foo()16292910a51SCongcong Cai void foo() {}
16392910a51SCongcong Cai } // namespace n44
16492910a51SCongcong Cai #undef N43_INNER
16592910a51SCongcong Cai } // namespace n43
166*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #define N43_INNER
167*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n43::n44 {
168*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: } // namespace n43::n44
169*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #undef N43_INNER
17092910a51SCongcong Cai 
171*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
17292910a51SCongcong Cai namespace n45{
17392910a51SCongcong Cai #define N45_INNER
17492910a51SCongcong Cai namespace n46
17592910a51SCongcong Cai {
17692910a51SCongcong Cai #pragma clang diagnostic push
17792910a51SCongcong Cai namespace n47 {
foo()17892910a51SCongcong Cai void foo() {}
17992910a51SCongcong Cai } // namespace n47
18092910a51SCongcong Cai #pragma clang diagnostic pop
18192910a51SCongcong Cai } // namespace n46
18292910a51SCongcong Cai #undef N45_INNER
18392910a51SCongcong Cai } // namespace n45
184*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #define N45_INNER
185*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #pragma clang diagnostic push
186*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n45::n46::n47 {
187*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: } // namespace n45::n46::n47
188*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #pragma clang diagnostic pop
189*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: #undef N45_INNER
19092910a51SCongcong Cai 
191*32aaacc6SCongcong Cai inline namespace n48 {
192*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
193*32aaacc6SCongcong Cai namespace n49 {
194*32aaacc6SCongcong Cai namespace n50 {
195*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace n49::n50 {
foo()196*32aaacc6SCongcong Cai void foo() {}
197*32aaacc6SCongcong Cai }
198*32aaacc6SCongcong Cai }
199*32aaacc6SCongcong Cai }
200*32aaacc6SCongcong Cai 
201*32aaacc6SCongcong Cai // CHECK-MESSAGES-CPP20-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
202*32aaacc6SCongcong Cai namespace n51 {
203*32aaacc6SCongcong Cai inline namespace n52 {
204*32aaacc6SCongcong Cai namespace n53 {
205*32aaacc6SCongcong Cai // CHECK-FIXES-CPP20: namespace n51::inline n52::n53 {
foo()206*32aaacc6SCongcong Cai void foo() {}
207*32aaacc6SCongcong Cai }
208*32aaacc6SCongcong Cai }
209*32aaacc6SCongcong Cai }
210*32aaacc6SCongcong Cai 
211*32aaacc6SCongcong Cai #if __cplusplus >= 202002L
212*32aaacc6SCongcong Cai // CHECK-MESSAGES-CPP20-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
213*32aaacc6SCongcong Cai namespace n54 {
214*32aaacc6SCongcong Cai namespace n55::inline n56::n57 {
215*32aaacc6SCongcong Cai namespace n58 {
216*32aaacc6SCongcong Cai // CHECK-FIXES-CPP20: namespace n54::n55::inline n56::n57::n58 {
217*32aaacc6SCongcong Cai void foo() {}
218*32aaacc6SCongcong Cai }
219*32aaacc6SCongcong Cai }
220*32aaacc6SCongcong Cai }
221*32aaacc6SCongcong Cai #endif
222*32aaacc6SCongcong Cai 
223*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
22492910a51SCongcong Cai namespace avoid_add_close_comment {
22592910a51SCongcong Cai namespace inner {
22692910a51SCongcong Cai void foo() {}
22792910a51SCongcong Cai }
22892910a51SCongcong Cai }
229*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace avoid_add_close_comment::inner {
230*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL-NOT: } // namespace avoid_add_close_comment::inner
23192910a51SCongcong Cai 
232*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
23392910a51SCongcong Cai namespace avoid_change_close_comment {
23492910a51SCongcong Cai namespace inner {
23592910a51SCongcong Cai void foo() {}
23692910a51SCongcong Cai } // namespace inner and other comments
23792910a51SCongcong Cai } // namespace avoid_change_close_comment and other comments
238*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace avoid_change_close_comment::inner {
239*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL-NOT: } // namespace avoid_add_close_comment::inner
24089a1d03eSRichard 
24172777dc0SCongcong Cai namespace /*::*/ comment_colon_1 {
24272777dc0SCongcong Cai void foo() {}
24372777dc0SCongcong Cai } // namespace comment_colon_1
244*32aaacc6SCongcong Cai // CHECK-FIXES-NORMAL: namespace /*::*/ comment_colon_1 {
24572777dc0SCongcong Cai 
246*32aaacc6SCongcong Cai // CHECK-MESSAGES-NORMAL-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
24772777dc0SCongcong Cai namespace /*::*/ comment_colon_2 {
24872777dc0SCongcong Cai namespace comment_colon_2 {
24972777dc0SCongcong Cai void foo() {}
25072777dc0SCongcong Cai } // namespace comment_colon_2
25172777dc0SCongcong Cai } // namespace comment_colon_2
25272777dc0SCongcong Cai 
25389a1d03eSRichard int main() {
25489a1d03eSRichard   n26::n27::n28::n29::n30::t();
25589a1d03eSRichard #ifdef IEXIST
25689a1d03eSRichard   n39::n40::t();
25789a1d03eSRichard #endif
25889a1d03eSRichard 
25989a1d03eSRichard #ifdef IDONTEXIST
26089a1d03eSRichard   n41::n42::t();
26189a1d03eSRichard #endif
26289a1d03eSRichard 
26389a1d03eSRichard   return 0;
26489a1d03eSRichard }
265