1 //===--- NonConstParameterCheck.h - clang-tidy-------------------*- C++ -*-===// 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 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_NON_CONST_PARAMETER_H 10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_NON_CONST_PARAMETER_H 11 12 #include "../ClangTidyCheck.h" 13 14 namespace clang::tidy::readability { 15 16 /// Warn when a pointer function parameter can be const. 17 /// 18 /// For the user-facing documentation see: 19 /// http://clang.llvm.org/extra/clang-tidy/checks/readability/non-const-parameter.html 20 class NonConstParameterCheck : public ClangTidyCheck { 21 public: NonConstParameterCheck(StringRef Name,ClangTidyContext * Context)22 NonConstParameterCheck(StringRef Name, ClangTidyContext *Context) 23 : ClangTidyCheck(Name, Context) {} 24 void registerMatchers(ast_matchers::MatchFinder *Finder) override; 25 void check(const ast_matchers::MatchFinder::MatchResult &Result) override; 26 void onEndOfTranslationUnit() override; getCheckTraversalKind()27 std::optional<TraversalKind> getCheckTraversalKind() const override { 28 return TK_IgnoreUnlessSpelledInSource; 29 } 30 31 private: 32 /// Parameter info. 33 struct ParmInfo { 34 /// Is function parameter referenced? 35 bool IsReferenced; 36 37 /// Can function parameter be const? 38 bool CanBeConst; 39 }; 40 41 /// Track all nonconst integer/float parameters. 42 std::map<const ParmVarDecl *, ParmInfo> Parameters; 43 44 /// Add function parameter. 45 void addParm(const ParmVarDecl *Parm); 46 47 /// Set IsReferenced. 48 void setReferenced(const DeclRefExpr *Ref); 49 50 /// Set CanNotBeConst. 51 /// Visits sub expressions recursively. If a DeclRefExpr is found 52 /// and CanNotBeConst is true the Parameter is marked as not-const. 53 /// The CanNotBeConst is updated as sub expressions are visited. 54 void markCanNotBeConst(const Expr *E, bool CanNotBeConst); 55 56 /// Diagnose non const parameters. 57 void diagnoseNonConstParameters(); 58 }; 59 60 } // namespace clang::tidy::readability 61 62 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_NON_CONST_PARAMETER_H 63