[clang-tidy] `bugprone-use-after-move`: Don't warn on self-moves.

Reviewed By: sammccall, njames93

Differential Revision: https://reviews.llvm.org/D126853
This commit is contained in:
Martin Boehme 2022-06-07 11:00:24 +02:00
parent 17e9ea6138
commit 1b664460fa
3 changed files with 18 additions and 6 deletions

View File

@ -158,9 +158,12 @@ bool UseAfterMoveFinder::findInternal(const CFGBlock *Block,
// Ignore all reinitializations where the move potentially comes after the
// reinit.
// If `Reinit` is identical to `MovingCall`, we're looking at a move-to-self
// (e.g. `a = std::move(a)`). Count these as reinitializations.
llvm::SmallVector<const Stmt *, 1> ReinitsToDelete;
for (const Stmt *Reinit : Reinits) {
if (MovingCall && Sequence->potentiallyAfter(MovingCall, Reinit))
if (MovingCall && Reinit != MovingCall &&
Sequence->potentiallyAfter(MovingCall, Reinit))
ReinitsToDelete.push_back(Reinit);
}
for (const Stmt *Reinit : ReinitsToDelete) {

View File

@ -207,12 +207,14 @@ Changes in existing checks
- Fixed a crash in :doc:`performance-unnecessary-value-param
<clang-tidy/checks/readability-suspicious-call-argument>` when the specialization
template has an unnecessary value paramter. Removed the fix for a template.
template has an unnecessary value parameter. Removed the fix for a template.
- Fixed a bug in :doc:`bugprone-use-after-move
<clang-tidy/checks/bugprone-use-after-move>` where a move in a lambda capture
was treated as if it happened within the body of the lambda, not within the
function that defines the lambda.
- Fixed bugs in :doc:`bugprone-use-after-move
<clang-tidy/checks/bugprone-use-after-move>`:
- Treat a move in a lambda capture as happening in the function that defines
the lambda, not within the body of the lambda (as we were previously doing
erroneously).
- Don't emit an erroneous warning on self-moves.
Removed checks
^^^^^^^^^^^^^^

View File

@ -152,6 +152,13 @@ void simple() {
// CHECK-NOTES: [[@LINE-3]]:15: note: move occurred here
}
// Don't flag a move-to-self.
void selfMove() {
A a;
a = std::move(a);
a.foo();
}
// A warning should only be emitted for one use-after-move.
void onlyFlagOneUseAfterMove() {
A a;