@@ -45,6 +45,7 @@ struct D {
45
45
void operator ()(int x, int y) const {}
46
46
47
47
void MemberFunction (int x) {}
48
+ int MemberFunctionWithReturn (int x) {}
48
49
49
50
static D *create ();
50
51
};
@@ -162,11 +163,11 @@ struct TestCaptureByValueStruct {
162
163
// those here.
163
164
auto FFF = boost::bind (UseF, f);
164
165
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to boost::bind [modernize-avoid-bind]
165
- // CHECK-FIXES: auto FFF = [f] { return UseF(f); };
166
+ // CHECK-FIXES: auto FFF = [f] { UseF(f); };
166
167
167
168
auto GGG = boost::bind (UseF, MemberStruct);
168
169
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to boost::bind [modernize-avoid-bind]
169
- // CHECK-FIXES: auto GGG = [this] { return UseF(MemberStruct); };
170
+ // CHECK-FIXES: auto GGG = [this] { UseF(MemberStruct); };
170
171
171
172
auto HHH = std::bind (add, MemberStructWithData._member , 1 );
172
173
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
@@ -227,42 +228,42 @@ void testFunctionObjects() {
227
228
D *e = nullptr ;
228
229
auto AAA = std::bind (d, 1 , 2 );
229
230
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
230
- // CHECK-FIXES: auto AAA = [d] { return d(1, 2); }
231
+ // CHECK-FIXES: auto AAA = [d] { d(1, 2); }
231
232
232
233
auto BBB = std::bind (*e, 1 , 2 );
233
234
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
234
- // CHECK-FIXES: auto BBB = [e] { return (*e)(1, 2); }
235
+ // CHECK-FIXES: auto BBB = [e] { (*e)(1, 2); }
235
236
236
237
auto CCC = std::bind (D{}, 1 , 2 );
237
238
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
238
- // CHECK-FIXES: auto CCC = [] { return D{}(1, 2); }
239
+ // CHECK-FIXES: auto CCC = [] { D{}(1, 2); }
239
240
240
241
auto DDD = std::bind (D (), 1 , 2 );
241
242
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
242
- // CHECK-FIXES: auto DDD = [] { return D()(1, 2); }
243
+ // CHECK-FIXES: auto DDD = [] { D()(1, 2); }
243
244
244
245
auto EEE = std::bind (*D::create (), 1 , 2 );
245
246
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
246
- // CHECK-FIXES: auto EEE = [Func = *D::create()] { return Func(1, 2); };
247
+ // CHECK-FIXES: auto EEE = [Func = *D::create()] { Func(1, 2); };
247
248
248
249
auto FFF = std::bind (G (), 1 );
249
250
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
250
251
// Templated function call operators may be used
251
- // CHECK-FIXES: auto FFF = [] { return G()(1); };
252
+ // CHECK-FIXES: auto FFF = [] { G()(1); };
252
253
253
254
int CTorArg = 42 ;
254
255
auto GGG = std::bind (G (CTorArg), 1 );
255
256
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
256
257
// Function objects with constructor arguments should be captured
257
- // CHECK-FIXES: auto GGG = [Func = G(CTorArg)] { return Func(1); };
258
+ // CHECK-FIXES: auto GGG = [Func = G(CTorArg)] { Func(1); };
258
259
}
259
260
260
261
template <typename T>
261
262
void testMemberFnOfClassTemplate (T) {
262
263
auto HHH = std::bind (H<T>(), 42 );
263
264
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
264
265
// Ensure function class template arguments are preserved
265
- // CHECK-FIXES: auto HHH = [] { return H<T>()(42); };
266
+ // CHECK-FIXES: auto HHH = [] { H<T>()(42); };
266
267
}
267
268
268
269
template void testMemberFnOfClassTemplate (int );
@@ -335,11 +336,12 @@ void testCapturedSubexpressions() {
335
336
auto CCC = std::bind (sub, std::ref (*p), _1);
336
337
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
337
338
// Expressions returning references are captured
338
- // CHECK-FIXES: auto CCC = [&capture0 = *p](auto && PH1) { return sub(capture0, std::forward<decltype(PH1)>(PH1)); };
339
+ // CHECK-FIXES: auto CCC = [&capture0 = *p](auto && PH1) { sub(capture0, std::forward<decltype(PH1)>(PH1)); };
339
340
}
340
341
341
342
struct E {
342
343
void MemberFunction (int x) {}
344
+ int MemberFunctionWithReturn (int x) {}
343
345
344
346
void testMemberFunctions () {
345
347
D *d;
@@ -360,6 +362,23 @@ struct E {
360
362
auto DDD = std::bind (&D::MemberFunction, _1, 1 );
361
363
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
362
364
// CHECK-FIXES: auto DDD = [](auto && PH1) { PH1->MemberFunction(1); };
365
+
366
+ auto EEE = std::bind (&D::MemberFunctionWithReturn, d, 1 );
367
+ // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
368
+ // CHECK-FIXES: auto EEE = [d] { return d->MemberFunctionWithReturn(1); };
369
+
370
+ auto FFF = std::bind (&D::MemberFunctionWithReturn, &dd, 1 );
371
+ // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
372
+ // CHECK-FIXES: auto FFF = [ObjectPtr = &dd] { return ObjectPtr->MemberFunctionWithReturn(1); };
373
+
374
+ auto GGG = std::bind (&E::MemberFunctionWithReturn, this , 1 );
375
+ // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
376
+ // CHECK-FIXES: auto GGG = [this] { return MemberFunctionWithReturn(1); };
377
+
378
+ // Test what happens when the object pointer is itself a placeholder.
379
+ auto HHH = std::bind (&D::MemberFunctionWithReturn, _1, 1 );
380
+ // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer a lambda to std::bind
381
+ // CHECK-FIXES: auto HHH = [](auto && PH1) { return PH1->MemberFunctionWithReturn(1); };
363
382
}
364
383
};
365
384
@@ -368,5 +387,5 @@ void testStdFunction(Thing *t) {
368
387
if (t)
369
388
cb.Reset (std::bind (UseThing, t));
370
389
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: prefer a lambda to std::bind
371
- // CHECK-FIXES: cb.Reset([t] { return UseThing(t); });
390
+ // CHECK-FIXES: cb.Reset([t] { UseThing(t); });
372
391
}
0 commit comments