On Fri, Dec 22, 2017 at 11:52 AM, Julie Hockett via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: juliehockett > Date: Fri Dec 22 08:52:25 2017 > New Revision: 321363 > > URL: http://llvm.org/viewvc/llvm-project?rev=321363&view=rev > Log: > [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 > > Added: > clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp > clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.h > > clang-tools-extra/trunk/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst > clang-tools-extra/trunk/test/clang-tidy/fuchsia-overloaded-operator.cpp > Modified: > clang-tools-extra/trunk/clang-tidy/fuchsia/CMakeLists.txt > clang-tools-extra/trunk/clang-tidy/fuchsia/FuchsiaTidyModule.cpp > clang-tools-extra/trunk/docs/ReleaseNotes.rst > clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > > Modified: clang-tools-extra/trunk/clang-tidy/fuchsia/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/fuchsia/CMakeLists.txt?rev=321363&r1=321362&r2=321363&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/fuchsia/CMakeLists.txt (original) > +++ clang-tools-extra/trunk/clang-tidy/fuchsia/CMakeLists.txt Fri Dec 22 > 08:52:25 2017 > @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS support) > add_clang_library(clangTidyFuchsiaModule > DefaultArgumentsCheck.cpp > FuchsiaTidyModule.cpp > + OverloadedOperatorCheck.cpp > VirtualInheritanceCheck.cpp > > LINK_LIBS > > Modified: clang-tools-extra/trunk/clang-tidy/fuchsia/FuchsiaTidyModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/fuchsia/FuchsiaTidyModule.cpp?rev=321363&r1=321362&r2=321363&view=diff > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/fuchsia/FuchsiaTidyModule.cpp > (original) > +++ clang-tools-extra/trunk/clang-tidy/fuchsia/FuchsiaTidyModule.cpp Fri Dec > 22 08:52:25 2017 > @@ -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<DefaultArgumentsCheck>( > "fuchsia-default-arguments"); > + CheckFactories.registerCheck<OverloadedOperatorCheck>( > + "fuchsia-overloaded-operator"); > CheckFactories.registerCheck<VirtualInheritanceCheck>( > "fuchsia-virtual-inheritance"); > } > > Added: clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp?rev=321363&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp > (added) > +++ clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.cpp > Fri Dec 22 08:52:25 2017 > @@ -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<CXXMethodDecl>(&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<FunctionDecl>("decl")) > + diag(D->getLocStart(), "cannot overload %0") << D; > +} > + > +} // namespace fuchsia > +} // namespace tidy > +} // namespace clang > > Added: clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.h?rev=321363&view=auto > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.h > (added) > +++ clang-tools-extra/trunk/clang-tidy/fuchsia/OverloadedOperatorCheck.h Fri > Dec 22 08:52:25 2017 > @@ -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 > > Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=321363&r1=321362&r2=321363&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) > +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Fri Dec 22 08:52:25 2017 > @@ -134,7 +134,12 @@ Improvements to clang-tidy > > <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-default-arguments.html>`_ > check > > Warns if a function or method is declared or called with default arguments. > - > + > +- New `fuchsia-overloaded-operator > + > <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-overloaded-operator.html>`_ > check > + > + Warns if an operator is overloaded, except for the assignment (copy and > move) operators. > + > - New `fuchsia-virtual-inheritance > > <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-virtual-inheritance.html>`_ > check > > > Added: > clang-tools-extra/trunk/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst?rev=321363&view=auto > ============================================================================== > --- > clang-tools-extra/trunk/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst > (added) > +++ > clang-tools-extra/trunk/docs/clang-tidy/checks/fuchsia-overloaded-operator.rst > Fri Dec 22 08:52:25 2017 > @@ -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 > > Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=321363&r1=321362&r2=321363&view=diff > ============================================================================== > --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) > +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Fri Dec 22 > 08:52:25 2017 > @@ -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 > > Added: clang-tools-extra/trunk/test/clang-tidy/fuchsia-overloaded-operator.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/fuchsia-overloaded-operator.cpp?rev=321363&view=auto > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/fuchsia-overloaded-operator.cpp > (added) > +++ clang-tools-extra/trunk/test/clang-tidy/fuchsia-overloaded-operator.cpp > Fri Dec 22 08:52:25 2017 > @@ -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);
The above still isn't formatted properly. ~Aaron > +// CHECK-MESSAGES: [[@LINE-1]]:1: warning: cannot overload 'operator-' > [fuchsia-overloaded-operator] > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits