diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp')
| -rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp index 47f563ba6ef..8b893c7c4ab 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.cpp @@ -31,32 +31,41 @@ bool isCapsOnly(StringRef Name) { class MacroUsageCallbacks : public PPCallbacks { public: - MacroUsageCallbacks(MacroUsageCheck *Check, StringRef RegExp, bool CapsOnly) - : Check(Check), RegExp(RegExp), CheckCapsOnly(CapsOnly) {} + MacroUsageCallbacks(MacroUsageCheck *Check, const SourceManager &SM, + StringRef RegExp, bool CapsOnly, bool IgnoreCommandLine) + : Check(Check), SM(SM), RegExp(RegExp), CheckCapsOnly(CapsOnly), + IgnoreCommandLineMacros(IgnoreCommandLine) {} void MacroDefined(const Token &MacroNameTok, const MacroDirective *MD) override { if (MD->getMacroInfo()->isUsedForHeaderGuard() || MD->getMacroInfo()->getNumTokens() == 0) return; + if (IgnoreCommandLineMacros && + SM.isWrittenInCommandLineFile(MD->getLocation())) + return; + StringRef MacroName = MacroNameTok.getIdentifierInfo()->getName(); if (!CheckCapsOnly && !llvm::Regex(RegExp).match(MacroName)) - Check->warnMacro(MD); + Check->warnMacro(MD, MacroName); if (CheckCapsOnly && !isCapsOnly(MacroName)) - Check->warnNaming(MD); + Check->warnNaming(MD, MacroName); } private: MacroUsageCheck *Check; + const SourceManager &SM; StringRef RegExp; bool CheckCapsOnly; + bool IgnoreCommandLineMacros; }; } // namespace void MacroUsageCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "AllowedRegexp", AllowedRegexp); Options.store(Opts, "CheckCapsOnly", CheckCapsOnly); + Options.store(Opts, "IgnoreCommandLineMacros", IgnoreCommandLineMacros); } void MacroUsageCheck::registerPPCallbacks(CompilerInstance &Compiler) { @@ -64,31 +73,34 @@ void MacroUsageCheck::registerPPCallbacks(CompilerInstance &Compiler) { return; Compiler.getPreprocessor().addPPCallbacks( - llvm::make_unique<MacroUsageCallbacks>(this, AllowedRegexp, - CheckCapsOnly)); + llvm::make_unique<MacroUsageCallbacks>(this, Compiler.getSourceManager(), + AllowedRegexp, CheckCapsOnly, + IgnoreCommandLineMacros)); } -void MacroUsageCheck::warnMacro(const MacroDirective *MD) { +void MacroUsageCheck::warnMacro(const MacroDirective *MD, StringRef MacroName) { StringRef Message = - "macro used to declare a constant; consider using a 'constexpr' " + "macro '%0' used to declare a constant; consider using a 'constexpr' " "constant"; /// A variadic macro is function-like at the same time. Therefore variadic /// macros are checked first and will be excluded for the function-like /// diagnostic. if (MD->getMacroInfo()->isVariadic()) - Message = "variadic macro used; consider using a 'constexpr' " + Message = "variadic macro '%0' used; consider using a 'constexpr' " "variadic template function"; else if (MD->getMacroInfo()->isFunctionLike()) - Message = "function-like macro used; consider a 'constexpr' template " + Message = "function-like macro '%0' used; consider a 'constexpr' template " "function"; - diag(MD->getLocation(), Message); + diag(MD->getLocation(), Message) << MacroName; } -void MacroUsageCheck::warnNaming(const MacroDirective *MD) { +void MacroUsageCheck::warnNaming(const MacroDirective *MD, + StringRef MacroName) { diag(MD->getLocation(), "macro definition does not define the macro name " - "using all uppercase characters"); + "'%0' using all uppercase characters") + << MacroName; } } // namespace cppcoreguidelines |

