brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 9ab6608 Raw
61 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "NoexceptSwapCheck.h"10#include "clang/ASTMatchers/ASTMatchFinder.h"11 12using namespace clang::ast_matchers;13 14// FixItHint - comment added to fix list.rst generation in add_new_check.py.15// Do not remove. Fixes are generated in base class.16 17namespace clang::tidy::performance {18 19void NoexceptSwapCheck::registerMatchers(MatchFinder *Finder) {20  // Match non-const method with single argument that is non-const reference to21  // a class type that owns method and return void.22  // Matches: void Class::swap(Class&)23  auto MethodMatcher = cxxMethodDecl(24      parameterCountIs(1U), unless(isConst()), returns(voidType()),25      hasParameter(0, hasType(qualType(hasCanonicalType(26                          qualType(unless(isConstQualified()),27                                   references(namedDecl().bind("class"))))))),28      ofClass(equalsBoundNode("class")));29 30  // Match function with 2 arguments, both are non-const references to same type31  // and return void.32  // Matches: void swap(Type&, Type&)33  auto FunctionMatcher = allOf(34      unless(cxxMethodDecl()), parameterCountIs(2U), returns(voidType()),35      hasParameter(36          0, hasType(qualType(hasCanonicalType(37                 qualType(unless(isConstQualified()), references(qualType()))38                     .bind("type"))))),39      hasParameter(1, hasType(qualType(hasCanonicalType(40                          qualType(equalsBoundNode("type")))))));41  Finder->addMatcher(functionDecl(unless(isDeleted()),42                                  hasAnyName("swap", "iter_swap"),43                                  anyOf(MethodMatcher, FunctionMatcher))44                         .bind(BindFuncDeclName),45                     this);46}47 48DiagnosticBuilder49NoexceptSwapCheck::reportMissingNoexcept(const FunctionDecl *FuncDecl) {50  return diag(FuncDecl->getLocation(), "swap functions should "51                                       "be marked noexcept");52}53 54void NoexceptSwapCheck::reportNoexceptEvaluatedToFalse(55    const FunctionDecl *FuncDecl, const Expr *NoexceptExpr) {56  diag(NoexceptExpr->getExprLoc(),57       "noexcept specifier on swap function evaluates to 'false'");58}59 60} // namespace clang::tidy::performance61