blob: d1f2bea9ffbf6f9e736ca2977126b31256cea251 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
From 0d87de91457c3bf2338b997555694953d45e17a4 Mon Sep 17 00:00:00 2001
From: Alexander Lohnau <alexander.lohnau@gmx.de>
Date: Tue, 10 Sep 2024 13:50:56 +0200
Subject: [PATCH] rule-of-three: Fix destructor not being found and thus
causing false positive
This works fine in clang 14, but apparently not in later versions
The false positive caused a CI failure in https://invent.kde.org/libraries/qca/-/merge_requests/116
---
src/checks/level2/rule-of-three.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/checks/level2/rule-of-three.cpp b/src/checks/level2/rule-of-three.cpp
index 6996ee1e..f18ff999 100644
--- a/src/checks/level2/rule-of-three.cpp
+++ b/src/checks/level2/rule-of-three.cpp
@@ -56,7 +56,14 @@ void RuleOfThree::VisitDecl(clang::Decl *decl)
CXXConstructorDecl *copyCtor = Utils::copyCtor(record);
CXXMethodDecl *copyAssign = Utils::copyAssign(record);
- CXXDestructorDecl *destructor = record->getDestructor();
+ CXXDestructorDecl *destructor = nullptr;
+ // Getting the destructor using record->getDestructor() does not work for later clang versions, e.g. clang 16
+ for (auto *decl : record->decls()) {
+ if (auto *destructorDecl = dyn_cast<CXXDestructorDecl>(decl)) {
+ destructor = destructorDecl;
+ break;
+ }
+ }
const bool dtorDefaultedByUser = destructor && destructor->isDefaulted() && !destructor->isImplicit();
const bool hasUserCopyCtor = copyCtor && copyCtor->isUserProvided();
--
GitLab
|