diff --git a/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.cpp b/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.cpp --- a/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ConstReturnTypeCheck.cpp @@ -114,7 +114,9 @@ Finder->addMatcher( functionDecl( returns(allOf(isConstQualified(), unless(NonLocalConstType))), - anyOf(isDefinition(), cxxMethodDecl(isPure()))) + anyOf(isDefinition(), cxxMethodDecl(isPure())), + // Overridden functions are not actionable. + unless(cxxMethodDecl(isOverride()))) .bind("func"), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -171,6 +171,11 @@ :doc:`readability-simplify-boolean-expr ` when using a C++23 ``if consteval`` statement. +- Change the behavior of :doc:`readability-const-return-type + ` to not + warn about `const` return types in overridden functions since the derived + class cannot always choose to change the function signature. + - Improved :doc:`misc-redundant-expression ` check. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/const-return-type.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/const-return-type.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/readability/const-return-type.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/const-return-type.cpp @@ -279,13 +279,22 @@ // CHECK-NOT-FIXES: virtual int getC() = 0; }; -class PVDerive : public PVBase { +class NVDerive : public PVBase { public: - const int getC() { return 1; } - // CHECK-MESSAGES: [[@LINE-1]]:3: warning: return type 'const int' is 'const'-qualified at the top level, which may reduce code readability without improving const correctness - // CHECK-NOT-FIXES: int getC() { return 1; } + // Don't warn about overridden methods, because it may be impossible to make + // them non-const as the user may not be able to change the base class. + const int getC() override { return 1; } }; +class NVDeriveOutOfLine : public PVBase { +public: + // Don't warn about overridden methods, because it may be impossible to make + // them non-const as one may not be able to change the base class + const int getC(); +}; + +const int NVDeriveOutOfLine::getC() { return 1; } + // Don't warn about const auto types, because it may be impossible to make them non-const // without a significant semantics change. Since `auto` drops cv-qualifiers, // tests check `decltype(auto)`.