// RUN: %check_clang_tidy -std=c++17-or-later %s modernize-use-scoped-lock %t -- -- -isystem %clang_tidy_headers -fno-delayed-template-parsing #include void Positive() { std::mutex m; { std::lock_guard l(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(m); } { std::lock_guard l(m, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(std::adopt_lock, m); } { std::lock_guard l1(m); std::lock_guard l2(m); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here } { std::lock_guard l1(m), l2(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:40: note: additional 'std::lock_guard' declared here } { std::lock_guard l1(m), l2(m), l3(m); std::lock_guard l4(m); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-3]]:40: note: additional 'std::lock_guard' declared here // CHECK-MESSAGES: :[[@LINE-4]]:47: note: additional 'std::lock_guard' declared here // CHECK-MESSAGES: :[[@LINE-4]]:33: note: additional 'std::lock_guard' declared here } { std::lock(m, m); std::lock_guard l1(m, std::adopt_lock); std::lock_guard l2(m, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here int a = 0; std::lock_guard l3(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l3(m); int b = 0; std::lock_guard l4(m, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l4(std::adopt_lock, m); } } std::mutex p_m1; void PositiveShortFunction() { std::lock_guard l(p_m1); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(p_m1); } void PositiveNested() { std::mutex m1; if (true) { std::lock_guard l(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(m1); { std::lock_guard l2(m1); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l2(m1); { std::lock_guard l3(m1); std::lock_guard l4(m1); // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:37: note: additional 'std::lock_guard' declared here } { std::lock_guard l2(m1); // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l2(m1); } } } std::lock_guard l(m1); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(m1); } void PositiveInsideArg(std::mutex &m1, std::mutex &m2, std::mutex &m3) { std::lock_guard l1(m1); std::lock_guard l2(m2); // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:31: note: additional 'std::lock_guard' declared here int a = 0; std::lock_guard l3(m3); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l3(m3); } void PositiveInsideConditional() { std::mutex m1; if (true) { std::lock_guard l1(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m1); } else { std::lock_guard l1(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m1); } while (true) { std::lock_guard l1(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m1); } for (int i = 0; i < 10; ++i) { std::lock_guard l1(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m1); } } void PositiveLambda() { std::mutex m; std::lock_guard l1(m); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m); auto lambda1 = [&]() { std::lock_guard l1(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m); }; std::lock_guard l3(m); std::lock_guard l4(m); // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:31: note: additional 'std::lock_guard' declared here auto lamda2 = [&]() { std::lock_guard l3(m); std::lock_guard l4(m); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here }; auto lamda3 = [&]() { std::lock(m, m); std::lock_guard l1(m, std::adopt_lock); std::lock_guard l2(m, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here int a = 0; std::lock_guard l3(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l3(m); int b = 0; std::lock_guard l4(m, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l4(std::adopt_lock, m); }; auto lamda4 = [&]() { std::lock_guard l1(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l1(m); int a = 0; std::lock_guard l2(m); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l2(m); }; } template void PositiveTemplated() { std::mutex m1, m2, m3; { std::lock_guard l(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l(m1); } { std::lock_guard l1(m1); std::lock_guard l2(m2); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here } { std::lock(m1, m2); std::lock_guard l1(m1, std::adopt_lock); std::lock_guard l2(m2, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:33: note: additional 'std::lock_guard' declared here int a = 0; std::lock_guard l3(m3); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' // CHECK-FIXES: std::scoped_lock l3(m3); } } template void PositiveTemplatedMutex() { Mutex m1, m2, m3; { std::lock_guard l(m1); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' } { std::lock_guard l1(m1); std::lock_guard l2(m2); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:28: note: additional 'std::lock_guard' declared here } { std::lock(m1, m2); std::lock_guard l1(m1, std::adopt_lock); std::lock_guard l2(m2, std::adopt_lock); // CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use single 'std::scoped_lock' instead of multiple 'std::lock_guard' // CHECK-MESSAGES: :[[@LINE-2]]:28: note: additional 'std::lock_guard' declared here int a = 0; std::lock_guard l3(m3); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: use 'std::scoped_lock' instead of 'std::lock_guard' } } template