diff options
Diffstat (limited to 'src/checks/level2/copyable-polymorphic.cpp')
-rw-r--r-- | src/checks/level2/copyable-polymorphic.cpp | 23 |
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) |