Skip to content

Commit

Permalink
[clang-tidy] bugprone-use-after-move: Don't warn on self-moves.
Browse files Browse the repository at this point in the history
Reviewed By: sammccall, njames93

Differential Revision: https://reviews.llvm.org/D126853
  • Loading branch information
martinboehme committed Jun 7, 2022
1 parent 17e9ea6 commit 1b66446
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 7 deletions.
5 changes: 4 additions & 1 deletion clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp
Expand Up @@ -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) {
Expand Down
14 changes: 8 additions & 6 deletions clang-tools-extra/docs/ReleaseNotes.rst
Expand Up @@ -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.

- 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.
template has an unnecessary value parameter. Removed the fix for a template.

- 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
^^^^^^^^^^^^^^
Expand Down
Expand Up @@ -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;
Expand Down

0 comments on commit 1b66446

Please sign in to comment.