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()10989a1d03eSRichardvoid 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()14089a1d03eSRichardvoid 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()15189a1d03eSRichardvoid 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 Caivoid 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 Caivoid 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 Caivoid 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 Caivoid 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