492 lines · cpp
1// RUN: cp %s %t2// RUN: %clang_cc1 -x c++ -Wunused-lambda-capture -Wno-unused-value -std=c++1z -fixit %t3// RUN: grep -v CHECK %t | FileCheck %s4// RUN: %clang_cc1 -x c++ -Wunused-lambda-capture -Wno-unused-value -std=c++1z -fsyntax-only %s 2>&1 | FileCheck --match-full-lines --strict-whitespace --check-prefix POINTER %s5 6 7#define MACRO_CAPTURE(...) __VA_ARGS__8#define M_A a9#define M_B b10 11int main() {12 int a = 0, b = 0, c = 0, d = 0;13 auto F0 = [a, &b]() mutable {14 // CHECK: auto F0 = [a]()15 // POINTER:{{^.*}}| auto F0 = [a, &b]() mutable {16 // POINTER-NEXT:{{^.*}}| ~~~^17 18 a++;19 };20 21 auto F1 = [&a, &b]() {22 // CHECK: auto F1 = []() {23 // POINTER:{{^.*}}| auto F1 = [&a, &b]() {24 // POINTER-NEXT:{{^.*}}| ~^~25 // POINTER:{{^.*}}| auto F1 = [&a, &b]() {26 // POINTER-NEXT:{{^.*}}| ~~~^27 };28 29 auto F2 = [&a, b]() {30 // CHECK: auto F2 = []() {31 // POINTER:{{^.*}}| auto F2 = [&a, b]() {32 // POINTER-NEXT:{{^.*}}| ~^~33 // POINTER:{{^.*}}| auto F2 = [&a, b]() {34 // POINTER-NEXT:{{^.*}}| ~~^35 };36 37 auto F3 = [&a,38 &b]() {39 // CHECK: auto F3 = []() {40 // POINTER:{{^.*}}| auto F3 = [&a,41 // POINTER-NEXT:{{^.*}}| ~^~42 // POINTER-NEXT:{{^.*}}| &b]() {43 // POINTER:{{^.*}}| auto F3 = [&a,44 // POINTER-NEXT:{{^.*}}| ~45 // POINTER-NEXT:{{^.*}}| &b]() {46 // POINTER-NEXT:{{^.*}}| ~^47 48 };49 50 auto F4 = [&a51 , &b]() {52 // CHECK: auto F4 = []() {53 // POINTER:{{^.*}}| auto F4 = [&a54 // POINTER-NEXT:{{^.*}}| ~^55 // POINTER-NEXT:{{^.*}}| , &b]() {56 // POINTER-NEXT:{{^.*}}| ~57 // POINTER:{{^.*}}| auto F4 = [&a58 // POINTER-NEXT:{{^.*}}| {{$}}59 // POINTER-NEXT:{{^.*}}| , &b]() {60 // POINTER-NEXT:{{^.*}}| ~~~^61 };62 auto F5 = [&a ,&b]() {63 // CHECK: auto F5 = []() {64 // POINTER:{{^.*}}| auto F5 = [&a ,&b]() {65 // POINTER-NEXT:{{^.*}}| ~^~~66 // POINTER:{{^.*}}| auto F5 = [&a ,&b]() {67 // POINTER-NEXT:{{^.*}}| ~~^68 };69 70 auto F0a = [a, &b]() mutable {71 // CHECK: auto F0a = [a]() mutable {72 // POINTER:{{^.*}}| auto F0a = [a, &b]() mutable {73 // POINTER-NEXT:{{^.*}}| ~~~^74 a++;75 };76 77 auto F1a = [&a, &b]() {78 // CHECK: auto F1a = [&a]() {79 // POINTER:{{^.*}}| auto F1a = [&a, &b]() {80 // POINTER-NEXT:{{^.*}}| ~~~^81 a++;82 };83 84 auto F2a = [&a, b]() {85 // CHECK: auto F2a = [&a]() {86 // POINTER:{{^.*}}| auto F2a = [&a, b]() {87 // POINTER-NEXT:{{^.*}}| ~~^88 a++;89 };90 91 auto F3a = [&a,92 &b]() {93 // CHECK: auto F3a = [&a]() {94 // POINTER:{{^.*}}| auto F3a = [&a,95 // POINTER-NEXT:{{^.*}}| ~96 // POINTER-NEXT:{{^.*}}| &b]() {97 // POINTER-NEXT:{{^.*}}| ~^98 a++;99 };100 101 auto F4a = [&a102 , &b]() {103 // CHECK: auto F4a = [&a]() {104 // POINTER:{{^.*}}| auto F4a = [&a105 // POINTER-NEXT:{{^.*}}| {{$}}106 // POINTER-NEXT:{{^.*}}| , &b]() {107 // POINTER-NEXT:{{^.*}}| ~~~^108 a++;109 };110 111 auto F5a = [&a ,&b]() {112 // CHECK: auto F5a = [&a]() {113 // POINTER:{{^.*}}| auto F5a = [&a ,&b]() {114 // POINTER-NEXT:{{^.*}}| ~~^115 a++;116 };117 auto F0b = [a, &b]() mutable {118 // CHECK: auto F0b = [ &b]() mutable119 // POINTER:{{^.*}}| auto F0b = [a, &b]() mutable {120 // POINTER-NEXT:{{^.*}}| ^~121 122 b++;123 };124 125 auto F1b = [&a, &b]() {126 // CHECK: auto F1b = [ &b]() {127 // POINTER:{{^.*}}| auto F1b = [&a, &b]() {128 // POINTER-NEXT:{{^.*}}| ~^~129 b++;130 };131 132 auto F2b = [&a, b]() mutable {133 // CHECK: auto F2b = [ b]() mutable {134 // POINTER:{{^.*}}| auto F2b = [&a, b]() mutable {135 // POINTER-NEXT:{{^.*}}| ~^~136 b++;137 };138 139 auto F3b = [&a,140 &b]() {141 // CHECK: auto F3b = [ &b]() {142 // POINTER:{{^.*}}| auto F3b = [&a,143 // POINTER-NEXT:{{^.*}}| ~^~144 // POINTER-NEXT:{{^.*}}| &b]() {145 b++;146 };147 148 auto F4b = [&a149 , &b]() {150 // CHECK: auto F4b = [ &b]() {151 // POINTER:{{^.*}}| auto F4b = [&a152 // POINTER-NEXT:{{^.*}}| ~^153 // POINTER-NEXT:{{^.*}}| , &b]() {154 // POINTER-NEXT:{{^.*}}| ~155 156 b++;157 };158 auto F5b = [&a ,&b]() {159 // CHECK: auto F5b = [&b]() {160 // POINTER:{{^.*}}| auto F5b = [&a ,&b]() {161 // POINTER-NEXT:{{^.*}}| ~^~~162 b++;163 };164 165 auto F6 = [&a, &b, &c]() {166 // CHECK: auto F6 = [&a, &b]() {167 // POINTER:{{^.*}}| auto F6 = [&a, &b, &c]() {168 // POINTER-NEXT:{{^.*}}| ~~~^169 a++;170 b++;171 };172 auto F7 = [&a, &b, &c]() {173 // CHECK: auto F7 = [&a, &c]() {174 // POINTER:{{^.*}}| auto F7 = [&a, &b, &c]() {175 // POINTER-NEXT:{{^.*}}| ~~~^176 a++;177 c++;178 };179 auto F8 = [&a, &b, &c]() {180 // CHECK: auto F8 = [ &b, &c]() {181 // POINTER:{{^.*}}| auto F8 = [&a, &b, &c]() {182 // POINTER-NEXT:{{^.*}}| ~^~183 b++;184 c++;185 };186 auto F9 = [&a, &b , &c]() {187 // CHECK: auto F9 = [&a , &c]() {188 // POINTER:{{^.*}}| auto F9 = [&a, &b , &c]() {189 // POINTER-NEXT:{{^.*}}| ~~~^190 a++;191 c++;192 };193 auto F10 = [&a,194 &b, &c]() {195 // CHECK: auto F10 = [&a, &c]() {196 // POINTER:{{^.*}}| auto F10 = [&a,197 // POINTER-NEXT:{{^.*}}| ~198 // POINTER-NEXT:{{^.*}}| &b, &c]() {199 // POINTER-NEXT:{{^.*}}| ~^200 a++;201 c++;202 };203 auto F11 = [&a, &b ,204 &c]() {205 // CHECK: auto F11 = [&a ,206 // CHECK-NEXT: &c]() {207 // POINTER:{{^.*}}| auto F11 = [&a, &b ,208 // POINTER-NEXT:{{^.*}}| ~~~~^209 a++;210 c++;211 };212 auto F12 = [a = 0, b ,213 c]() mutable {214 // CHECK: auto F12 = [ b ,215 // CHECK-NEXT: c]() mutable {216 // POINTER:{{^.*}}| auto F12 = [a = 0, b ,217 // POINTER-NEXT:{{^.*}}| ^~~~~~218 b++;219 c++;220 };221 auto F13 = [a, b = 0 ,222 c]() mutable {223 // CHECK: auto F13 = [a ,224 // CHECK-NEXT: c]() mutable {225 // POINTER:{{^.*}}| auto F13 = [a, b = 0 ,226 // POINTER-NEXT:{{^.*}}| ~~~^~~~~227 a++;228 c++;229 };230 auto F14 = [a, b ,231 c232 = 0]() mutable {233 // CHECK: auto F14 = [a, b]() mutable {234 // POINTER:{{^.*}}| auto F14 = [a, b ,235 // POINTER-NEXT:{{^.*}}| ~236 // POINTER-NEXT:{{^.*}}| c237 // POINTER-NEXT:{{^.*}}| ^238 // POINTER-NEXT:{{^.*}}| = 0]() mutable {239 // POINTER-NEXT:{{^.*}}| ~~~240 a++;241 b++;242 };243 244 // We want to remove everything including the comment245 // as well as the comma following the capture of `a`246 auto F15 = [&a /* comment */, &b]() {247 // CHECK: auto F15 = [ &b]() {248 // POINTER:{{^.*}}| auto F15 = [&a /* comment */, &b]() {249 // POINTER-NEXT:{{^.*}}| ~^~~~~~~~~~~~~~~~250 b++;251 };252 253 // The comment preceding the first capture remains. This is more254 // by design of the fixit logic than anything else, but we should255 // consider the preceding comment might actually be a comment for256 // the entire capture set, so maybe we do want it to hang around257 auto F16 = [/* comment */ &a , &b]() {258 // CHECK: auto F16 = [/* comment */ &b]() {259 // POINTER:{{^.*}}| auto F16 = [/* comment */ &a , &b]() {260 // POINTER-NEXT:{{^.*}}| ~^~~261 b++;262 };263 264 auto F16b = [&a , /* comment */ &b]() {265 // CHECK: auto F16b = [ /* comment */ &b]() {266 // POINTER:{{^.*}}| auto F16b = [&a , /* comment */ &b]() {267 // POINTER-NEXT:{{^.*}}| ~^~~268 b++;269 };270 271 auto F17 = [&a /* comment */, &b]() {272 // CHECK: auto F17 = [&a]() {273 // POINTER:{{^.*}}| auto F17 = [&a /* comment */, &b]() {274 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~^275 276 a++;277 };278 279 auto F18 = [&a , /* comment */ &b]() {280 // CHECK: auto F18 = [&a]() {281 // POINTER:{{^.*}}| auto F18 = [&a , /* comment */ &b]() {282 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~~^283 284 a++;285 };286 287 auto F19 = [&a /* comment */, &b /* comment */]() {288 // CHECK: auto F19 = [&a /* comment */]() {289 // POINTER:{{^.*}}| auto F19 = [&a /* comment */, &b /* comment */]() {290 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~^291 292 a++;293 };294 295 auto F20 = [MACRO_CAPTURE(&a, &b)]() {296 // CHECK: auto F20 = [MACRO_CAPTURE(&a, &b)]() {297 // POINTER:{{^.*}}| auto F20 = [MACRO_CAPTURE(&a, &b)]() {298 // POINTER-NEXT:{{^.*}}| ~^299 // POINTER:{{^.*}}| auto F20 = [MACRO_CAPTURE(&a, &b)]() {300 // POINTER-NEXT:{{^.*}}| ~^301 };302 303 auto F21 = [MACRO_CAPTURE(&a), &b]() {304 // CHECK: auto F21 = []() {305 // POINTER:{{^.*}}| auto F21 = [MACRO_CAPTURE(&a), &b]() {306 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~^~~307 // POINTER:{{^.*}}| auto F21 = [MACRO_CAPTURE(&a), &b]() {308 // POINTER-NEXT:{{^.*}}| ~~~^309 };310 311 auto F22 = [MACRO_CAPTURE(&a,) &b]() {312 // CHECK: auto F22 = [MACRO_CAPTURE(&a,) &b]() {313 // POINTER:{{^.*}}| auto F22 = [MACRO_CAPTURE(&a,) &b]() {314 // POINTER-NEXT:{{^.*}}| ~^315 // POINTER:{{^.*}}| auto F22 = [MACRO_CAPTURE(&a,) &b]() {316 // POINTER-NEXT:{{^.*}}| ~^317 };318 auto F23 = [&a MACRO_CAPTURE(, &b)]() {319 // CHECK: auto F23 = [&a]() {320 // POINTER:{{^.*}}| auto F23 = [&a MACRO_CAPTURE(, &b)]() {321 // POINTER-NEXT:{{^.*}}| ~^322 // POINTER:{{^.*}}| auto F23 = [&a MACRO_CAPTURE(, &b)]() {323 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~~^~324 };325 auto F24 = [&a, MACRO_CAPTURE(&b)]() {326 // CHECK: auto F24 = []() {327 // POINTER:{{^.*}}| auto F24 = [&a, MACRO_CAPTURE(&b)]() {328 // POINTER-NEXT:{{^.*}}| ~^~329 // POINTER:{{^.*}}| auto F24 = [&a, MACRO_CAPTURE(&b)]() {330 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~~^~331 };332 333 auto F20a = [MACRO_CAPTURE(&a, &b)]() {334 // CHECK: auto F20a = [MACRO_CAPTURE(&a, &b)]() {335 // POINTER:{{^.*}}| auto F20a = [MACRO_CAPTURE(&a, &b)]() {336 // POINTER-NEXT:{{^.*}}| ~^337 a++;338 };339 340 auto F21a = [MACRO_CAPTURE(&a), &b]() {341 // CHECK: auto F21a = [MACRO_CAPTURE(&a)]() {342 // POINTER:{{^.*}}| auto F21a = [MACRO_CAPTURE(&a), &b]() {343 // POINTER-NEXT:{{^.*}}| ~~~^344 a++;345 };346 347 auto F22a = [MACRO_CAPTURE(&a,) &b]() {348 // CHECK: auto F22a = [MACRO_CAPTURE(&a,) &b]() {349 // POINTER:{{^.*}}| auto F22a = [MACRO_CAPTURE(&a,) &b]() {350 // POINTER-NEXT:{{^.*}}| ~^351 a++;352 };353 auto F23a = [&a MACRO_CAPTURE(, &b)]() {354 // CHECK: auto F23a = [&a]() {355 // POINTER:{{^.*}}| auto F23a = [&a MACRO_CAPTURE(, &b)]() {356 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~~^~357 a++;358 };359 auto F24a = [&a, MACRO_CAPTURE(&b)]() {360 // CHECK: auto F24a = [&a]() {361 // POINTER:{{^.*}}| auto F24a = [&a, MACRO_CAPTURE(&b)]() {362 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~~~^~363 a++;364 };365 auto F20b = [MACRO_CAPTURE(&a, &b)]() {366 // CHECK: auto F20b = [MACRO_CAPTURE(&a, &b)]() {367 // POINTER:{{^.*}}| auto F20b = [MACRO_CAPTURE(&a, &b)]() {368 // POINTER-NEXT:{{^.*}}| ~^369 b++;370 };371 372 auto F21b = [MACRO_CAPTURE(&a), &b]() {373 // CHECK: auto F21b = [ &b]() {374 // POINTER:{{^.*}}| auto F21b = [MACRO_CAPTURE(&a), &b]() {375 // POINTER-NEXT:{{^.*}}| ~~~~~~~~~~~~~~~^~~376 b++;377 };378 379 auto F22b = [MACRO_CAPTURE(&a,) &b]() {380 // CHECK: auto F22b = [MACRO_CAPTURE(&a,) &b]() {381 // POINTER:{{^.*}}| auto F22b = [MACRO_CAPTURE(&a,) &b]() {382 // POINTER-NEXT:{{^.*}}| ~^383 b++;384 };385 auto F23b = [&a MACRO_CAPTURE(, &b)]() {386 // CHECK: auto F23b = [&a MACRO_CAPTURE(, &b)]() {387 // POINTER:{{^.*}}| auto F23b = [&a MACRO_CAPTURE(, &b)]() {388 // POINTER-NEXT:{{^.*}}| ~^389 b++;390 };391 auto F24b = [&a, MACRO_CAPTURE(&b)]() {392 // CHECK: auto F24b = [ MACRO_CAPTURE(&b)]() {393 // POINTER:{{^.*}}| auto F24b = [&a, MACRO_CAPTURE(&b)]() {394 // POINTER-NEXT:{{^.*}}| ~^~395 b++;396 };397 398 auto F25ma = [&M_A, &b]() {399 // CHECK: auto F25ma = []() {400 // POINTER:{{^.*}}| auto F25ma = [&M_A, &b]() {401 // POINTER-NEXT:{{^.*}}| ~^~~~402 // POINTER:{{^.*}}| auto F25ma = [&M_A, &b]() {403 // POINTER-NEXT:{{^.*}}| ~~~^404 };405 auto F25mb = [&a, &M_B]() {406 // CHECK: auto F25mb = []() {407 // POINTER:{{^.*}}| auto F25mb = [&a, &M_B]() {408 // POINTER-NEXT:{{^.*}}| ~^~409 // POINTER:{{^.*}}| auto F25mb = [&a, &M_B]() {410 // POINTER-NEXT:{{^.*}}| ~~~^~~411 };412 413 auto F25mab = [&M_A, &b]() {414 // CHECK: auto F25mab = [ &b]() {415 // POINTER:{{^.*}}| auto F25mab = [&M_A, &b]() {416 // POINTER-NEXT:{{^.*}}| ~^~~~417 b++;418 };419 auto F25amb = [&a, &M_B]() {420 //CHECK: auto F25amb = []() {421 // POINTER:{{^.*}}| auto F25amb = [&a, &M_B]() {422 // POINTER-NEXT:{{^.*}}| ~^~423 // POINTER:{{^.*}}| auto F25amb = [&a, &M_B]() {424 // POINTER-NEXT:{{^.*}}| ~~~^~~425 };426 427 auto F26 = [&a, &b, &c, &d]() {428 // CHECK: auto F26 = [&a, &b]() {429 // POINTER:{{^.*}}| auto F26 = [&a, &b, &c, &d]() {430 // POINTER-NEXT:{{^.*}}| ~~~^431 // POINTER:{{^.*}}| auto F26 = [&a, &b, &c, &d]() {432 // POINTER-NEXT:{{^.*}}| ~~~^433 434 (void)a;435 (void)b;436 };437 438 auto F27 = [&a, &b, &c, &d]() {439 // CHECK: auto F27 = [&a, &c]() {440 // POINTER:{{^.*}}| auto F27 = [&a, &b, &c, &d]() {441 // POINTER-NEXT:{{^.*}}| ~~~^442 // POINTER:{{^.*}}| auto F27 = [&a, &b, &c, &d]() {443 // POINTER-NEXT:{{^.*}}| ~~~^444 445 (void)a;446 (void)c;447 };448 449 auto F28 = [&a, &b, &c, &d]() {450 // CHECK: auto F28 = [&a, &d]() {451 // POINTER:{{^.*}}| auto F28 = [&a, &b, &c, &d]() {452 // POINTER-NEXT:{{^.*}}| ~~~^453 // POINTER:{{^.*}}| auto F28 = [&a, &b, &c, &d]() {454 // POINTER-NEXT:{{^.*}}| ~~~^455 456 (void)a;457 (void)d;458 };459 460 auto F29 = [&a, &b, &c, &d]() {461 // CHECK: auto F29 = [ &b, &c]() {462 // POINTER:{{^.*}}| auto F29 = [&a, &b, &c, &d]() {463 // POINTER-NEXT:{{^.*}}| ~^~464 // POINTER:{{^.*}}| auto F29 = [&a, &b, &c, &d]() {465 // POINTER-NEXT:{{^.*}}| ~~~^466 467 (void)b;468 (void)c;469 };470 471 auto F30 = [&a, &b, &c, &d]() {472 // CHECK: auto F30 = [ &b, &d]() {473 // POINTER:{{^.*}}| auto F30 = [&a, &b, &c, &d]() {474 // POINTER-NEXT:{{^.*}}| ~^~475 // POINTER:{{^.*}}| auto F30 = [&a, &b, &c, &d]() {476 // POINTER-NEXT:{{^.*}}| ~~~^477 478 (void)b;479 (void)d;480 };481 482 auto F31 = [&a, &b, &c, &d]() {483 // CHECK: auto F31 = [ &c, &d]() {484 // POINTER:{{^.*}}| auto F31 = [&a, &b, &c, &d]() {485 // POINTER-NEXT:{{^.*}}| ~^~486 // POINTER:{{^.*}}| auto F31 = [&a, &b, &c, &d]() {487 // POINTER-NEXT:{{^.*}}| ~^~488 (void)c;489 (void)d;490 };491}492