| 1 | // RUN: cp %S/Inputs/concat-nested-namespaces/modernize-concat-nested-namespaces.h %T/modernize-concat-nested-namespaces.h |
| 2 | // RUN: %check_clang_tidy --match-partial-fixes -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 --match-partial-fixes -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 { |
| 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 |
| 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 |
| 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 { |
| 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 { |
| 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 { |
| 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 { |
| 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 () {} |
| 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 () {} |
| 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 () {} |
| 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 () {} |
| 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 | |