forked from OSchip/llvm-project
[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:
parent
17e9ea6138
commit
1b664460fa
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
^^^^^^^^^^^^^^
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue