aboutsummaryrefslogtreecommitdiffstats
path: root/src/checks/level2/copyable-polymorphic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/checks/level2/copyable-polymorphic.cpp')
-rw-r--r--src/checks/level2/copyable-polymorphic.cpp23
1 files changed, 9 insertions, 14 deletions
diff --git a/src/checks/level2/copyable-polymorphic.cpp b/src/checks/level2/copyable-polymorphic.cpp
index df5246c2..cf835d18 100644
--- a/src/checks/level2/copyable-polymorphic.cpp
+++ b/src/checks/level2/copyable-polymorphic.cpp
@@ -21,7 +21,6 @@
#include "copyable-polymorphic.h"
#include "Utils.h"
-#include "checkmanager.h"
#include "StringUtils.h"
#include <clang/AST/AST.h>
@@ -38,22 +37,18 @@ CopyablePolymorphic::CopyablePolymorphic(const std::string &name, ClazyContext *
void CopyablePolymorphic::VisitDecl(clang::Decl *decl)
{
- CXXRecordDecl *record = dyn_cast<CXXRecordDecl>(decl);
+ auto record = dyn_cast<CXXRecordDecl>(decl);
if (!record || !record->hasDefinition() || record->getDefinition() != record || !record->isPolymorphic())
return;
CXXConstructorDecl *copyCtor = Utils::copyCtor(record);
- CXXMethodDecl *copyAssign = Utils::copyAssign(record);
-
const bool hasCallableCopyCtor = copyCtor && !copyCtor->isDeleted() && copyCtor->getAccess() != clang::AS_private;
- const bool hasCallableCopyAssign = copyAssign && !copyAssign->isDeleted() && copyAssign->getAccess() != clang::AS_private;
-
- if (!hasCallableCopyCtor && !hasCallableCopyAssign)
- return;
-
-
- emitWarning(record->getLocStart(), "Polymorphic class is copyable. Potential slicing.");
+ if (!hasCallableCopyCtor) {
+ CXXMethodDecl *copyAssign = Utils::copyAssign(record);
+ const bool hasCallableCopyAssign = copyAssign && !copyAssign->isDeleted() && copyAssign->getAccess() != clang::AS_private;
+ if (!hasCallableCopyAssign)
+ return;
+ }
+
+ emitWarning(getLocStart(record), "Polymorphic class " + record->getQualifiedNameAsString() + " is copyable. Potential slicing.");
}
-
-
-REGISTER_CHECK("copyable-polymorphic", CopyablePolymorphic, CheckLevel2)