Add new clang-tidy check that finds uses of `std::lock_guard` and suggests
replacing them with C++17's more flexible and safer alternative
`std::scoped_lock`.
Here is a small description of how it works for better understanding of
the code:
Two separate AST matchers are registered:
- The first one matches declarations of `std::lock_guard` that are
single in their scope (only one `std::lock_guard` in `CompoundStmt`).
It's an easy case, we can emit warning right away.
- The second one matches `CompoundStmt`'s that have multiple
`std::lock_guard` declarations, which means that we may have consecutive
declarations of `std::lock_guard` that can be replaced by a single
`std::scoped_lock`. In order to ensure that declarations are
consecutive, we need to loop over `Stmt`'s in `CompoundStmt`. Here is a
small example:
```cpp
{
std::mutex m1, m2;
std::lock(m1, m2);
std::lock_guard<std::mutex> l1(m, std::adopt_lock); // first declaration of 'std::lock_guard'
std::lock_guard<std::mutex> l2(m, std::adopt_lock); // second declaration of 'std::lock_guard' that can be merged with first using 'scoped_lock'
}
```
This PR closes https://github.com/llvm/llvm-project/issues/107839.
73 lines
1.6 KiB
CMake
73 lines
1.6 KiB
CMake
set(LLVM_LINK_COMPONENTS
|
|
FrontendOpenMP
|
|
Support
|
|
)
|
|
|
|
add_clang_library(clangTidyModernizeModule STATIC
|
|
AvoidBindCheck.cpp
|
|
AvoidCArraysCheck.cpp
|
|
ConcatNestedNamespacesCheck.cpp
|
|
DeprecatedHeadersCheck.cpp
|
|
DeprecatedIosBaseAliasesCheck.cpp
|
|
IntegralLiteralExpressionMatcher.cpp
|
|
LoopConvertCheck.cpp
|
|
LoopConvertUtils.cpp
|
|
MacroToEnumCheck.cpp
|
|
MakeSharedCheck.cpp
|
|
MakeSmartPtrCheck.cpp
|
|
MakeUniqueCheck.cpp
|
|
MinMaxUseInitializerListCheck.cpp
|
|
ModernizeTidyModule.cpp
|
|
PassByValueCheck.cpp
|
|
RawStringLiteralCheck.cpp
|
|
RedundantVoidArgCheck.cpp
|
|
ReplaceAutoPtrCheck.cpp
|
|
ReplaceDisallowCopyAndAssignMacroCheck.cpp
|
|
ReplaceRandomShuffleCheck.cpp
|
|
ReturnBracedInitListCheck.cpp
|
|
ShrinkToFitCheck.cpp
|
|
TypeTraitsCheck.cpp
|
|
UnaryStaticAssertCheck.cpp
|
|
UseAutoCheck.cpp
|
|
UseBoolLiteralsCheck.cpp
|
|
UseConstraintsCheck.cpp
|
|
UseDefaultMemberInitCheck.cpp
|
|
UseDesignatedInitializersCheck.cpp
|
|
UseEmplaceCheck.cpp
|
|
UseEqualsDefaultCheck.cpp
|
|
UseEqualsDeleteCheck.cpp
|
|
UseIntegerSignComparisonCheck.cpp
|
|
UseNodiscardCheck.cpp
|
|
UseNoexceptCheck.cpp
|
|
UseNullptrCheck.cpp
|
|
UseOverrideCheck.cpp
|
|
UseRangesCheck.cpp
|
|
UseScopedLockCheck.cpp
|
|
UseStartsEndsWithCheck.cpp
|
|
UseStdFormatCheck.cpp
|
|
UseStdNumbersCheck.cpp
|
|
UseStdPrintCheck.cpp
|
|
UseTrailingReturnTypeCheck.cpp
|
|
UseTransparentFunctorsCheck.cpp
|
|
UseUncaughtExceptionsCheck.cpp
|
|
UseUsingCheck.cpp
|
|
|
|
LINK_LIBS
|
|
clangTidy
|
|
clangTidyReadabilityModule
|
|
clangTidyUtils
|
|
|
|
DEPENDS
|
|
omp_gen
|
|
ClangDriverOptions
|
|
)
|
|
|
|
clang_target_link_libraries(clangTidyModernizeModule
|
|
PRIVATE
|
|
clangAST
|
|
clangASTMatchers
|
|
clangBasic
|
|
clangLex
|
|
clangTooling
|
|
)
|