Author: Baranov Victor Date: 2026-01-27T12:52:44+03:00 New Revision: 13c293486603d9c2e03888866a60df7d42f8e068
URL: https://github.com/llvm/llvm-project/commit/13c293486603d9c2e03888866a60df7d42f8e068 DIFF: https://github.com/llvm/llvm-project/commit/13c293486603d9c2e03888866a60df7d42f8e068.diff LOG: [clang-tidy] Add invalidation function name to bugprone-use-after-move (#178042) Make clearer messages because of reports https://github.com/llvm/llvm-project/pull/170346#issuecomment-3798583117. --------- Co-authored-by: EugeneZelenko <[email protected]> Added: Modified: clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp index a31dd1e5dbdcd..7dc648f8ed405 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UseAfterMoveCheck.cpp @@ -436,13 +436,15 @@ static MoveType determineMoveType(const FunctionDecl *FuncDecl) { static void emitDiagnostic(const Expr *MovingCall, const DeclRefExpr *MoveArg, const UseAfterMove &Use, ClangTidyCheck *Check, - ASTContext *Context, MoveType Type) { + ASTContext *Context, MoveType Type, + const FunctionDecl *MoveDecl) { const SourceLocation UseLoc = Use.DeclRef->getExprLoc(); const SourceLocation MoveLoc = MovingCall->getExprLoc(); - Check->diag(UseLoc, - "'%0' used after it was %select{forwarded|moved|invalidated}1") - << MoveArg->getDecl()->getName() << Type; + Check->diag( + UseLoc, + "'%0' used after it was %select{forwarded|moved|invalidated by %2}1") + << MoveArg->getDecl()->getName() << Type << MoveDecl; Check->diag(MoveLoc, "%select{forward|move|invalidation}0 occurred here", DiagnosticIDs::Note) << Type; @@ -573,7 +575,7 @@ void UseAfterMoveCheck::check(const MatchFinder::MatchResult &Result) { ReinitializationFunctions); if (auto Use = Finder.find(CodeBlock, MovingCall, Arg)) emitDiagnostic(MovingCall, Arg, *Use, this, Result.Context, - determineMoveType(MoveDecl)); + determineMoveType(MoveDecl), MoveDecl); } } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 7f55341e2995b..1a056890e66c3 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -131,6 +131,11 @@ Changes in existing checks ``std::get_temporary_buffer`` to the default list of unsafe functions. (This function is unsafe, useless, deprecated in C++17 and removed in C++20). +- Improved :doc:`bugprone-use-after-move + <clang-tidy/checks/bugprone/use-after-move>` check by including the name of + the invalidating function in the warning message when a custom invalidation + function is used (via the `InvalidationFunctions` option). + - Improved :doc:`llvm-use-ranges <clang-tidy/checks/llvm/use-ranges>` check by adding support for the following algorithms: ``std::accumulate``, ``std::replace_copy``, and diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp index da818a90514f6..0f1678cff35a7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/use-after-move.cpp @@ -1,12 +1,12 @@ // RUN: %check_clang_tidy -std=c++11 -check-suffixes=,CXX11 %s bugprone-use-after-move %t -- \ // RUN: -config='{CheckOptions: { \ -// RUN: bugprone-use-after-move.InvalidationFunctions: "::Database<>::StaticCloseConnection;Database<>::CloseConnection;FriendCloseConnection", \ +// RUN: bugprone-use-after-move.InvalidationFunctions: "::Database<>::StaticCloseConnection;Database<>::CloseConnection;FriendCloseConnection;FreeCloseConnection", \ // RUN: bugprone-use-after-move.ReinitializationFunctions: "::Database<>::Reset;::Database<>::StaticReset;::FriendReset;::RegularReset" \ // RUN: }}' -- \ // RUN: -fno-delayed-template-parsing // RUN: %check_clang_tidy -std=c++17-or-later %s bugprone-use-after-move %t -- \ // RUN: -config='{CheckOptions: { \ -// RUN: bugprone-use-after-move.InvalidationFunctions: "::Database<>::StaticCloseConnection;Database<>::CloseConnection;FriendCloseConnection", \ +// RUN: bugprone-use-after-move.InvalidationFunctions: "::Database<>::StaticCloseConnection;Database<>::CloseConnection;FriendCloseConnection;FreeCloseConnection", \ // RUN: bugprone-use-after-move.ReinitializationFunctions: "::Database<>::Reset;::Database<>::StaticReset;::FriendReset;::RegularReset" \ // RUN: }}' -- \ // RUN: -fno-delayed-template-parsing @@ -1670,37 +1670,45 @@ struct Database { void Query(); }; +void FreeCloseConnection(Database<int>&) {} + void Run() { using DB = Database<>; DB db1; db1.CloseConnection(); db1.Query(); - // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db1' used after it was invalidated + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db1' used after it was invalidated by 'CloseConnection<>' // CHECK-NOTES: [[@LINE-3]]:7: note: invalidation occurred here DB db2; DB::StaticCloseConnection(db2); db2.Query(); - // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db2' used after it was invalidated + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db2' used after it was invalidated by 'StaticCloseConnection<>' // CHECK-NOTES: [[@LINE-3]]:3: note: invalidation occurred here DB db3; DB().StaticCloseConnection(db3); db3.Query(); - // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db3' used after it was invalidated + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db3' used after it was invalidated by 'StaticCloseConnection<>' // CHECK-NOTES: [[@LINE-3]]:3: note: invalidation occurred here DB db4; FriendCloseConnection(db4); db4.Query(); - // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db4' used after it was invalidated + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db4' used after it was invalidated by 'FriendCloseConnection<>' // CHECK-NOTES: [[@LINE-3]]:3: note: invalidation occurred here DB db5; FriendCloseConnection(db5, /*disconnect timeout*/ 5); db5.Query(); - // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db5' used after it was invalidated + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db5' used after it was invalidated by 'FriendCloseConnection<>' + // CHECK-NOTES: [[@LINE-3]]:3: note: invalidation occurred here + + DB db6; + FreeCloseConnection(db6); + db6.Query(); + // CHECK-NOTES: [[@LINE-1]]:3: warning: 'db6' used after it was invalidated by 'FreeCloseConnection' // CHECK-NOTES: [[@LINE-3]]:3: note: invalidation occurred here } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
