reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
//===--- PreferRegisterOverUnsignedCheck.cpp - clang-tidy -----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "PreferRegisterOverUnsignedCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" using namespace clang::ast_matchers; namespace clang { namespace tidy { namespace llvm_check { void PreferRegisterOverUnsignedCheck::registerMatchers(MatchFinder *Finder) { auto RegisterClassMatch = hasType( cxxRecordDecl(hasName("::llvm::Register")).bind("registerClassDecl")); Finder->addMatcher( valueDecl(allOf( hasType(qualType(isUnsignedInteger()).bind("varType")), varDecl(hasInitializer(exprWithCleanups(has(implicitCastExpr(has( cxxMemberCallExpr(allOf(on(RegisterClassMatch), has(memberExpr(hasDeclaration( cxxConversionDecl()))))))))))) .bind("var"))), this); } void PreferRegisterOverUnsignedCheck::check( const MatchFinder::MatchResult &Result) { const auto *VarType = Result.Nodes.getNodeAs<QualType>("varType"); const auto *UserVarDecl = Result.Nodes.getNodeAs<VarDecl>("var"); StringRef Replacement = "llvm::Register"; const DeclContext *Context = UserVarDecl->getDeclContext(); while (Context) { if (const auto *Namespace = dyn_cast<NamespaceDecl>(Context)) if (isa<TranslationUnitDecl>(Namespace->getDeclContext()) && Namespace->getName() == "llvm") Replacement = "Register"; for (const auto *UsingDirective : Context->using_directives()) { const NamespaceDecl *Namespace = UsingDirective->getNominatedNamespace(); if (isa<TranslationUnitDecl>(Namespace->getDeclContext()) && Namespace->getName() == "llvm") Replacement = "Register"; } Context = Context->getParent(); } diag(UserVarDecl->getLocation(), "variable %0 declared as %1; use '%2' instead") << UserVarDecl << *VarType << Replacement << FixItHint::CreateReplacement( UserVarDecl->getTypeSourceInfo()->getTypeLoc().getSourceRange(), Replacement); } } // namespace llvm_check } // namespace tidy } // namespace clang