================
@@ -134,6 +134,17 @@ makeReinitMatcher(const ValueDecl *MovedVariable,
                  // built-in types.
                  binaryOperation(hasOperatorName("="),
                                  
hasLHS(ignoringParenImpCasts(DeclRefMatcher))),
+                 // std::tie() assignment: std::tie(a, b) = expr reinitializes
+                 // all variables passed to std::tie because the tuple
+                 // assignment writes back through the stored references.
+                 // ignoringImplicit strips the MaterializeTemporaryExpr that
+                 // Clang inserts when calling operator= on the prvalue tuple.
+                 binaryOperation(
+                     hasOperatorName("="),
+                     hasLHS(ignoringImplicit(
----------------
zeyi2 wrote:

I found that this case still gives a false-positive:

```cpp
void parenthesizedStdTieInLoop() {
  std::string a, b;
  while (true) {
    (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
    (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
  }
}
```

```
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:49: 
warning: 'a' used after it was moved [bugprone-use-after-move]
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                 ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1886:39: 
note: move occurred here
 1886 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                       ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:49: 
note: the use happens in a later loop iteration than the move
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                 ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:63: 
warning: 'b' used after it was moved [bugprone-use-after-move]
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                               ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1886:53: 
note: move occurred here
 1886 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                     ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:63: 
note: the use happens in a later loop iteration than the move
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                               ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1886:49: 
warning: 'a' used after it was moved [bugprone-use-after-move]
 1886 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                 ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:39: 
note: move occurred here
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                       ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1886:63: 
warning: 'b' used after it was moved [bugprone-use-after-move]
 1886 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                               ^
clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp:1885:53: 
note: move occurred here
 1885 |     (std::tie(a, b)) = makeStringPair(std::move(a), std::move(b));
      |                                                     ^
```

-----

Could we do an `ignoringParenImpCasts` again? Similar to:

```cpp
binaryOperation(
    hasOperatorName("="),
    hasLHS(ignoringImplicit(ignoringParenImpCasts(
        callExpr(callee(functionDecl(hasName("::std::tie"))),
                 hasAnyArgument(ignoringParenImpCasts(DeclRefMatcher))))))),
```

https://github.com/llvm/llvm-project/pull/192895
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to