From 9c6df889c4a6f9cbcfab41deebc8db798986562d Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Mon, 20 Jul 2015 01:06:44 +0000 Subject: [PATCH] Initial version of clang-tidy check to find and fix unused parameters. Also see: llvm.org/PR24180. llvm-svn: 242654 --- clang-tools-extra/clang-tidy/misc/CMakeLists.txt | 1 + .../clang-tidy/misc/MiscTidyModule.cpp | 3 ++ .../clang-tidy/misc/UnusedParametersCheck.cpp | 43 ++++++++++++++++++++++ .../clang-tidy/misc/UnusedParametersCheck.h | 32 ++++++++++++++++ .../test/clang-tidy/misc-unused-parameters.cpp | 21 +++++++++++ 5 files changed, 100 insertions(+) create mode 100644 clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp create mode 100644 clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.h create mode 100644 clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp diff --git a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt index c2ee923..02f666c 100644 --- a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt @@ -14,6 +14,7 @@ add_clang_library(clangTidyMiscModule StaticAssertCheck.cpp SwappedArgumentsCheck.cpp UndelegatedConstructor.cpp + UnusedParametersCheck.cpp UnusedRAIICheck.cpp UniqueptrResetReleaseCheck.cpp UseOverrideCheck.cpp diff --git a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp index 4267071..8502e5a 100644 --- a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp @@ -23,6 +23,7 @@ #include "SwappedArgumentsCheck.h" #include "UndelegatedConstructor.h" #include "UniqueptrResetReleaseCheck.h" +#include "UnusedParametersCheck.h" #include "UnusedRAIICheck.h" #include "UseOverrideCheck.h" @@ -58,6 +59,8 @@ public: "misc-undelegated-constructor"); CheckFactories.registerCheck( "misc-uniqueptr-reset-release"); + CheckFactories.registerCheck( + "misc-unused-parameters"); CheckFactories.registerCheck("misc-unused-raii"); CheckFactories.registerCheck("misc-use-override"); } diff --git a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp new file mode 100644 index 0000000..170a274 --- /dev/null +++ b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp @@ -0,0 +1,43 @@ +//===--- UnusedParametersCheck.cpp - clang-tidy----------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "UnusedParametersCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { + +void UnusedParametersCheck::registerMatchers(MatchFinder *Finder) { + Finder->addMatcher( + parmVarDecl(hasAncestor(functionDecl().bind("function"))).bind("x"), + this); +} + +void UnusedParametersCheck::check(const MatchFinder::MatchResult &Result) { + const auto *Function = Result.Nodes.getNodeAs("function"); + if (!Function->doesThisDeclarationHaveABody()) + return; + const auto *Param = Result.Nodes.getNodeAs("x"); + if (Param->isUsed()) + return; + + auto MyDiag = diag(Param->getLocation(), "parameter '%0' is unused") + << Param->getName(); + + SourceRange RemovalRange(Param->getLocation(), Param->getLocEnd()); + MyDiag << FixItHint::CreateReplacement( + RemovalRange, (Twine(" /*") + Param->getName() + "*/").str()); +} + +} // namespace tidy +} // namespace clang + diff --git a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.h b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.h new file mode 100644 index 0000000..57ba0ef --- /dev/null +++ b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.h @@ -0,0 +1,32 @@ +//===--- UnusedParametersCheck.h - clang-tidy--------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNUSED_PARAMETERS_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNUSED_PARAMETERS_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { + +/// \brief Finds unused parameters and fixes them, so that -Wunused-parameter +/// can be turned on. +class UnusedParametersCheck : public ClangTidyCheck { +public: + UnusedParametersCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNUSED_PARAMETERS_H + diff --git a/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp new file mode 100644 index 0000000..70d1c8c --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp @@ -0,0 +1,21 @@ +// RUN: $(dirname %s)/check_clang_tidy.sh %s misc-unused-parameters %t +// REQUIRES: shell + +// Basic removal +// ============= +void a(int i) {} +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] +// CHECK-FIXES: {{^}}void a(int /*i*/) {}{{$}} + +void b(int i = 1) {} +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] +// CHECK-FIXES: {{^}}void b(int /*i*/) {}{{$}} + +void c(int *i) {} +// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: parameter 'i' is unused [misc-unused-parameters] +// CHECK-FIXES: {{^}}void c(int * /*i*/) {}{{$}} + +// Unchanged cases +// =============== +void g(int i); // Don't remove stuff in declarations +void h(int i) { (void)i; } // Don't remove used parameters -- 2.7.4