[clang-tools-extra] [clang-tidy][performance-move-const-arg] Fix crash when argument type has no definition (PR #111472)
Nicolas van Kempen via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 8 15:19:56 PDT 2024
https://github.com/nicovank updated https://github.com/llvm/llvm-project/pull/111472
>From 05519fa9c4a15c60759063e7a750b61a48abf956 Mon Sep 17 00:00:00 2001
From: Nicolas van Kempen <nvankemp at gmail.com>
Date: Tue, 8 Oct 2024 18:19:37 -0400
Subject: [PATCH] [clang-tidy][performance-move-const-arg] Fix crash when
argument type has no definition
Fix #111450.
When the argument type is forward-declared and there is no definition, `hasMoveConstructor` triggers the assert here:
https://github.com/llvm/llvm-project/blob/7f65377880ce6a0e5eaa4cb2591b86b8c8a24ee6/clang/include/clang/AST/DeclCXX.h#L465
https://github.com/llvm/llvm-project/blob/7f65377880ce6a0e5eaa4cb2591b86b8c8a24ee6/clang/include/clang/AST/DeclCXX.h#L864
Check `hasDefinition()` before `hasMoveConstructor()`.
---
.../clang-tidy/performance/MoveConstArgCheck.cpp | 5 +++--
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++
.../checkers/performance/move-const-arg.cpp | 14 ++++++++++++++
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
index d29b9e91f2e35d..421ce003975bc9 100644
--- a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
@@ -209,8 +209,9 @@ void MoveConstArgCheck::check(const MatchFinder::MatchResult &Result) {
}
if (const CXXRecordDecl *RecordDecl = ArgType->getAsCXXRecordDecl();
- RecordDecl && !(RecordDecl->hasMoveConstructor() &&
- RecordDecl->hasMoveAssignment())) {
+ RecordDecl && RecordDecl->hasDefinition() &&
+ !(RecordDecl->hasMoveConstructor() &&
+ RecordDecl->hasMoveAssignment())) {
const bool MissingMoveAssignment = !RecordDecl->hasMoveAssignment();
const bool MissingMoveConstructor = !RecordDecl->hasMoveConstructor();
const bool MissingBoth = MissingMoveAssignment && MissingMoveConstructor;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 3e051c7db6adcc..0dbbbecb65733a 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -208,6 +208,10 @@ Changes in existing checks
<clang-tidy/checks/performance/avoid-endl>` check to use ``std::endl`` as
placeholder when lexer cannot get source text.
+- Improved :doc:`performance-move-const-arg
+ <clang-tidy/checks/performance/move-const-arg>` check to fix a crash when
+ an argument type is declared but not defined.
+
- Improved :doc:`readability-container-contains
<clang-tidy/checks/readability/container-contains>` check to let it work on
any class that has a ``contains`` method.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
index 4505eef6df24bd..8e325b0ae6ca30 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
@@ -546,3 +546,17 @@ void testAlsoNonMoveable() {
}
} // namespace issue_62550
+
+namespace GH111450 {
+struct Status;
+
+struct Error {
+ Error(const Status& S);
+};
+
+struct Result {
+ Error E;
+ Result(Status&& S) : E(std::move(S)) {}
+ // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: passing result of std::move() as a const reference argument; no move will actually happen [performance-move-const-arg]
+};
+} // namespace GH111450
More information about the cfe-commits
mailing list