1 | // RUN: %check_clang_tidy -std=c++11-or-later %s cppcoreguidelines-misleading-capture-default-by-value %t |
2 | |
3 | struct Obj { |
4 | void lambdas_that_warn_default_capture_copy() { |
5 | int local{}; |
6 | int local2{}; |
7 | |
8 | auto explicit_this_capture = [=, this]() { }; |
9 | // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
10 | // CHECK-FIXES: auto explicit_this_capture = [this]() { }; |
11 | |
12 | auto explicit_this_capture_locals1 = [=, this]() { return (local+x) > 10; }; |
13 | // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
14 | // CHECK-FIXES: auto explicit_this_capture_locals1 = [local, this]() { return (local+x) > 10; }; |
15 | |
16 | auto explicit_this_capture_locals2 = [=, this]() { return (local+local2) > 10; }; |
17 | // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
18 | // CHECK-FIXES: auto explicit_this_capture_locals2 = [local, local2, this]() { return (local+local2) > 10; }; |
19 | |
20 | auto explicit_this_capture_local_ref = [=, this, &local]() { return (local+x) > 10; }; |
21 | // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
22 | // CHECK-FIXES: auto explicit_this_capture_local_ref = [this, &local]() { return (local+x) > 10; }; |
23 | |
24 | auto explicit_this_capture_local_ref2 = [=, &local, this]() { return (local+x) > 10; }; |
25 | // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
26 | // CHECK-FIXES: auto explicit_this_capture_local_ref2 = [&local, this]() { return (local+x) > 10; }; |
27 | |
28 | auto explicit_this_capture_local_ref3 = [=, &local, this, &local2]() { return (local+x) > 10; }; |
29 | // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
30 | // CHECK-FIXES: auto explicit_this_capture_local_ref3 = [&local, this, &local2]() { return (local+x) > 10; }; |
31 | |
32 | auto explicit_this_capture_local_ref4 = [=, &local, &local2, this]() { return (local+x) > 10; }; |
33 | // CHECK-MESSAGES: :[[@LINE-1]]:46: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
34 | // CHECK-FIXES: auto explicit_this_capture_local_ref4 = [&local, &local2, this]() { return (local+x) > 10; }; |
35 | |
36 | auto = [=, & local, &local2, this]() { return (local+x) > 10; }; |
37 | // CHECK-MESSAGES: :[[@LINE-1]]:62: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
38 | // CHECK-FIXES: auto explicit_this_capture_local_ref_extra_whitespace = [& local, &local2, this]() { return (local+x) > 10; }; |
39 | |
40 | auto = [=, & /* byref */ local, &local2, this]() { return (local+x) > 10; }; |
41 | // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: lambdas that capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
42 | // CHECK-FIXES: auto explicit_this_capture_local_ref_with_comment = [& /* byref */ local, &local2, this]() { return (local+x) > 10; }; |
43 | |
44 | auto implicit_this_capture = [=]() { return x > 10; }; |
45 | // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: lambdas that implicitly capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
46 | // CHECK-FIXES: auto implicit_this_capture = [this]() { return x > 10; }; |
47 | |
48 | auto implicit_this_capture_local = [=]() { return (local+x) > 10; }; |
49 | // CHECK-MESSAGES: :[[@LINE-1]]:41: warning: lambdas that implicitly capture 'this' should not specify a by-value capture default [cppcoreguidelines-misleading-capture-default-by-value] |
50 | // CHECK-FIXES: auto implicit_this_capture_local = [local, this]() { return (local+x) > 10; }; |
51 | } |
52 | |
53 | void lambdas_that_dont_warn_default_capture_ref() { |
54 | int local{}; |
55 | int local2{}; |
56 | |
57 | auto ref_explicit_this_capture = [&, this]() { }; |
58 | auto ref_explicit_this_capture_local = [&, this]() { return (local+x) > 10; }; |
59 | |
60 | auto ref_implicit_this_capture = [&]() { return x > 10; }; |
61 | auto ref_implicit_this_capture_local = [&]() { return (local+x) > 10; }; |
62 | auto ref_implicit_this_capture_locals = [&]() { return (local+local2+x) > 10; }; |
63 | } |
64 | |
65 | void lambdas_that_dont_warn() { |
66 | int local{}; |
67 | int local2{}; |
68 | auto explicit_this_capture = [this]() { }; |
69 | auto explicit_this_capture_local = [this, local]() { return local > 10; }; |
70 | auto explicit_this_capture_local_ref = [this, &local]() { return local > 10; }; |
71 | |
72 | auto no_captures = []() {}; |
73 | auto capture_local_only = [local]() {}; |
74 | auto ref_capture_local_only = [&local]() {}; |
75 | auto capture_many = [local, &local2]() {}; |
76 | } |
77 | |
78 | int x; |
79 | }; |
80 | |