forked from OSchip/llvm-project
				
			[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
This commit is contained in:
		
							parent
							
								
									9c9b61df7e
								
							
						
					
					
						commit
						a966f45b7e
					
				| 
						 | 
					@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS support)
 | 
				
			||||||
add_clang_library(clangTidyFuchsiaModule
 | 
					add_clang_library(clangTidyFuchsiaModule
 | 
				
			||||||
  DefaultArgumentsCheck.cpp
 | 
					  DefaultArgumentsCheck.cpp
 | 
				
			||||||
  FuchsiaTidyModule.cpp
 | 
					  FuchsiaTidyModule.cpp
 | 
				
			||||||
 | 
					  OverloadedOperatorCheck.cpp
 | 
				
			||||||
  VirtualInheritanceCheck.cpp
 | 
					  VirtualInheritanceCheck.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LINK_LIBS
 | 
					  LINK_LIBS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@
 | 
				
			||||||
#include "../ClangTidyModule.h"
 | 
					#include "../ClangTidyModule.h"
 | 
				
			||||||
#include "../ClangTidyModuleRegistry.h"
 | 
					#include "../ClangTidyModuleRegistry.h"
 | 
				
			||||||
#include "DefaultArgumentsCheck.h"
 | 
					#include "DefaultArgumentsCheck.h"
 | 
				
			||||||
 | 
					#include "OverloadedOperatorCheck.h"
 | 
				
			||||||
#include "VirtualInheritanceCheck.h"
 | 
					#include "VirtualInheritanceCheck.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace clang::ast_matchers;
 | 
					using namespace clang::ast_matchers;
 | 
				
			||||||
| 
						 | 
					@ -25,6 +26,8 @@ public:
 | 
				
			||||||
  void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
 | 
					  void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
 | 
				
			||||||
    CheckFactories.registerCheck<DefaultArgumentsCheck>(
 | 
					    CheckFactories.registerCheck<DefaultArgumentsCheck>(
 | 
				
			||||||
        "fuchsia-default-arguments");
 | 
					        "fuchsia-default-arguments");
 | 
				
			||||||
 | 
					    CheckFactories.registerCheck<OverloadedOperatorCheck>(
 | 
				
			||||||
 | 
					        "fuchsia-overloaded-operator");
 | 
				
			||||||
    CheckFactories.registerCheck<VirtualInheritanceCheck>(
 | 
					    CheckFactories.registerCheck<VirtualInheritanceCheck>(
 | 
				
			||||||
        "fuchsia-virtual-inheritance");
 | 
					        "fuchsia-virtual-inheritance");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,12 @@ Improvements to clang-tidy
 | 
				
			||||||
  <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-default-arguments.html>`_ check
 | 
					  <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.
 | 
					  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
 | 
					- New `fuchsia-virtual-inheritance
 | 
				
			||||||
  <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-virtual-inheritance.html>`_ check
 | 
					  <http://clang.llvm.org/extra/clang-tidy/checks/fuchsia-virtual-inheritance.html>`_ check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					@ -69,6 +69,7 @@ Clang-Tidy Checks
 | 
				
			||||||
   cppcoreguidelines-slicing
 | 
					   cppcoreguidelines-slicing
 | 
				
			||||||
   cppcoreguidelines-special-member-functions
 | 
					   cppcoreguidelines-special-member-functions
 | 
				
			||||||
   fuchsia-default-arguments
 | 
					   fuchsia-default-arguments
 | 
				
			||||||
 | 
					   fuchsia-overloaded-operator
 | 
				
			||||||
   fuchsia-virtual-inheritance
 | 
					   fuchsia-virtual-inheritance
 | 
				
			||||||
   google-build-explicit-make-pair
 | 
					   google-build-explicit-make-pair
 | 
				
			||||||
   google-build-namespaces
 | 
					   google-build-namespaces
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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]
 | 
				
			||||||
		Loading…
	
		Reference in New Issue