From a966f45b7ee6a9c77a7040b51a18c01caac90918 Mon Sep 17 00:00:00 2001 From: Julie Hockett Date: Fri, 22 Dec 2017 16:52:25 +0000 Subject: [PATCH] [clang-tidy] Adding Fuchsia checker for overloaded operators Adds a check to the Fuchsia module to warn if an operator is overloaded, except move and copy operators. See https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md for reference. Differential Revision: https://reviews.llvm.org/D41363 llvm-svn: 321363 --- .../clang-tidy/fuchsia/CMakeLists.txt | 1 + .../clang-tidy/fuchsia/FuchsiaTidyModule.cpp | 3 ++ .../fuchsia/OverloadedOperatorCheck.cpp | 39 +++++++++++++++++++ .../fuchsia/OverloadedOperatorCheck.h | 35 +++++++++++++++++ clang-tools-extra/docs/ReleaseNotes.rst | 7 +++- .../checks/fuchsia-overloaded-operator.rst | 18 +++++++++ .../docs/clang-tidy/checks/list.rst | 1 + .../fuchsia-overloaded-operator.cpp | 18 +++++++++ 8 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp create mode 100644 clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.h create mode 100644 clang-tools-extra/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst create mode 100644 clang-tools-extra/test/clang-tidy/fuchsia-overloaded-operator.cpp diff --git a/clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt b/clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt index 692a367749e6..3b223ba71f07 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/fuchsia/CMakeLists.txt @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS support) add_clang_library(clangTidyFuchsiaModule DefaultArgumentsCheck.cpp FuchsiaTidyModule.cpp + OverloadedOperatorCheck.cpp VirtualInheritanceCheck.cpp LINK_LIBS diff --git a/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp b/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp index 5ed834d956db..1860115ab5a2 100644 --- a/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/fuchsia/FuchsiaTidyModule.cpp @@ -11,6 +11,7 @@ #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" #include "DefaultArgumentsCheck.h" +#include "OverloadedOperatorCheck.h" #include "VirtualInheritanceCheck.h" using namespace clang::ast_matchers; @@ -25,6 +26,8 @@ public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { CheckFactories.registerCheck( "fuchsia-default-arguments"); + CheckFactories.registerCheck( + "fuchsia-overloaded-operator"); CheckFactories.registerCheck( "fuchsia-virtual-inheritance"); } diff --git a/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp b/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp new file mode 100644 index 000000000000..57b4628c5b97 --- /dev/null +++ b/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp @@ -0,0 +1,39 @@ +//===--- OverloadedOperatorCheck.cpp - clang-tidy--------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "OverloadedOperatorCheck.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace fuchsia { + +AST_MATCHER(FunctionDecl, isFuchsiaOverloadedOperator) { + if (const auto *CXXMethodNode = dyn_cast(&Node)) { + if (CXXMethodNode->isCopyAssignmentOperator() || + CXXMethodNode->isMoveAssignmentOperator()) + return false; + } + return Node.isOverloadedOperator(); +} + +void OverloadedOperatorCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher(functionDecl(isFuchsiaOverloadedOperator()).bind("decl"), + this); +} + +void OverloadedOperatorCheck::check(const MatchFinder::MatchResult &Result) { + if (const auto *D = Result.Nodes.getNodeAs("decl")) + diag(D->getLocStart(), "cannot overload %0") << D; +} + +} // namespace fuchsia +} // namespace tidy +} // namespace clang diff --git a/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.h b/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.h new file mode 100644 index 000000000000..a22e5ae5cc73 --- /dev/null +++ b/clang-tools-extra/clang-tidy/fuchsia/OverloadedOperatorCheck.h @@ -0,0 +1,35 @@ +//===--- OverloadedOperatorCheck.h - clang-tidy------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_OVERLOADED_OPERATOR_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_OVERLOADED_OPERATOR_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace fuchsia { + +/// Overloading operators is disallowed by the Fuchsia coding standard. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-overloaded-operator.html +class OverloadedOperatorCheck : public ClangTidyCheck { +public: + OverloadedOperatorCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace fuchsia +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FUCHSIA_OVERLOADED_OPERATOR_H diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c438c8d62865..2a93f5553244 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -134,7 +134,12 @@ Improvements to clang-tidy `_ check Warns if a function or method is declared or called with default arguments. - + +- New `fuchsia-overloaded-operator + `_ check + + Warns if an operator is overloaded, except for the assignment (copy and move) operators. + - New `fuchsia-virtual-inheritance `_ check diff --git a/clang-tools-extra/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst b/clang-tools-extra/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst new file mode 100644 index 000000000000..070780f48db2 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst @@ -0,0 +1,18 @@ +.. title:: clang-tidy - fuchsia-overloaded-operator + +fuchsia-overloaded-operator +=========================== + +Warns if an operator is overloaded, except for the assignment (copy and move) +operators. + +For example: + +.. code-block:: c++ + + int operator+(int); // Warning + + B &operator=(const B &Other); // No warning + B &operator=(B &&Other) // No warning + +See the features disallowed in Fuchsia at https://fuchsia.googlesource.com/zircon/+/master/docs/cxx.md diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index e3b0c36c676f..c495f542c0a9 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -69,6 +69,7 @@ Clang-Tidy Checks cppcoreguidelines-slicing cppcoreguidelines-special-member-functions fuchsia-default-arguments + fuchsia-overloaded-operator fuchsia-virtual-inheritance google-build-explicit-make-pair google-build-namespaces diff --git a/clang-tools-extra/test/clang-tidy/fuchsia-overloaded-operator.cpp b/clang-tools-extra/test/clang-tidy/fuchsia-overloaded-operator.cpp new file mode 100644 index 000000000000..5c65c5bfa11b --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/fuchsia-overloaded-operator.cpp @@ -0,0 +1,18 @@ +// RUN: %check_clang_tidy %s fuchsia-overloaded-operator %t + +class A { +public: + int operator+(int); + // CHECK-MESSAGES: [[@LINE-1]]:3: warning: cannot overload 'operator+' [fuchsia-overloaded-operator] +}; + +class B { +public: + B &operator=(const B &Other); + // CHECK-MESSAGES-NOT: [[@LINE-1]]:3: warning: cannot overload 'operator=' [fuchsia-overloaded-operator] + B &operator=(B &&Other); + // CHECK-MESSAGES-NOT: [[@LINE-1]]:3: warning: cannot overload 'operator=' [fuchsia-overloaded-operator] +}; + +A operator-(const A& AA, const A& BB); +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: cannot overload 'operator-' [fuchsia-overloaded-operator]