[clang-tools-extra] r242659 - Extend misc-unused-parameters to delete parameters of local functions.
Daniel Jasper
djasper at google.com
Sun Jul 19 20:42:39 PDT 2015
Author: djasper
Date: Sun Jul 19 22:42:38 2015
New Revision: 242659
URL: http://llvm.org/viewvc/llvm-project?rev=242659&view=rev
Log:
Extend misc-unused-parameters to delete parameters of local functions.
Also see: llvm.org/PR24180.
Modified:
clang-tools-extra/trunk/clang-tidy/misc/UnusedParametersCheck.cpp
clang-tools-extra/trunk/test/clang-tidy/misc-unused-parameters.cpp
Modified: clang-tools-extra/trunk/clang-tidy/misc/UnusedParametersCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/UnusedParametersCheck.cpp?rev=242659&r1=242658&r2=242659&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/misc/UnusedParametersCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/misc/UnusedParametersCheck.cpp Sun Jul 19 22:42:38 2015
@@ -22,6 +22,38 @@ void UnusedParametersCheck::registerMatc
this);
}
+static FixItHint removeParameter(const FunctionDecl *Function, unsigned Index) {
+ const ParmVarDecl *Param = Function->getParamDecl(Index);
+ unsigned ParamCount = Function->getNumParams();
+ SourceRange RemovalRange = Param->getSourceRange();
+ if (ParamCount == 1)
+ return FixItHint::CreateRemoval(RemovalRange);
+
+ if (Index == 0)
+ RemovalRange.setEnd(
+ Function->getParamDecl(Index + 1)->getLocStart().getLocWithOffset(-1));
+ else
+ RemovalRange.setBegin(
+ Function->getParamDecl(Index - 1)->getLocEnd().getLocWithOffset(1));
+
+ return FixItHint::CreateRemoval(RemovalRange);
+}
+
+static FixItHint removeArgument(const CallExpr *Call, unsigned Index) {
+ unsigned ArgCount = Call->getNumArgs();
+ const Expr *Arg = Call->getArg(Index);
+ SourceRange RemovalRange = Arg->getSourceRange();
+ if (ArgCount == 1)
+ return FixItHint::CreateRemoval(RemovalRange);
+ if (Index == 0)
+ RemovalRange.setEnd(
+ Call->getArg(Index + 1)->getLocStart().getLocWithOffset(-1));
+ else
+ RemovalRange.setBegin(
+ Call->getArg(Index - 1)->getLocEnd().getLocWithOffset(1));
+ return FixItHint::CreateRemoval(RemovalRange);
+}
+
void UnusedParametersCheck::check(const MatchFinder::MatchResult &Result) {
const auto *Function = Result.Nodes.getNodeAs<FunctionDecl>("function");
if (!Function->doesThisDeclarationHaveABody())
@@ -33,9 +65,39 @@ void UnusedParametersCheck::check(const
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());
+ auto UsedByRef = [&] {
+ return !ast_matchers::match(
+ decl(hasDescendant(
+ declRefExpr(to(equalsNode(Function)),
+ unless(hasAncestor(
+ callExpr(callee(equalsNode(Function)))))))),
+ *Result.Context->getTranslationUnitDecl(), *Result.Context)
+ .empty();
+ };
+
+ // Comment out parameter name for non-local functions.
+ if ((Function->isExternallyVisible() &&
+ Function->getStorageClass() != StorageClass::SC_Static) ||
+ UsedByRef()) {
+ SourceRange RemovalRange(Param->getLocation(), Param->getLocEnd());
+ MyDiag << FixItHint::CreateReplacement(
+ RemovalRange, (Twine(" /*") + Param->getName() + "*/").str());
+ return;
+ }
+
+ // Handle local functions by deleting the parameters.
+ unsigned ParamIndex = Param->getFunctionScopeIndex();
+ // Fix all redeclarations.
+ for (const FunctionDecl *FD : Function->redecls())
+ MyDiag << removeParameter(FD, ParamIndex);
+
+ // Fix all call sites.
+ auto CallMatches = ast_matchers::match(
+ decl(forEachDescendant(
+ callExpr(callee(functionDecl(equalsNode(Function)))).bind("x"))),
+ *Result.Context->getTranslationUnitDecl(), *Result.Context);
+ for (const auto &Match : CallMatches)
+ MyDiag << removeArgument(Match.getNodeAs<CallExpr>("x"), ParamIndex);
}
} // namespace tidy
Modified: clang-tools-extra/trunk/test/clang-tidy/misc-unused-parameters.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-unused-parameters.cpp?rev=242659&r1=242658&r2=242659&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/misc-unused-parameters.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/misc-unused-parameters.cpp Sun Jul 19 22:42:38 2015
@@ -19,3 +19,72 @@ void c(int *i) {}
// ===============
void g(int i); // Don't remove stuff in declarations
void h(int i) { (void)i; } // Don't remove used parameters
+
+// Remove parameters of local functions
+// ====================================
+static void staticFunctionA(int i);
+// CHECK-FIXES: {{^}}static void staticFunctionA();
+static void staticFunctionA(int i) {}
+// CHECK-MESSAGES: :[[@LINE-1]]:33: warning
+// CHECK-FIXES: {{^}}static void staticFunctionA()
+
+static void staticFunctionB(int i, int j) { (void)i; }
+// CHECK-MESSAGES: :[[@LINE-1]]:40: warning
+// CHECK-FIXES: {{^}}static void staticFunctionB(int i)
+
+static void staticFunctionC(int i, int j) { (void)j; }
+// CHECK-MESSAGES: :[[@LINE-1]]:33: warning
+// CHECK-FIXES: {{^}}static void staticFunctionC( int j)
+
+static void staticFunctionD(int i, int j, int k) { (void)i; (void)k; }
+// CHECK-MESSAGES: :[[@LINE-1]]:40: warning
+// CHECK-FIXES: {{^}}static void staticFunctionD(int i, int k)
+
+static void staticFunctionE(int i = 4) {}
+// CHECK-MESSAGES: :[[@LINE-1]]:33: warning
+// CHECK-FIXES: {{^}}static void staticFunctionE()
+
+
+static void someCallSites() {
+ staticFunctionA(1);
+// CHECK-FIXES: staticFunctionA();
+ staticFunctionB(1, 2);
+// CHECK-FIXES: staticFunctionB(1);
+ staticFunctionC(1, 2);
+// CHECK-FIXES: staticFunctionC( 2);
+ staticFunctionD(1, 2, 3);
+// CHECK-FIXES: staticFunctionD(1, 3);
+ staticFunctionE();
+}
+
+namespace {
+class C {
+public:
+ void f(int i);
+// CHECK-FIXES: void f();
+ void g(int i) {}
+// CHECK-MESSAGES: :[[@LINE-1]]:14: warning
+// CHECK-FIXES: void g() {}
+ void h(int i) {}
+// CHECK-MESSAGES: :[[@LINE-1]]:14: warning
+// CHECK-FIXES: void h(int /*i*/) {}
+};
+
+void C::f(int i) {}
+// CHECK-MESSAGES: :[[@LINE-1]]:15: warning
+// CHECK-FIXES: void C::f() {}
+
+template <typename T>
+void useFunction(T t);
+
+void someMoreCallSites() {
+ C c;
+ c.f(1);
+// CHECK-FIXES: c.f();
+ c.g(1);
+// CHECK-FIXES: c.g();
+
+ useFunction(&C::h);
+}
+
+} // end namespace
More information about the cfe-commits
mailing list