mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	Differential Revision: https://phabricator.services.mozilla.com/D10806 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#include "ArithmeticArgChecker.h"
 | 
						|
#include "CustomMatchers.h"
 | 
						|
 | 
						|
void ArithmeticArgChecker::registerMatchers(MatchFinder *AstMatcher) {
 | 
						|
  AstMatcher->addMatcher(
 | 
						|
      callExpr(allOf(hasDeclaration(noArithmeticExprInArgs()),
 | 
						|
                     anyOf(hasDescendant(
 | 
						|
                               binaryOperator(
 | 
						|
                                   allOf(binaryArithmeticOperator(),
 | 
						|
                                         hasLHS(hasDescendant(declRefExpr())),
 | 
						|
                                         hasRHS(hasDescendant(declRefExpr()))))
 | 
						|
                                   .bind("node")),
 | 
						|
                           hasDescendant(
 | 
						|
                               unaryOperator(
 | 
						|
                                   allOf(unaryArithmeticOperator(),
 | 
						|
                                         hasUnaryOperand(allOf(
 | 
						|
                                             hasType(builtinType()),
 | 
						|
                                             anyOf(hasDescendant(declRefExpr()),
 | 
						|
                                                   declRefExpr())))))
 | 
						|
                                   .bind("node")))))
 | 
						|
          .bind("call"),
 | 
						|
      this);
 | 
						|
  AstMatcher->addMatcher(
 | 
						|
      cxxConstructExpr(
 | 
						|
          allOf(hasDeclaration(noArithmeticExprInArgs()),
 | 
						|
                anyOf(hasDescendant(
 | 
						|
                          binaryOperator(
 | 
						|
                              allOf(binaryArithmeticOperator(),
 | 
						|
                                    hasLHS(hasDescendant(declRefExpr())),
 | 
						|
                                    hasRHS(hasDescendant(declRefExpr()))))
 | 
						|
                              .bind("node")),
 | 
						|
                      hasDescendant(
 | 
						|
                          unaryOperator(
 | 
						|
                              allOf(unaryArithmeticOperator(),
 | 
						|
                                    hasUnaryOperand(allOf(
 | 
						|
                                        hasType(builtinType()),
 | 
						|
                                        anyOf(hasDescendant(declRefExpr()),
 | 
						|
                                              declRefExpr())))))
 | 
						|
                              .bind("node")))))
 | 
						|
          .bind("call"),
 | 
						|
      this);
 | 
						|
}
 | 
						|
 | 
						|
void ArithmeticArgChecker::check(const MatchFinder::MatchResult &Result) {
 | 
						|
  const char *Error =
 | 
						|
      "cannot pass an arithmetic expression of built-in types to %0";
 | 
						|
  const Expr *Expression = Result.Nodes.getNodeAs<Expr>("node");
 | 
						|
  if (const CallExpr *Call = Result.Nodes.getNodeAs<CallExpr>("call")) {
 | 
						|
    diag(Expression->getBeginLoc(), Error, DiagnosticIDs::Error)
 | 
						|
        << Call->getDirectCallee();
 | 
						|
  } else if (const CXXConstructExpr *Ctr =
 | 
						|
                 Result.Nodes.getNodeAs<CXXConstructExpr>("call")) {
 | 
						|
    diag(Expression->getBeginLoc(), Error, DiagnosticIDs::Error)
 | 
						|
        << Ctr->getConstructor();
 | 
						|
  }
 | 
						|
}
 |