summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp3
-rw-r--r--clang-tools-extra/clang-tidy/misc/AssignOperatorSignatureCheck.cpp13
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-assign-operator-signature.cpp5
3 files changed, 15 insertions, 6 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
index 07ba15a8b4a..b26bbcf6ead 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp
@@ -10,6 +10,7 @@
#include "../ClangTidy.h"
#include "../ClangTidyModule.h"
#include "../ClangTidyModuleRegistry.h"
+#include "../misc/AssignOperatorSignatureCheck.h"
#include "ProBoundsPointerArithmeticCheck.h"
#include "ProTypeConstCastCheck.h"
#include "ProTypeReinterpretCastCheck.h"
@@ -31,6 +32,8 @@ public:
"cppcoreguidelines-pro-type-reinterpret-cast");
CheckFactories.registerCheck<ProTypeStaticCastDowncastCheck>(
"cppcoreguidelines-pro-type-static-cast-downcast");
+ CheckFactories.registerCheck<misc::AssignOperatorSignatureCheck>(
+ "cppcoreguidelines-c-copy-assignment-signature");
}
};
diff --git a/clang-tools-extra/clang-tidy/misc/AssignOperatorSignatureCheck.cpp b/clang-tools-extra/clang-tidy/misc/AssignOperatorSignatureCheck.cpp
index a1ecfbd9d3c..267848a9bdd 100644
--- a/clang-tools-extra/clang-tidy/misc/AssignOperatorSignatureCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/AssignOperatorSignatureCheck.cpp
@@ -51,11 +51,11 @@ void AssignOperatorSignatureCheck::registerMatchers(
.bind("ArgumentType"),
this);
- Finder->addMatcher(cxxMethodDecl(IsSelfAssign, isConst()).bind("Const"),
- this);
+ Finder->addMatcher(
+ cxxMethodDecl(IsSelfAssign, anyOf(isConst(), isVirtual())).bind("cv"),
+ this);
}
-
void AssignOperatorSignatureCheck::check(
const MatchFinder::MatchResult &Result) {
const auto* Method = Result.Nodes.getNodeAs<CXXMethodDecl>("method");
@@ -64,12 +64,13 @@ void AssignOperatorSignatureCheck::check(
static const char *Messages[][2] = {
{"ReturnType", "operator=() should return '%0&'"},
{"ArgumentType", "operator=() should take '%0 const&', '%0&&' or '%0'"},
- {"Const", "operator=() should not be marked 'const'"},
+ {"cv", "operator=() should not be marked '%1'"}
};
- for (const auto& Message : Messages) {
+ for (const auto &Message : Messages) {
if (Result.Nodes.getNodeAs<Decl>(Message[0]))
- diag(Method->getLocStart(), Message[1]) << Name;
+ diag(Method->getLocStart(), Message[1])
+ << Name << (Method->isConst() ? "const" : "virtual");
}
}
diff --git a/clang-tools-extra/test/clang-tidy/misc-assign-operator-signature.cpp b/clang-tools-extra/test/clang-tidy/misc-assign-operator-signature.cpp
index 6d8f98fefd1..c0dacc7cf52 100644
--- a/clang-tools-extra/test/clang-tidy/misc-assign-operator-signature.cpp
+++ b/clang-tools-extra/test/clang-tidy/misc-assign-operator-signature.cpp
@@ -49,3 +49,8 @@ class Private {
// Pre-C++11 way of disabling assignment.
void operator=(const Private &);
};
+
+struct Virtual {
+ virtual Virtual& operator=(const Virtual &);
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: operator=() should not be marked 'virtual'
+};
OpenPOWER on IntegriCloud