diff options
| author | Jonas Toth <jonas.toth@gmail.com> | 2019-02-28 14:55:12 +0000 |
|---|---|---|
| committer | Jonas Toth <jonas.toth@gmail.com> | 2019-02-28 14:55:12 +0000 |
| commit | da666233fe7d1748b38ae0cea0b7be357e8b6a05 (patch) | |
| tree | 634650f19451872df59060457afc2102d8809818 | |
| parent | 2098b86b9658c0751ef00af779ab34cc7a56f01d (diff) | |
| download | bcm5719-llvm-da666233fe7d1748b38ae0cea0b7be357e8b6a05.tar.gz bcm5719-llvm-da666233fe7d1748b38ae0cea0b7be357e8b6a05.zip | |
[clang-tidy] added cppcoreguidelines-explicit-virtual-functions
Addresses the bugzilla bug #30397. (https://bugs.llvm.org/show_bug.cgi?id=30397)
modernize-use-override suggests that destructors require the override specifier
and the CPP core guidelines do not recommend this.
Patch by lewmpk.
Differential Revision: https://reviews.llvm.org/D58731
llvm-svn: 355093
7 files changed, 62 insertions, 3 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp index fdf2880b869..fc3a2ed3dcc 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp @@ -12,6 +12,7 @@ #include "../misc/NonPrivateMemberVariablesInClassesCheck.h" #include "../misc/UnconventionalAssignOperatorCheck.h" #include "../modernize/AvoidCArraysCheck.h" +#include "../modernize/UseOverrideCheck.h" #include "../readability/MagicNumbersCheck.h" #include "AvoidGotoCheck.h" #include "InterfacesGlobalInitCheck.h" @@ -46,6 +47,8 @@ public: "cppcoreguidelines-avoid-goto"); CheckFactories.registerCheck<readability::MagicNumbersCheck>( "cppcoreguidelines-avoid-magic-numbers"); + CheckFactories.registerCheck<modernize::UseOverrideCheck>( + "cppcoreguidelines-explicit-virtual-functions"); CheckFactories.registerCheck<InterfacesGlobalInitCheck>( "cppcoreguidelines-interfaces-global-init"); CheckFactories.registerCheck<MacroUsageCheck>( @@ -91,6 +94,9 @@ public: Opts["cppcoreguidelines-non-private-member-variables-in-classes." "IgnoreClassesWithAllMemberVariablesBeingPublic"] = "1"; + Opts["cppcoreguidelines-explicit-virtual-functions." + "IgnoreDestructors"] = "1"; + return Options; } }; diff --git a/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.cpp index 6b065955f35..cd7ed6c1074 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.cpp @@ -17,9 +17,20 @@ namespace clang { namespace tidy { namespace modernize { +void UseOverrideCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IgnoreDestructors", IgnoreDestructors); +} + void UseOverrideCheck::registerMatchers(MatchFinder *Finder) { // Only register the matcher for C++11. - if (getLangOpts().CPlusPlus11) + if (!getLangOpts().CPlusPlus11) + return; + + if (IgnoreDestructors) + Finder->addMatcher( + cxxMethodDecl(isOverride(), unless(cxxDestructorDecl())).bind("method"), + this); + else Finder->addMatcher(cxxMethodDecl(isOverride()).bind("method"), this); } diff --git a/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.h b/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.h index 0f316095a8e..dc6c91845d7 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseOverrideCheck.h @@ -19,9 +19,14 @@ namespace modernize { class UseOverrideCheck : public ClangTidyCheck { public: UseOverrideCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + : ClangTidyCheck(Name, Context), + IgnoreDestructors(Options.get("IgnoreDestructors", false)) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; + +private: + const bool IgnoreDestructors; }; } // namespace modernize diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 8d0c8f0a927..698997b57ef 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -98,6 +98,11 @@ Improvements to clang-tidy Checks whether there are underscores in googletest test and test case names in test macros, which is prohibited by the Googletest FAQ. +- New alias :doc:`cppcoreguidelines-explicit-virtual-functions + <clang-tidy/checks/cppcoreguidelines-explicit-virtual-functions>` to + :doc:`modernize-use-override + <clang-tidy/checks/modernize-use-override>` was added. + - The :doc:`bugprone-argument-comment <clang-tidy/checks/bugprone-argument-comment>` now supports `CommentBoolLiterals`, `CommentIntegerLiterals`, `CommentFloatLiterals`, diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-explicit-virtual-functions.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-explicit-virtual-functions.rst new file mode 100644 index 00000000000..1af48ffd8ce --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-explicit-virtual-functions.rst @@ -0,0 +1,10 @@ +.. title:: clang-tidy - cppcoreguidelines-explicit-virtual-functions +.. meta:: + :http-equiv=refresh: 5;URL=cppcoreguidelines-explicit-virtual-functions.html + +cppcoreguidelines-explicit-virtual-functions +============================================ + +The cppcoreguidelines-explicit-virtual-functions check is an alias, please see +`modernize-use-override <modernize-use-override.html>`_ +for more information. diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-override.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-override.rst index f2c778aaae1..54538b50685 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-override.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-override.rst @@ -3,5 +3,11 @@ modernize-use-override ====================== - Use C++11's ``override`` and remove ``virtual`` where applicable. + +Options +------- + +.. option:: IgnoreDestructors + + If set to non-zero, this check will not diagnose destructors. Default is `0`. diff --git a/clang-tools-extra/test/clang-tidy/modernize-use-override-no-destructors.cpp b/clang-tools-extra/test/clang-tidy/modernize-use-override-no-destructors.cpp new file mode 100644 index 00000000000..eaadb07b947 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/modernize-use-override-no-destructors.cpp @@ -0,0 +1,16 @@ +// RUN: %check_clang_tidy %s modernize-use-override %t -- \ +// RUN: -config="{CheckOptions: [{key: modernize-use-override.IgnoreDestructors, value: 1}]}" \ +// RUN: -- -std=c++11 + +struct Base { + virtual ~Base(); + virtual void f(); +}; + +struct Simple : public Base { + virtual ~Simple(); + // CHECK-MESSAGES-NOT: warning: + virtual void f(); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: prefer using + // CHECK-FIXES: {{^}} void f() override; +}; |

