xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/concat-nested-namespaces.cpp (revision bdf7fd8297bcbcddc9c184a40c954c1f1b0b8340)
189a1d03eSRichard // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h
289a1d03eSRichard // RUN: %check_clang_tidy -std=c++17 %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
689a1d03eSRichard // RUN: %check_clang_tidy -std=c++20 %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"
1089a1d03eSRichard // CHECK-MESSAGES-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 
2389a1d03eSRichard namespace n5 {
24*bdf7fd82SCongcong Cai inline namespace inline_ns {
2589a1d03eSRichard void t();
26*bdf7fd82SCongcong Cai } // namespace inline_ns
2789a1d03eSRichard } // namespace n5
2889a1d03eSRichard 
29*bdf7fd82SCongcong Cai namespace n6 {
30*bdf7fd82SCongcong Cai namespace [[deprecated]] attr_ns {
31*bdf7fd82SCongcong Cai void t();
32*bdf7fd82SCongcong Cai } // namespace attr_ns
33*bdf7fd82SCongcong Cai } // namespace n6
34*bdf7fd82SCongcong Cai 
3589a1d03eSRichard namespace n7 {
3689a1d03eSRichard void t();
3789a1d03eSRichard 
3889a1d03eSRichard namespace n8 {
3989a1d03eSRichard void t();
4089a1d03eSRichard }
4189a1d03eSRichard } // namespace n7
4289a1d03eSRichard 
4389a1d03eSRichard namespace n9 {
4489a1d03eSRichard namespace n10 {
4589a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
4689a1d03eSRichard // CHECK-FIXES: namespace n9::n10
4789a1d03eSRichard void t();
4889a1d03eSRichard } // namespace n10
4989a1d03eSRichard } // namespace n9
5089a1d03eSRichard // CHECK-FIXES: }
5189a1d03eSRichard 
5289a1d03eSRichard namespace n11 {
5389a1d03eSRichard namespace n12 {
5489a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
5589a1d03eSRichard // CHECK-FIXES: namespace n11::n12
5689a1d03eSRichard namespace n13 {
5789a1d03eSRichard void t();
5889a1d03eSRichard }
5989a1d03eSRichard namespace n14 {
6089a1d03eSRichard void t();
6189a1d03eSRichard }
6289a1d03eSRichard } // namespace n12
6389a1d03eSRichard } // namespace n11
6489a1d03eSRichard // CHECK-FIXES: }
6589a1d03eSRichard 
6689a1d03eSRichard namespace n15 {
6789a1d03eSRichard namespace n16 {
6889a1d03eSRichard void t();
6989a1d03eSRichard }
7089a1d03eSRichard 
7189a1d03eSRichard inline namespace n17 {
7289a1d03eSRichard void t();
7389a1d03eSRichard }
7489a1d03eSRichard 
7589a1d03eSRichard namespace n18 {
7689a1d03eSRichard namespace n19 {
7789a1d03eSRichard namespace n20 {
7889a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
7989a1d03eSRichard // CHECK-FIXES: namespace n18::n19::n20
8089a1d03eSRichard void t();
8189a1d03eSRichard } // namespace n20
8289a1d03eSRichard } // namespace n19
8389a1d03eSRichard } // namespace n18
8489a1d03eSRichard // CHECK-FIXES: }
8589a1d03eSRichard 
8689a1d03eSRichard namespace n21 {
8789a1d03eSRichard void t();
8889a1d03eSRichard }
8989a1d03eSRichard } // namespace n15
9089a1d03eSRichard 
9189a1d03eSRichard namespace n22 {
9289a1d03eSRichard namespace {
9389a1d03eSRichard void t();
9489a1d03eSRichard }
9589a1d03eSRichard } // namespace n22
9689a1d03eSRichard 
9789a1d03eSRichard namespace n23 {
9889a1d03eSRichard namespace {
9989a1d03eSRichard namespace n24 {
10089a1d03eSRichard namespace n25 {
10189a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
10289a1d03eSRichard // CHECK-FIXES: namespace n24::n25
10389a1d03eSRichard void t();
10489a1d03eSRichard } // namespace n25
10589a1d03eSRichard } // namespace n24
10689a1d03eSRichard // CHECK-FIXES: }
10789a1d03eSRichard } // namespace
10889a1d03eSRichard } // namespace n23
10989a1d03eSRichard 
11089a1d03eSRichard namespace n26::n27 {
11189a1d03eSRichard namespace n28 {
11289a1d03eSRichard namespace n29::n30 {
11389a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-3]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
1140f9b71d1SCongcong Cai // CHECK-FIXES: namespace n26::n27::n28::n29::n30 {
11589a1d03eSRichard void t() {}
11689a1d03eSRichard } // namespace n29::n30
11789a1d03eSRichard } // namespace n28
11889a1d03eSRichard } // namespace n26::n27
11989a1d03eSRichard // CHECK-FIXES: }
12089a1d03eSRichard 
12189a1d03eSRichard namespace n31 {
12289a1d03eSRichard namespace n32 {}
12389a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
12489a1d03eSRichard } // namespace n31
12589a1d03eSRichard // CHECK-FIXES-EMPTY
12689a1d03eSRichard 
12789a1d03eSRichard namespace n33 {
12889a1d03eSRichard namespace n34 {
12989a1d03eSRichard namespace n35 {}
13089a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
13189a1d03eSRichard } // namespace n34
13289a1d03eSRichard // CHECK-FIXES-EMPTY
13389a1d03eSRichard namespace n36 {
13489a1d03eSRichard void t();
13589a1d03eSRichard }
13689a1d03eSRichard } // namespace n33
13789a1d03eSRichard 
13889a1d03eSRichard namespace n37::n38 {
13989a1d03eSRichard void t();
14089a1d03eSRichard }
14189a1d03eSRichard 
14289a1d03eSRichard #define IEXIST
14389a1d03eSRichard namespace n39 {
14489a1d03eSRichard namespace n40 {
14589a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
14689a1d03eSRichard // CHECK-FIXES: namespace n39::n40
14789a1d03eSRichard #ifdef IEXIST
14889a1d03eSRichard void t() {}
14989a1d03eSRichard #endif
15089a1d03eSRichard } // namespace n40
15189a1d03eSRichard } // namespace n39
15292910a51SCongcong Cai // CHECK-FIXES: } // namespace n39::n40
15389a1d03eSRichard 
15489a1d03eSRichard namespace n41 {
15589a1d03eSRichard namespace n42 {
15689a1d03eSRichard // CHECK-MESSAGES-DAG: :[[@LINE-2]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
15789a1d03eSRichard // CHECK-FIXES: namespace n41::n42
15889a1d03eSRichard #ifdef IDONTEXIST
15989a1d03eSRichard void t() {}
16089a1d03eSRichard #endif
16189a1d03eSRichard } // namespace n42
16289a1d03eSRichard } // namespace n41
16392910a51SCongcong Cai // CHECK-FIXES: } // namespace n41::n42
16492910a51SCongcong Cai 
16592910a51SCongcong Cai 
16692910a51SCongcong Cai // CHECK-MESSAGES-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
16792910a51SCongcong Cai namespace n43 {
16892910a51SCongcong Cai #define N43_INNER
16992910a51SCongcong Cai namespace n44 {
17092910a51SCongcong Cai void foo() {}
17192910a51SCongcong Cai } // namespace n44
17292910a51SCongcong Cai #undef N43_INNER
17392910a51SCongcong Cai } // namespace n43
17492910a51SCongcong Cai // CHECK-FIXES: #define N43_INNER
17592910a51SCongcong Cai // CHECK-FIXES: namespace n43::n44 {
17692910a51SCongcong Cai // CHECK-FIXES: } // namespace n43::n44
17792910a51SCongcong Cai // CHECK-FIXES: #undef N43_INNER
17892910a51SCongcong Cai 
17992910a51SCongcong Cai // CHECK-MESSAGES-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
18092910a51SCongcong Cai namespace n45{
18192910a51SCongcong Cai #define N45_INNER
18292910a51SCongcong Cai namespace n46
18392910a51SCongcong Cai {
18492910a51SCongcong Cai #pragma clang diagnostic push
18592910a51SCongcong Cai namespace n47 {
18692910a51SCongcong Cai void foo() {}
18792910a51SCongcong Cai } // namespace n47
18892910a51SCongcong Cai #pragma clang diagnostic pop
18992910a51SCongcong Cai } //namespace n46
19092910a51SCongcong Cai #undef N45_INNER
19192910a51SCongcong Cai } //namespace n45
19292910a51SCongcong Cai // CHECK-FIXES: #define N45_INNER
19392910a51SCongcong Cai // CHECK-FIXES: #pragma clang diagnostic push
19492910a51SCongcong Cai // CHECK-FIXES: namespace n45::n46::n47 {
19592910a51SCongcong Cai // CHECK-FIXES: } // namespace n45::n46::n47
19692910a51SCongcong Cai // CHECK-FIXES: #pragma clang diagnostic pop
19792910a51SCongcong Cai // CHECK-FIXES: #undef N45_INNER
19892910a51SCongcong Cai 
19992910a51SCongcong Cai // CHECK-MESSAGES-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
20092910a51SCongcong Cai namespace avoid_add_close_comment {
20192910a51SCongcong Cai namespace inner {
20292910a51SCongcong Cai void foo() {}
20392910a51SCongcong Cai }
20492910a51SCongcong Cai }
20592910a51SCongcong Cai // CHECK-FIXES: namespace avoid_add_close_comment::inner {
20692910a51SCongcong Cai // CHECK-FIXES-NOT: } // namespace avoid_add_close_comment::inner
20792910a51SCongcong Cai 
20892910a51SCongcong Cai // CHECK-MESSAGES-DAG: :[[@LINE+1]]:1: warning: nested namespaces can be concatenated [modernize-concat-nested-namespaces]
20992910a51SCongcong Cai namespace avoid_change_close_comment {
21092910a51SCongcong Cai namespace inner {
21192910a51SCongcong Cai void foo() {}
21292910a51SCongcong Cai } // namespace inner and other comments
21392910a51SCongcong Cai } // namespace avoid_change_close_comment and other comments
21492910a51SCongcong Cai // CHECK-FIXES: namespace avoid_change_close_comment::inner {
21592910a51SCongcong Cai // CHECK-FIXES-NOT: } // namespace avoid_add_close_comment::inner
21689a1d03eSRichard 
21789a1d03eSRichard int main() {
21889a1d03eSRichard   n26::n27::n28::n29::n30::t();
21989a1d03eSRichard #ifdef IEXIST
22089a1d03eSRichard   n39::n40::t();
22189a1d03eSRichard #endif
22289a1d03eSRichard 
22389a1d03eSRichard #ifdef IDONTEXIST
22489a1d03eSRichard   n41::n42::t();
22589a1d03eSRichard #endif
22689a1d03eSRichard 
22789a1d03eSRichard   return 0;
22889a1d03eSRichard }
229