Index: clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp @@ -404,7 +404,8 @@ hasArgument(0, declRefExpr().bind("arg")), anyOf(hasAncestor(lambdaExpr().bind("containing-lambda")), hasAncestor(functionDecl().bind("containing-func"))), - unless(inDecltypeOrTemplateArg())) + unless(anyOf(inDecltypeOrTemplateArg(), + hasType(qualType(isConstQualified()))))) .bind("call-move"); Finder->addMatcher( Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-use-after-move.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-use-after-move.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-use-after-move.cpp @@ -129,6 +129,14 @@ // CHECK-NOTES: [[@LINE-3]]:15: note: move occurred here } +// Simple case for const value. +void simpleConst(const A a) { + A other_a = std::move(a); + a.foo(); + // CHECK-NOTES-NOT: [[@LINE-1]]:3: warning: 'a' used after it was moved + // CHECK-NOTES-NOT: [[@LINE-3]]:15: note: move occurred here +} + // A warning should only be emitted for one use-after-move. void onlyFlagOneUseAfterMove() { A a; @@ -314,8 +322,8 @@ auto lambda = [a] { std::move(a); a.foo(); - // CHECK-NOTES: [[@LINE-1]]:7: warning: 'a' used after it was moved - // CHECK-NOTES: [[@LINE-3]]:7: note: move occurred here + // CHECK-NOTES-NOT: [[@LINE-1]]:7: warning: 'a' used after it was moved + // CHECK-NOTES-NOT: [[@LINE-3]]:7: note: move occurred here }; } // This is just as true if the variable was declared inside the lambda. @@ -721,14 +729,14 @@ const A a; std::move(a); passByConstPointer(&a); - // CHECK-NOTES: [[@LINE-1]]:25: warning: 'a' used after it was moved - // CHECK-NOTES: [[@LINE-3]]:5: note: move occurred here + // CHECK-NOTES-NOT: [[@LINE-1]]:25: warning: 'a' used after it was moved + // CHECK-NOTES-NOT: [[@LINE-3]]:5: note: move occurred here } const A a; std::move(a); passByConstReference(a); - // CHECK-NOTES: [[@LINE-1]]:24: warning: 'a' used after it was moved - // CHECK-NOTES: [[@LINE-3]]:3: note: move occurred here + // CHECK-NOTES-NOT: [[@LINE-1]]:24: warning: 'a' used after it was moved + // CHECK-NOTES-NOT: [[@LINE-3]]:3: note: move occurred here } // Clearing a standard container using clear() is treated as a