1 // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s 2 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING 3 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS 4 // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING 5 6 constexpr int ODRUSE_SZ = sizeof(char); 7 8 template<class T, int N> 9 void f(T, const int (&)[N]) { } 10 11 template<class T> 12 void f(const T&, const int (&)[ODRUSE_SZ]) { } 13 14 #define DEFINE_SELECTOR(x) \ 15 int selector_ ## x[sizeof(x) == ODRUSE_SZ ? ODRUSE_SZ : ODRUSE_SZ + 5] 16 17 #define F_CALL(x, a) f(x, selector_ ## a) 18 19 // This is a risky assumption, because if an empty class gets captured by value 20 // the lambda's size will still be '1' 21 #define ASSERT_NO_CAPTURES(L) static_assert(sizeof(L) == 1, "size of closure with no captures must be 1") 22 #define ASSERT_CLOSURE_SIZE_EXACT(L, N) static_assert(sizeof(L) == (N), "size of closure must be " #N) 23 #define ASSERT_CLOSURE_SIZE(L, N) static_assert(sizeof(L) >= (N), "size of closure must be >=" #N) 24 25 26 namespace sample { 27 struct X { 28 int i; 29 X(int i) : i(i) { } 30 }; 31 } 32 33 namespace test_transformations_in_templates { 34 template<class T> void foo(T t) { 35 auto L = [](auto a) { return a; }; 36 } 37 template<class T> void foo2(T t) { 38 auto L = [](auto a) -> void { 39 auto M = [](char b) -> void { 40 auto N = [](auto c) -> void { 41 int selector[sizeof(c) == 1 ? 42 (sizeof(b) == 1 ? 1 : 2) 43 : 2 44 ]{}; 45 }; 46 N('a'); 47 }; 48 }; 49 L(3.14); 50 } 51 52 void doit() { 53 foo(3); 54 foo('a'); 55 foo2('A'); 56 } 57 } 58 59 namespace test_return_type_deduction { 60 61 void doit() { 62 63 auto L = [](auto a, auto b) { 64 if ( a > b ) return a; 65 return b; 66 }; 67 L(2, 4); 68 { 69 auto L2 = [](auto a, int i) { 70 return a + i; 71 }; 72 L2(3.14, 2); 73 } 74 { 75 int a; //expected-note{{declared here}} 76 auto B = []() { return ^{ return a; }; }; //expected-error{{cannot be implicitly capture}}\ 77 //expected-note{{begins here}} 78 //[](){ return ({int b = 5; return 'c'; 'x';}); }; 79 80 //auto X = ^{ return a; }; 81 82 //auto Y = []() -> auto { return 3; return 'c'; }; 83 84 } 85 } 86 } 87 88 89 namespace test_no_capture{ 90 void doit() { 91 const int x = 10; //expected-note{{declared here}} 92 { 93 // should not capture 'x' - variable undergoes lvalue-to-rvalue 94 auto L = [=](auto a) { 95 int y = x; 96 return a + y; 97 }; 98 ASSERT_NO_CAPTURES(L); 99 } 100 { 101 // should not capture 'x' - even though certain instantiations require 102 auto L = [](auto a) { //expected-note{{begins here}} 103 DEFINE_SELECTOR(a); 104 F_CALL(x, a); //expected-error{{'x' cannot be implicitly captured}} 105 }; 106 ASSERT_NO_CAPTURES(L); 107 L('s'); //expected-note{{in instantiation of}} 108 } 109 { 110 // Does not capture because no default capture in inner most lambda 'b' 111 auto L = [=](auto a) { 112 return [=](int p) { 113 return [](auto b) { 114 DEFINE_SELECTOR(a); 115 F_CALL(x, a); 116 return 0; 117 }; 118 }; 119 }; 120 ASSERT_NO_CAPTURES(L); 121 } 122 } // doit 123 } // namespace 124 125 namespace test_capture_of_potentially_evaluated_expression { 126 void doit() { 127 const int x = 5; 128 { 129 auto L = [=](auto a) { 130 DEFINE_SELECTOR(a); 131 F_CALL(x, a); 132 }; 133 static_assert(sizeof(L) == 4, "Must be captured"); 134 } 135 { 136 int j = 0; //expected-note{{declared}} 137 auto L = [](auto a) { //expected-note{{begins here}} 138 return j + 1; //expected-error{{cannot be implicitly captured}} 139 }; 140 } 141 { 142 const int x = 10; 143 auto L = [](auto a) { 144 //const int y = 20; 145 return [](int p) { 146 return [](auto b) { 147 DEFINE_SELECTOR(a); 148 F_CALL(x, a); 149 return 0; 150 }; 151 }; 152 }; 153 auto M = L(3); 154 auto N = M(5); 155 156 } 157 158 { // if the nested capture does not implicitly or explicitly allow any captures 159 // nothing should capture - and instantiations will create errors if needed. 160 const int x = 0; 161 auto L = [=](auto a) { // <-- #A 162 const int y = 0; 163 return [](auto b) { // <-- #B 164 int c[sizeof(b)]; 165 f(x, c); 166 f(y, c); 167 int i = x; 168 }; 169 }; 170 ASSERT_NO_CAPTURES(L); 171 auto M_int = L(2); 172 ASSERT_NO_CAPTURES(M_int); 173 } 174 { // Permutations of this example must be thoroughly tested! 175 const int x = 0; 176 sample::X cx{5}; 177 auto L = [=](auto a) { 178 const int z = 3; 179 return [&,a](auto b) { 180 const int y = 5; 181 return [=](auto c) { 182 int d[sizeof(a) == sizeof(c) || sizeof(c) == sizeof(b) ? 2 : 1]; 183 f(x, d); 184 f(y, d); 185 f(z, d); 186 decltype(a) A = a; 187 decltype(b) B = b; 188 const int &i = cx.i; 189 }; 190 }; 191 }; 192 auto M = L(3)(3.5); 193 M(3.14); 194 } 195 } 196 namespace Test_no_capture_of_clearly_no_odr_use { 197 auto foo() { 198 const int x = 10; 199 auto L = [=](auto a) { 200 return [=](auto b) { 201 return [=](auto c) { 202 int A = x; 203 return A; 204 }; 205 }; 206 }; 207 auto M = L(1); 208 auto N = M(2.14); 209 ASSERT_NO_CAPTURES(L); 210 ASSERT_NO_CAPTURES(N); 211 212 return 0; 213 } 214 } 215 216 namespace Test_capture_of_odr_use_var { 217 auto foo() { 218 const int x = 10; 219 auto L = [=](auto a) { 220 return [=](auto b) { 221 return [=](auto c) { 222 int A = x; 223 const int &i = x; 224 decltype(a) A2 = a; 225 return A; 226 }; 227 }; 228 }; 229 auto M_int = L(1); 230 auto N_int_int = M_int(2); 231 ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x)); 232 // M_int captures both a & x 233 ASSERT_CLOSURE_SIZE_EXACT(M_int, sizeof(x) + sizeof(int)); 234 // N_int_int captures both a & x 235 ASSERT_CLOSURE_SIZE_EXACT(N_int_int, sizeof(x) + sizeof(int)); 236 auto M_double = L(3.14); 237 ASSERT_CLOSURE_SIZE(M_double, sizeof(x) + sizeof(double)); 238 239 return 0; 240 } 241 auto run = foo(); 242 } 243 244 } 245 namespace more_nested_captures_1 { 246 template<class T> struct Y { 247 static void f(int, double, ...) { } 248 template<class R> 249 static void f(const int&, R, ...) { } 250 template<class R> 251 void foo(R t) { 252 const int x = 10; //expected-note{{declared here}} 253 auto L = [](auto a) { 254 return [=](auto b) { 255 return [=](auto c) { 256 f(x, c, b, a); //expected-error{{reference to local variable 'x'}} 257 return 0; 258 }; 259 }; 260 }; 261 auto M = L(t); 262 auto N = M('b'); 263 N(3.14); 264 N(5); //expected-note{{in instantiation of}} 265 } 266 }; 267 Y<int> yi; 268 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}} 269 } 270 271 272 namespace more_nested_captures_1_1 { 273 template<class T> struct Y { 274 static void f(int, double, ...) { } 275 template<class R> 276 static void f(const int&, R, ...) { } 277 template<class R> 278 void foo(R t) { 279 const int x = 10; //expected-note{{declared here}} 280 auto L = [](auto a) { 281 return [=](char b) { 282 return [=](auto c) { 283 f(x, c, b, a); //expected-error{{reference to local variable 'x'}} 284 return 0; 285 }; 286 }; 287 }; 288 auto M = L(t); 289 auto N = M('b'); 290 N(3.14); 291 N(5); //expected-note{{in instantiation of}} 292 } 293 }; 294 Y<int> yi; 295 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}} 296 } 297 namespace more_nested_captures_1_2 { 298 template<class T> struct Y { 299 static void f(int, double, ...) { } 300 template<class R> 301 static void f(const int&, R, ...) { } 302 template<class R> 303 void foo(R t) { 304 const int x = 10; 305 auto L = [=](auto a) { 306 return [=](char b) { 307 return [=](auto c) { 308 f(x, c, b, a); 309 return 0; 310 }; 311 }; 312 }; 313 auto M = L(t); 314 auto N = M('b'); 315 N(3.14); 316 N(5); 317 } 318 }; 319 Y<int> yi; 320 int run = (yi.foo(3.14), 0); 321 } 322 323 namespace more_nested_captures_1_3 { 324 template<class T> struct Y { 325 static void f(int, double, ...) { } 326 template<class R> 327 static void f(const int&, R, ...) { } 328 template<class R> 329 void foo(R t) { 330 const int x = 10; //expected-note{{declared here}} 331 auto L = [=](auto a) { 332 return [](auto b) { 333 const int y = 0; 334 return [=](auto c) { 335 f(x, c, b); //expected-error{{reference to local variable 'x'}} 336 f(y, b, c); 337 return 0; 338 }; 339 }; 340 }; 341 auto M = L(t); 342 auto N = M('b'); 343 N(3.14); 344 N(5); //expected-note{{in instantiation of}} 345 } 346 }; 347 Y<int> yi; 348 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}} 349 } 350 351 352 namespace more_nested_captures_1_4 { 353 template<class T> struct Y { 354 static void f(int, double, ...) { } 355 template<class R> 356 static void f(const int&, R, ...) { } 357 template<class R> 358 void foo(R t) { 359 const int x = 10; //expected-note{{declared here}} 360 auto L = [=](auto a) { 361 T t2{t}; 362 return [](auto b) { 363 const int y = 0; //expected-note{{declared here}} 364 return [](auto c) { //expected-note 2{{lambda expression begins here}} 365 f(x, c); //expected-error{{variable 'x'}} 366 f(y, c); //expected-error{{variable 'y'}} 367 return 0; 368 }; 369 }; 370 }; 371 auto M = L(t); 372 auto N_char = M('b'); 373 N_char(3.14); 374 auto N_double = M(3.14); 375 N_double(3.14); 376 N_char(3); //expected-note{{in instantiation of}} 377 } 378 }; 379 Y<int> yi; 380 int run = (yi.foo('a'), 0); //expected-note{{in instantiation of}} 381 } 382 383 384 namespace more_nested_captures_2 { 385 template<class T> struct Y { 386 static void f(int, double) { } 387 template<class R> 388 static void f(const int&, R) { } 389 template<class R> 390 void foo(R t) { 391 const int x = 10; 392 auto L = [=](auto a) { 393 return [=](auto b) { 394 return [=](auto c) { 395 f(x, c); 396 return 0; 397 }; 398 }; 399 }; 400 auto M = L(t); 401 auto N = M('b'); 402 N(3); 403 N(3.14); 404 } 405 }; 406 Y<int> yi; 407 int run = (yi.foo(3.14), 0); 408 409 } 410 411 namespace more_nested_captures_3 { 412 template<class T> struct Y { 413 static void f(int, double) { } 414 template<class R> 415 static void f(const int&, R) { } 416 template<class R> 417 void foo(R t) { 418 const int x = 10; //expected-note{{declared here}} 419 auto L = [](auto a) { 420 return [=](auto b) { 421 return [=](auto c) { 422 f(x, c); //expected-error{{reference to local variable 'x'}} 423 return 0; 424 }; 425 }; 426 }; 427 auto M = L(t); 428 auto N = M('b'); 429 N(3); //expected-note{{in instantiation of}} 430 N(3.14); 431 } 432 }; 433 Y<int> yi; 434 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}} 435 436 } 437 438 namespace more_nested_captures_4 { 439 template<class T> struct Y { 440 static void f(int, double) { } 441 template<class R> 442 static void f(const int&, R) { } 443 template<class R> 444 void foo(R t) { 445 const int x = 10; //expected-note{{'x' declared here}} 446 auto L = [](auto a) { 447 return [=](char b) { 448 return [=](auto c) { 449 f(x, c); //expected-error{{reference to local variable 'x'}} 450 return 0; 451 }; 452 }; 453 }; 454 auto M = L(t); 455 auto N = M('b'); 456 N(3); //expected-note{{in instantiation of}} 457 N(3.14); 458 } 459 }; 460 Y<int> yi; 461 int run = (yi.foo(3.14), 0); //expected-note{{in instantiation of}} 462 463 } 464 465 namespace more_nested_captures_5 { 466 template<class T> struct Y { 467 static void f(int, double) { } 468 template<class R> 469 static void f(const int&, R) { } 470 template<class R> 471 void foo(R t) { 472 const int x = 10; 473 auto L = [=](auto a) { 474 return [=](char b) { 475 return [=](auto c) { 476 f(x, c); 477 return 0; 478 }; 479 }; 480 }; 481 auto M = L(t); 482 auto N = M('b'); 483 N(3); 484 N(3.14); 485 } 486 }; 487 Y<int> yi; 488 int run = (yi.foo(3.14), 0); 489 490 } 491 492 namespace lambdas_in_NSDMIs { 493 template<class T> 494 struct L { 495 T t{}; 496 T t2 = ([](auto a) { return [](auto b) { return b; };})(t)(t); 497 T t3 = ([](auto a) { return a; })(t); 498 }; 499 L<int> l; 500 int run = l.t2; 501 } 502 namespace test_nested_decltypes_in_trailing_return_types { 503 int foo() { 504 auto L = [](auto a) { 505 return [](auto b, decltype(a) b2) -> decltype(a) { 506 return decltype(a){}; 507 }; 508 }; 509 auto M = L(3.14); 510 M('a', 6.26); 511 return 0; 512 } 513 } 514 515 namespace more_this_capture_1 { 516 struct X { 517 void f(int) { } 518 static void f(double) { } 519 void foo() { 520 { 521 auto L = [=](auto a) { 522 f(a); 523 }; 524 L(3); 525 L(3.13); 526 } 527 { 528 auto L = [](auto a) { 529 f(a); //expected-error{{this}} 530 }; 531 L(3.13); 532 L(2); //expected-note{{in instantiation}} 533 } 534 } 535 536 int g() { 537 auto L = [=](auto a) { 538 return [](int i) { 539 return [=](auto b) { 540 f(b); 541 int x = i; 542 }; 543 }; 544 }; 545 auto M = L(0.0); 546 auto N = M(3); 547 N(5.32); // OK 548 return 0; 549 } 550 }; 551 int run = X{}.g(); 552 } 553 namespace more_this_capture_1_1 { 554 struct X { 555 void f(int) { } 556 static void f(double) { } 557 558 int g() { 559 auto L = [=](auto a) { 560 return [](int i) { 561 return [=](auto b) { 562 f(decltype(a){}); //expected-error{{this}} 563 int x = i; 564 }; 565 }; 566 }; 567 auto M = L(0.0); 568 auto N = M(3); 569 N(5.32); // OK 570 L(3); // expected-note{{instantiation}} 571 return 0; 572 } 573 }; 574 int run = X{}.g(); 575 } 576 577 namespace more_this_capture_1_1_1 { 578 struct X { 579 void f(int) { } 580 static void f(double) { } 581 582 int g() { 583 auto L = [=](auto a) { 584 return [](auto b) { 585 return [=](int i) { 586 f(b); 587 f(decltype(a){}); //expected-error{{this}} 588 }; 589 }; 590 }; 591 auto M = L(0.0); // OK 592 auto N = M(3.3); //OK 593 auto M_int = L(0); //expected-note{{instantiation}} 594 return 0; 595 } 596 }; 597 int run = X{}.g(); 598 } 599 600 601 namespace more_this_capture_1_1_1_1 { 602 struct X { 603 void f(int) { } 604 static void f(double) { } 605 606 int g() { 607 auto L = [=](auto a) { 608 return [](auto b) { 609 return [=](int i) { 610 f(b); //expected-error{{this}} 611 f(decltype(a){}); 612 }; 613 }; 614 }; 615 auto M_double = L(0.0); // OK 616 auto N = M_double(3); //expected-note{{instantiation}} 617 618 return 0; 619 } 620 }; 621 int run = X{}.g(); 622 } 623 624 namespace more_this_capture_2 { 625 struct X { 626 void f(int) { } 627 static void f(double) { } 628 629 int g() { 630 auto L = [=](auto a) { 631 return [](int i) { 632 return [=](auto b) { 633 f(b); //expected-error{{'this' cannot}} 634 int x = i; 635 }; 636 }; 637 }; 638 auto M = L(0.0); 639 auto N = M(3); 640 N(5); // NOT OK expected-note{{in instantiation of}} 641 return 0; 642 } 643 }; 644 int run = X{}.g(); 645 } 646 namespace diagnose_errors_early_in_generic_lambdas { 647 648 int foo() 649 { 650 651 { // This variable is used and must be caught early, do not need instantiation 652 const int x = 0; //expected-note{{declared}} 653 auto L = [](auto a) { //expected-note{{begins}} 654 const int &r = x; //expected-error{{variable}} 655 }; 656 } 657 { // This variable is not used 658 const int x = 0; 659 auto L = [](auto a) { 660 int i = x; 661 }; 662 } 663 { 664 665 const int x = 0; //expected-note{{declared}} 666 auto L = [=](auto a) { // <-- #A 667 const int y = 0; 668 return [](auto b) { //expected-note{{begins}} 669 int c[sizeof(b)]; 670 f(x, c); 671 f(y, c); 672 int i = x; 673 // This use will always be an error regardless of instantatiation 674 // so diagnose this early. 675 const int &r = x; //expected-error{{variable}} 676 }; 677 }; 678 679 } 680 return 0; 681 } 682 683 int run = foo(); 684 } 685 686 namespace generic_nongenerics_interleaved_1 { 687 int foo() { 688 { 689 auto L = [](int a) { 690 int y = 10; 691 return [=](auto b) { 692 return a + y; 693 }; 694 }; 695 auto M = L(3); 696 M(5); 697 } 698 { 699 int x; 700 auto L = [](int a) { 701 int y = 10; 702 return [=](auto b) { 703 return a + y; 704 }; 705 }; 706 auto M = L(3); 707 M(5); 708 } 709 { 710 // FIXME: why are there 2 error messages here? 711 int x; 712 auto L = [](auto a) { //expected-note {{declared here}} 713 int y = 10; //expected-note {{declared here}} 714 return [](int b) { //expected-note 2{{expression begins here}} 715 return [=] (auto c) { 716 return a + y; //expected-error 2{{cannot be implicitly captured}} 717 }; 718 }; 719 }; 720 } 721 { 722 int x; 723 auto L = [](auto a) { 724 int y = 10; 725 return [=](int b) { 726 return [=] (auto c) { 727 return a + y; 728 }; 729 }; 730 }; 731 } 732 return 1; 733 } 734 735 int run = foo(); 736 } 737 namespace dont_capture_refs_if_initialized_with_constant_expressions { 738 739 auto foo(int i) { 740 // This is surprisingly not odr-used within the lambda! 741 static int j; 742 j = i; 743 int &ref_j = j; 744 return [](auto a) { return ref_j; }; // ok 745 } 746 747 template<class T> 748 auto foo2(T t) { 749 // This is surprisingly not odr-used within the lambda! 750 static T j; 751 j = t; 752 T &ref_j = j; 753 return [](auto a) { return ref_j; }; // ok 754 } 755 756 int do_test() { 757 auto L = foo(3); 758 auto L_int = L(3); 759 auto L_char = L('a'); 760 auto L1 = foo2(3.14); 761 auto L1_int = L1(3); 762 auto L1_char = L1('a'); 763 return 0; 764 } 765 766 } // dont_capture_refs_if_initialized_with_constant_expressions 767 768 namespace test_conversion_to_fptr { 769 770 template<class T> struct X { 771 772 T (*fp)(T) = [](auto a) { return a; }; 773 774 }; 775 776 X<int> xi; 777 778 template<class T> 779 void fooT(T t, T (*fp)(T) = [](auto a) { return a; }) { 780 fp(t); 781 } 782 783 int test() { 784 { 785 auto L = [](auto a) { return a; }; 786 int (*fp)(int) = L; 787 fp(5); 788 L(3); 789 char (*fc)(char) = L; 790 fc('b'); 791 L('c'); 792 double (*fd)(double) = L; 793 fd(3.14); 794 fd(6.26); 795 L(4.25); 796 } 797 { 798 auto L = [](auto a) ->int { return a; }; //expected-note 2{{candidate template ignored}} 799 int (*fp)(int) = L; 800 char (*fc)(char) = L; //expected-error{{no viable conversion}} 801 double (*fd)(double) = L; //expected-error{{no viable conversion}} 802 } 803 { 804 int x = 5; 805 auto L = [=](auto b, char c = 'x') { 806 int i = x; 807 return [](auto a) ->decltype(a) { return a; }; 808 }; 809 int (*fp)(int) = L(8); 810 fp(5); 811 L(3); 812 char (*fc)(char) = L('a'); 813 fc('b'); 814 L('c'); 815 double (*fd)(double) = L(3.14); 816 fd(3.14); 817 fd(6.26); 818 819 } 820 { 821 auto L = [=](auto b) { 822 return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; 823 }; 824 int* (*fp)(int) = L(8); 825 fp(5); 826 L(3); 827 char* (*fc)(char) = L('a'); 828 fc('b'); 829 L('c'); 830 double* (*fd)(double) = L(3.14); 831 fd(3.14); 832 fd(6.26); 833 } 834 { 835 auto L = [=](auto b) { 836 return [](auto a) ->decltype(b)* { return (decltype(b)*)0; }; //expected-note{{candidate template ignored}} 837 }; 838 char* (*fp)(int) = L('8'); 839 fp(5); 840 char* (*fc)(char) = L('a'); 841 fc('b'); 842 double* (*fi)(int) = L(3.14); 843 fi(5); 844 int* (*fi2)(int) = L(3.14); //expected-error{{no viable conversion}} 845 } 846 847 { 848 auto L = [=](auto b) { 849 return [](auto a) { 850 return [=](auto c) { 851 return [](auto d) ->decltype(a + b + c + d) { return d; }; 852 }; 853 }; 854 }; 855 int (*fp)(int) = L('8')(3)(short{}); 856 double (*fs)(char) = L(3.14)(short{})('4'); 857 } 858 859 fooT(3); 860 fooT('a'); 861 fooT(3.14); 862 fooT("abcdefg"); 863 return 0; 864 } 865 int run2 = test(); 866 867 } 868 869 870 namespace this_capture { 871 void f(char, int) { } 872 template<class T> 873 void f(T, const int&) { } 874 875 struct X { 876 int x = 0; 877 void foo() { 878 auto L = [=](auto a) { 879 return [=](auto b) { 880 //f(a, x++); 881 x++; 882 }; 883 }; 884 L('a')(5); 885 L('b')(4); 886 L(3.14)('3'); 887 888 } 889 890 }; 891 892 int run = (X{}.foo(), 0); 893 894 namespace this_capture_unresolvable { 895 struct X { 896 void f(int) { } 897 static void f(double) { } 898 899 int g() { 900 auto lam = [=](auto a) { f(a); }; // captures 'this' 901 lam(0); // ok. 902 lam(0.0); // ok. 903 return 0; 904 } 905 int g2() { 906 auto lam = [](auto a) { f(a); }; // expected-error{{'this'}} 907 lam(0); // expected-note{{in instantiation of}} 908 lam(0.0); // ok. 909 return 0; 910 } 911 double (*fd)(double) = [](auto a) { f(a); return a; }; 912 913 }; 914 915 int run = X{}.g(); 916 917 } 918 919 namespace check_nsdmi_and_this_capture_of_member_functions { 920 921 struct FunctorDouble { 922 template<class T> FunctorDouble(T t) { t(2.14); }; 923 }; 924 struct FunctorInt { 925 template<class T> FunctorInt(T t) { t(2); }; //expected-note{{in instantiation of}} 926 }; 927 928 template<class T> struct YUnresolvable { 929 void f(int) { } 930 static void f(double) { } 931 932 T t = [](auto a) { f(a); return a; }; 933 T t2 = [=](auto b) { f(b); return b; }; 934 }; 935 936 template<class T> struct YUnresolvable2 { 937 void f(int) { } 938 static void f(double) { } 939 940 T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}} \ 941 //expected-note{{in instantiation of}} 942 T t2 = [=](auto b) { f(b); return b; }; 943 }; 944 945 946 YUnresolvable<FunctorDouble> yud; 947 // This will cause an error since it call's with an int and calls a member function. 948 YUnresolvable2<FunctorInt> yui; 949 950 951 template<class T> struct YOnlyStatic { 952 static void f(double) { } 953 954 T t = [](auto a) { f(a); return a; }; 955 }; 956 YOnlyStatic<FunctorDouble> yos; 957 template<class T> struct YOnlyNonStatic { 958 void f(int) { } 959 960 T t = [](auto a) { f(a); return a; }; //expected-error{{'this'}} 961 }; 962 963 964 } 965 966 967 namespace check_nsdmi_and_this_capture_of_data_members { 968 969 struct FunctorDouble { 970 template<class T> FunctorDouble(T t) { t(2.14); }; 971 }; 972 struct FunctorInt { 973 template<class T> FunctorInt(T t) { t(2); }; 974 }; 975 976 template<class T> struct YThisCapture { 977 const int x = 10; 978 static double d; 979 T t = [](auto a) { return x; }; //expected-error{{'this'}} 980 T t2 = [](auto b) { return d; }; 981 T t3 = [this](auto a) { 982 return [=](auto b) { 983 return x; 984 }; 985 }; 986 T t4 = [=](auto a) { 987 return [=](auto b) { 988 return x; 989 }; 990 }; 991 T t5 = [](auto a) { 992 return [=](auto b) { 993 return x; //expected-error{{'this'}} 994 }; 995 }; 996 }; 997 998 template<class T> double YThisCapture<T>::d = 3.14; 999 1000 1001 } 1002 1003 1004 #ifdef DELAYED_TEMPLATE_PARSING 1005 template<class T> void foo_no_error(T t) { 1006 auto L = []() 1007 { return t; }; 1008 } 1009 template<class T> void foo(T t) { //expected-note 2{{declared here}} 1010 auto L = []() //expected-note 2{{begins here}} 1011 { return t; }; //expected-error 2{{cannot be implicitly captured}} 1012 } 1013 template void foo(int); //expected-note{{in instantiation of}} 1014 1015 #else 1016 1017 template<class T> void foo(T t) { //expected-note{{declared here}} 1018 auto L = []() //expected-note{{begins here}} 1019 { return t; }; //expected-error{{cannot be implicitly captured}} 1020 } 1021 1022 #endif 1023 } 1024 1025 namespace no_this_capture_for_static { 1026 1027 struct X { 1028 static void f(double) { } 1029 1030 int g() { 1031 auto lam = [=](auto a) { f(a); }; 1032 lam(0); // ok. 1033 ASSERT_NO_CAPTURES(lam); 1034 return 0; 1035 } 1036 }; 1037 1038 int run = X{}.g(); 1039 } 1040 1041 namespace this_capture_for_non_static { 1042 1043 struct X { 1044 void f(double) { } 1045 1046 int g() { 1047 auto L = [=](auto a) { f(a); }; 1048 L(0); 1049 auto L2 = [](auto a) { f(a); }; //expected-error {{cannot be implicitly captured}} 1050 return 0; 1051 } 1052 }; 1053 1054 int run = X{}.g(); 1055 } 1056 1057 namespace this_captures_with_num_args_disambiguation { 1058 1059 struct X { 1060 void f(int) { } 1061 static void f(double, int i) { } 1062 int g() { 1063 auto lam = [](auto a) { f(a, a); }; 1064 lam(0); 1065 return 0; 1066 } 1067 }; 1068 1069 int run = X{}.g(); 1070 } 1071 namespace enclosing_function_is_template_this_capture { 1072 // Only error if the instantiation tries to use the member function. 1073 struct X { 1074 void f(int) { } 1075 static void f(double) { } 1076 template<class T> 1077 int g(T t) { 1078 auto L = [](auto a) { f(a); }; //expected-error{{'this'}} 1079 L(t); // expected-note{{in instantiation of}} 1080 return 0; 1081 } 1082 }; 1083 1084 int run = X{}.g(0.0); // OK. 1085 int run2 = X{}.g(0); // expected-note{{in instantiation of}} 1086 1087 1088 } 1089 1090 namespace enclosing_function_is_template_this_capture_2 { 1091 // This should error, even if not instantiated, since 1092 // this would need to be captured. 1093 struct X { 1094 void f(int) { } 1095 template<class T> 1096 int g(T t) { 1097 auto L = [](auto a) { f(a); }; //expected-error{{'this'}} 1098 L(t); 1099 return 0; 1100 } 1101 }; 1102 1103 } 1104 1105 1106 namespace enclosing_function_is_template_this_capture_3 { 1107 // This should not error, this does not need to be captured. 1108 struct X { 1109 static void f(int) { } 1110 template<class T> 1111 int g(T t) { 1112 auto L = [](auto a) { f(a); }; 1113 L(t); 1114 return 0; 1115 } 1116 }; 1117 1118 int run = X{}.g(0.0); // OK. 1119 int run2 = X{}.g(0); // OK. 1120 1121 } 1122 1123 namespace nested_this_capture_1 { 1124 struct X { 1125 void f(int) { } 1126 static void f(double) { } 1127 1128 int g() { 1129 auto L = [=](auto a) { 1130 return [this]() { 1131 return [=](auto b) { 1132 f(b); 1133 }; 1134 }; 1135 }; 1136 auto M = L(0); 1137 auto N = M(); 1138 N(5); 1139 return 0; 1140 } 1141 }; 1142 1143 int run = X{}.g(); 1144 1145 } 1146 1147 1148 namespace nested_this_capture_2 { 1149 struct X { 1150 void f(int) { } 1151 static void f(double) { } 1152 1153 int g() { 1154 auto L = [=](auto a) { 1155 return [&]() { 1156 return [=](auto b) { 1157 f(b); 1158 }; 1159 }; 1160 }; 1161 auto M = L(0); 1162 auto N = M(); 1163 N(5); 1164 N(3.14); 1165 return 0; 1166 } 1167 }; 1168 1169 int run = X{}.g(); 1170 1171 } 1172 1173 namespace nested_this_capture_3_1 { 1174 struct X { 1175 template<class T> 1176 void f(int, T t) { } 1177 template<class T> 1178 static void f(double, T t) { } 1179 1180 int g() { 1181 auto L = [=](auto a) { 1182 return [&](auto c) { 1183 return [=](auto b) { 1184 f(b, c); 1185 }; 1186 }; 1187 }; 1188 auto M = L(0); 1189 auto N = M('a'); 1190 N(5); 1191 N(3.14); 1192 return 0; 1193 } 1194 }; 1195 1196 int run = X{}.g(); 1197 1198 } 1199 1200 1201 namespace nested_this_capture_3_2 { 1202 struct X { 1203 void f(int) { } 1204 static void f(double) { } 1205 1206 int g() { 1207 auto L = [=](auto a) { 1208 return [](int i) { 1209 return [=](auto b) { 1210 f(b); //expected-error {{'this' cannot}} 1211 int x = i; 1212 }; 1213 }; 1214 }; 1215 auto M = L(0.0); 1216 auto N = M(3); 1217 N(5); //expected-note {{in instantiation of}} 1218 N(3.14); // OK. 1219 return 0; 1220 } 1221 }; 1222 1223 int run = X{}.g(); 1224 1225 } 1226 1227 namespace nested_this_capture_4 { 1228 struct X { 1229 void f(int) { } 1230 static void f(double) { } 1231 1232 int g() { 1233 auto L = [](auto a) { 1234 return [=](auto i) { 1235 return [=](auto b) { 1236 f(b); //expected-error {{'this' cannot}} 1237 int x = i; 1238 }; 1239 }; 1240 }; 1241 auto M = L(0.0); 1242 auto N = M(3); 1243 N(5); //expected-note {{in instantiation of}} 1244 N(3.14); // OK. 1245 return 0; 1246 } 1247 }; 1248 1249 int run = X{}.g(); 1250 1251 } 1252 namespace capture_enclosing_function_parameters { 1253 1254 1255 inline auto foo(int x) { 1256 int i = 10; 1257 auto lambda = [=](auto z) { return x + z; }; 1258 return lambda; 1259 } 1260 1261 int foo2() { 1262 auto L = foo(3); 1263 L(4); 1264 L('a'); 1265 L(3.14); 1266 return 0; 1267 } 1268 1269 inline auto foo3(int x) { 1270 int local = 1; 1271 auto L = [=](auto a) { 1272 int i = a[local]; 1273 return [=](auto b) mutable { 1274 auto n = b; 1275 return [&, n](auto c) mutable { 1276 ++local; 1277 return ++x; 1278 }; 1279 }; 1280 }; 1281 auto M = L("foo-abc"); 1282 auto N = M("foo-def"); 1283 auto O = N("foo-ghi"); 1284 1285 return L; 1286 } 1287 1288 int main() { 1289 auto L3 = foo3(3); 1290 auto M3 = L3("L3-1"); 1291 auto N3 = M3("M3-1"); 1292 auto O3 = N3("N3-1"); 1293 N3("N3-2"); 1294 M3("M3-2"); 1295 M3("M3-3"); 1296 L3("L3-2"); 1297 } 1298 } // end ns 1299 1300 namespace capture_arrays { 1301 1302 inline int sum_array(int n) { 1303 int array2[5] = { 1, 2, 3, 4, 5}; 1304 1305 auto L = [=](auto N) -> int { 1306 int sum = 0; 1307 int array[5] = { 1, 2, 3, 4, 5 }; 1308 sum += array2[sum]; 1309 sum += array2[N]; 1310 return 0; 1311 }; 1312 L(2); 1313 return L(n); 1314 } 1315 } 1316 1317 namespace capture_non_odr_used_variable_because_named_in_instantiation_dependent_expressions { 1318 1319 // even though 'x' is not odr-used, it should be captured. 1320 1321 int test() { 1322 const int x = 10; 1323 auto L = [=](auto a) { 1324 (void) +x + a; 1325 }; 1326 ASSERT_CLOSURE_SIZE_EXACT(L, sizeof(x)); 1327 } 1328 1329 } //end ns 1330 #ifdef MS_EXTENSIONS 1331 namespace explicit_spec { 1332 template<class R> struct X { 1333 template<class T> int foo(T t) { 1334 auto L = [](auto a) { return a; }; 1335 L(&t); 1336 return 0; 1337 } 1338 1339 template<> int foo<char>(char c) { //expected-warning{{explicit specialization}} 1340 const int x = 10; 1341 auto LC = [](auto a) { return a; }; 1342 R r; 1343 LC(&r); 1344 auto L = [=](auto a) { 1345 return [=](auto b) { 1346 int d[sizeof(a)]; 1347 f(x, d); 1348 }; 1349 }; 1350 auto M = L(1); 1351 1352 ASSERT_NO_CAPTURES(M); 1353 return 0; 1354 } 1355 1356 }; 1357 1358 int run_char = X<int>{}.foo('a'); 1359 int run_int = X<double>{}.foo(4); 1360 } 1361 #endif // MS_EXTENSIONS 1362 1363 namespace nsdmi_capturing_this { 1364 struct X { 1365 int m = 10; 1366 int n = [this](auto) { return m; }(20); 1367 }; 1368 1369 template<class T> 1370 struct XT { 1371 T m = 10; 1372 T n = [this](auto) { return m; }(20); 1373 }; 1374 1375 XT<int> xt{}; 1376 1377 1378 } 1379