1 //===--- AvoidConstOrRefDataMembersCheck.cpp - clang-tidy -----------------===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "AvoidConstOrRefDataMembersCheck.h" 10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 12 13 using namespace clang::ast_matchers; 14 15 namespace clang::tidy::cppcoreguidelines { 16 namespace { 17 18 AST_MATCHER(FieldDecl, isMemberOfLambda) { 19 return Node.getParent()->isLambda(); 20 } 21 22 } // namespace 23 24 void AvoidConstOrRefDataMembersCheck::registerMatchers(MatchFinder *Finder) { 25 Finder->addMatcher(fieldDecl(unless(isMemberOfLambda()), 26 hasType(hasCanonicalType(referenceType()))) 27 .bind("ref"), 28 this); 29 Finder->addMatcher(fieldDecl(unless(isMemberOfLambda()), 30 hasType(qualType(isConstQualified()))) 31 .bind("const"), 32 this); 33 } 34 35 void AvoidConstOrRefDataMembersCheck::check( 36 const MatchFinder::MatchResult &Result) { 37 if (const auto *MatchedDecl = Result.Nodes.getNodeAs<FieldDecl>("ref")) 38 diag(MatchedDecl->getLocation(), "member %0 of type %1 is a reference") 39 << MatchedDecl << MatchedDecl->getType(); 40 if (const auto *MatchedDecl = Result.Nodes.getNodeAs<FieldDecl>("const")) 41 diag(MatchedDecl->getLocation(), "member %0 of type %1 is const qualified") 42 << MatchedDecl << MatchedDecl->getType(); 43 } 44 45 } // namespace clang::tidy::cppcoreguidelines 46