1 | // RUN: %check_clang_tidy -std=c++20-or-later %s cppcoreguidelines-avoid-capturing-lambda-coroutines %t -- -- -isystem %S/Inputs/system |
2 | |
3 | #include <coroutines.h> |
4 | |
5 | void Caught() { |
6 | int v; |
7 | |
8 | [&] () -> task { int y = v; co_return; }; |
9 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
10 | [=] () -> task { int y = v; co_return; }; |
11 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
12 | [v] () -> task { co_return; }; |
13 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
14 | [&v] () -> task { co_return; }; |
15 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
16 | [y=v] () -> task { co_return; }; |
17 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
18 | [y{v}] () -> task { co_return; }; |
19 | // CHECK-MESSAGES: [[@LINE-1]]:5: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
20 | } |
21 | |
22 | struct S { |
23 | void m() { |
24 | [this] () -> task { co_return; }; |
25 | // CHECK-MESSAGES: [[@LINE-1]]:9: warning: coroutine lambda may cause use-after-free, avoid captures or ensure lambda closure object has guaranteed lifetime [cppcoreguidelines-avoid-capturing-lambda-coroutines] |
26 | } |
27 | }; |
28 | |
29 | void Safe() { |
30 | int v; |
31 | [] () -> task { co_return; }; |
32 | [&] () -> task { co_return; }; |
33 | [=] () -> task { co_return; }; |
34 | |
35 | [&v]{++v;}(); |
36 | } |
37 | |