Index: clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp =================================================================== --- clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp +++ clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp @@ -10,6 +10,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "../misc/AssignOperatorSignatureCheck.h" #include "ProTypeConstCastCheck.h" #include "ProTypeReinterpretCastCheck.h" @@ -24,6 +25,8 @@ "cppcoreguidelines-pro-type-const-cast"); CheckFactories.registerCheck( "cppcoreguidelines-pro-type-reinterpret-cast"); + CheckFactories.registerCheck( + "cppcoreguidelines-c-copy-assignment-signature"); } }; Index: clang-tidy/misc/AssignOperatorSignatureCheck.cpp =================================================================== --- clang-tidy/misc/AssignOperatorSignatureCheck.cpp +++ clang-tidy/misc/AssignOperatorSignatureCheck.cpp @@ -51,11 +51,11 @@ .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("method"); @@ -64,12 +64,13 @@ 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(Message[0])) - diag(Method->getLocStart(), Message[1]) << Name; + diag(Method->getLocStart(), Message[1]) + << Name << (Method->isConst() ? "const" : "virtual"); } } Index: test/clang-tidy/misc-assign-operator-signature.cpp =================================================================== --- test/clang-tidy/misc-assign-operator-signature.cpp +++ test/clang-tidy/misc-assign-operator-signature.cpp @@ -49,3 +49,8 @@ // 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' +};