[clang-tools-extra] [clang-tidy] Fix false positive in bugprone-use-after-move with std::forward on derived classes (PR #199905)

Baranov Victor via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 1 06:34:30 PDT 2026


================
@@ -641,6 +641,14 @@ void UseAfterMoveCheck::check(const MatchFinder::MatchResult &Result) {
   const CXXRecordDecl *MovedAs =
       ParentCast ? ParentCast->getType()->getAsCXXRecordDecl() : nullptr;
 
+  if (!MovedAs && CallMove && CallMove->getNumArgs() > 0) {
+    if (const auto *ArgCast =
+            dyn_cast<ImplicitCastExpr>(CallMove->getArg(0)->IgnoreParens())) {
+      if (ArgCast->getCastKind() == CK_DerivedToBase)
+        MovedAs = ArgCast->getType()->getAsCXXRecordDecl();
+    }
+  }
----------------
vbvictor wrote:

Instead of `if`'s here I think we can directly match this patter in matchers, something like:

```cpp
// this part already exist
optionally(anyOf(                                                                                                     
      hasParent(implicitCastExpr(hasCastKind(CK_DerivedToBase))                                                       
                    .bind("optional-cast")),                                                                            
      traverse(TK_AsIs, // maybe this traverse call is not needed, please check                                                                                                 
               hasArgument(0, implicitCastExpr(hasCastKind(CK_DerivedToBase))
                                  .bind("optional-cast")))))
```

So we won't need any new code in `check()` here

https://github.com/llvm/llvm-project/pull/199905


More information about the cfe-commits mailing list