1- // RUN: %check_clang_tidy %s readability-avoid-default-lambda-capture %t -- -- -Wno-vla-extension
1+ // RUN: %check_clang_tidy %s readability-avoid-default-lambda-capture %t -- -- -Wno-vla-extension -std=c++20
22
33void test_default_captures () {
44 int value = 42 ;
@@ -21,6 +21,34 @@ void test_default_captures() {
2121 // CHECK-FIXES: auto lambda4 = [&another, value](int x) { return value + another + x; };
2222}
2323
24+ template <typename ... Args>
25+ void test_pack_expansion_captures (Args... args) {
26+ int local = 5 ;
27+
28+ auto lambda1 = [=]() { return (args + ...); };
29+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
30+
31+ auto lambda2 = [&]() { return (args + ...); };
32+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
33+
34+ auto lambda3 = [=]() { return (args + ...) + local; };
35+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
36+
37+ auto lambda4 = [&]() { return (args + ...) + local; };
38+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
39+
40+ auto lambda5 = [=, ...copied = args]() { return (copied + ...); };
41+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
42+
43+ auto lambda6 = [&, ...refs = args]() { return (refs + ...); };
44+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
45+ }
46+
47+ void instantiate_pack_expansion_tests () {
48+ test_pack_expansion_captures (1 , 2 , 3 );
49+ test_pack_expansion_captures (1.0 , 2.0 , 3.0 );
50+ }
51+
2452void test_acceptable_captures () {
2553 int value = 42 ;
2654 int another = 10 ;
@@ -52,7 +80,7 @@ void test_nested_lambdas() {
5280 auto inner = [&](int x) { return outer_var + middle_var + inner_var + x; };
5381 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
5482 // CHECK-FIXES: auto inner = [&outer_var, &middle_var, &inner_var](int x) { return outer_var + middle_var + inner_var + x; };
55-
83+
5684 return inner (10 );
5785 };
5886}
@@ -65,7 +93,7 @@ void test_lambda_returns() {
6593 // CHECK-FIXES: auto create_adder = [](int x) {
6694 return [x](int y) { return x + y; }; // Inner lambda is fine - explicit capture
6795 };
68-
96+
6997 auto func1 = [&]() { return a; };
7098 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
7199 // CHECK-FIXES: auto func1 = [&a]() { return a; };
@@ -77,19 +105,19 @@ void test_lambda_returns() {
77105
78106class TestClass {
79107 int member = 42 ;
80-
108+
81109public:
82110 void test_member_function_lambdas () {
83111 int local = 10 ;
84-
112+
85113 auto lambda1 = [=]() { return member + local; };
86114 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
87115 // CHECK-FIXES: auto lambda1 = [this, local]() { return member + local; };
88116
89117 auto lambda2 = [&]() { return member + local; };
90118 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
91119 // CHECK-FIXES: auto lambda2 = [this, &local]() { return member + local; };
92-
120+
93121 auto lambda3 = [this , local]() { return member + local; };
94122 auto lambda4 = [this , &local]() { return member + local; };
95123 }
@@ -99,7 +127,7 @@ class TestClass {
99127template <typename T>
100128void test_template_lambdas () {
101129 T value{};
102-
130+
103131 auto lambda = [=](T x) { return value + x; };
104132 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: lambda default captures are discouraged; prefer to capture specific variables explicitly [readability-avoid-default-lambda-capture]
105133}
0 commit comments