From d88caa21e6e42213b304a219b73f6e6fa3f98099 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Wed, 9 May 2018 13:20:03 +0000 Subject: [PATCH] Do not warn on unused parameters for functions with empty bodies. If a function has an empty body, all parameters are trivially unused. llvm-svn: 331875 --- .../clang-tidy/misc/UnusedParametersCheck.cpp | 9 ++- .../test/clang-tidy/misc-unused-parameters.c | 8 +- .../test/clang-tidy/misc-unused-parameters.cpp | 91 +++++++++++----------- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp index 03196c8..e09f514 100644 --- a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp @@ -29,10 +29,11 @@ bool isOverrideMethod(const FunctionDecl *Function) { } // namespace void UnusedParametersCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher( - functionDecl(isDefinition(), hasBody(stmt()), hasAnyParameter(decl())) - .bind("function"), - this); + Finder->addMatcher(functionDecl(isDefinition(), + hasBody(stmt(hasDescendant(stmt()))), + hasAnyParameter(decl())) + .bind("function"), + this); } template diff --git a/clang-tools-extra/test/clang-tidy/misc-unused-parameters.c b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.c index 635aace..d824a80 100644 --- a/clang-tools-extra/test/clang-tidy/misc-unused-parameters.c +++ b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.c @@ -2,14 +2,14 @@ // Basic removal // ============= -void a(int i) {} +void a(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void a(int /*i*/) {}{{$}} +// CHECK-FIXES: {{^}}void a(int /*i*/) {;}{{$}} static void b(); // In C, forward declarations can leave out parameters. -static void b(int i) {} +static void b(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}static void b() {}{{$}} +// CHECK-FIXES: {{^}}static void b() {;}{{$}} // Unchanged cases // =============== diff --git a/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp index b18aa20..42554b9 100644 --- a/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp @@ -1,5 +1,5 @@ -// RUN: echo "static void staticFunctionHeader(int i) {}" > %T/header.h -// RUN: echo "static void staticFunctionHeader(int /*i*/) {}" > %T/header-fixed.h +// RUN: echo "static void staticFunctionHeader(int i) {;}" > %T/header.h +// RUN: echo "static void staticFunctionHeader(int /*i*/) {;}" > %T/header-fixed.h // RUN: %check_clang_tidy %s misc-unused-parameters %t -- -header-filter='.*' -- -std=c++11 -fno-delayed-template-parsing // RUN: diff %T/header.h %T/header-fixed.h @@ -8,29 +8,29 @@ // Basic removal // ============= -void a(int i) {} +void a(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void a(int /*i*/) {}{{$}} +// CHECK-FIXES: {{^}}void a(int /*i*/) {;}{{$}} -void b(int i = 1) {} +void b(int i = 1) {;} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void b(int /*i*/ = 1) {}{{$}} +// CHECK-FIXES: {{^}}void b(int /*i*/ = 1) {;}{{$}} -void c(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*/) {}{{$}} +// CHECK-FIXES: {{^}}void c(int * /*i*/) {;}{{$}} -void d(int i[]) {} +void d(int i[]) {;} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void d(int /*i*/[]) {}{{$}} +// CHECK-FIXES: {{^}}void d(int /*i*/[]) {;}{{$}} -void e(int i[1]) {} +void e(int i[1]) {;} // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: parameter 'i' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void e(int /*i*/[1]) {}{{$}} +// CHECK-FIXES: {{^}}void e(int /*i*/[1]) {;}{{$}} -void f(void (*fn)()) {} +void f(void (*fn)()) {;} // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: parameter 'fn' is unused [misc-unused-parameters] -// CHECK-FIXES: {{^}}void f(void (* /*fn*/)()) {}{{$}} +// CHECK-FIXES: {{^}}void f(void (* /*fn*/)()) {;}{{$}} // Unchanged cases // =============== @@ -48,7 +48,7 @@ static bool static_var = useLambda([] (int a) { return a; }); // ==================================== static void staticFunctionA(int i); // CHECK-FIXES: {{^}}static void staticFunctionA(); -static void staticFunctionA(int i) {} +static void staticFunctionA(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:33: warning // CHECK-FIXES: {{^}}static void staticFunctionA() @@ -64,25 +64,25 @@ 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) {} +static void staticFunctionE(int i = 4) {;} // CHECK-MESSAGES: :[[@LINE-1]]:33: warning // CHECK-FIXES: {{^}}static void staticFunctionE() static void staticFunctionF(int i = 4); // CHECK-FIXES: {{^}}static void staticFunctionF(); -static void staticFunctionF(int i) {} +static void staticFunctionF(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:33: warning // CHECK-FIXES: {{^}}static void staticFunctionF() static void staticFunctionG(int i[]); // CHECK-FIXES: {{^}}static void staticFunctionG(); -static void staticFunctionG(int i[]) {} +static void staticFunctionG(int i[]) {;} // CHECK-MESSAGES: :[[@LINE-1]]:33: warning // CHECK-FIXES: {{^}}static void staticFunctionG() static void staticFunctionH(void (*fn)()); // CHECK-FIXES: {{^}}static void staticFunctionH(); -static void staticFunctionH(void (*fn)()) {} +static void staticFunctionH(void (*fn)()) {;} // CHECK-MESSAGES: :[[@LINE-1]]:36: warning // CHECK-FIXES: {{^}}static void staticFunctionH() @@ -112,7 +112,7 @@ static void someCallSites() { /* * FIXME: This fails because the removals overlap and ClangTidy doesn't apply * them. - * static void bothVarsUnused(int a, int b) {} + * static void bothVarsUnused(int a, int b) {;} */ // Regression test for long variable names and expressions @@ -136,18 +136,18 @@ static void someLongNameCallSites() { } class SomeClass { - static void f(int i) {} + static void f(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:21: warning -// CHECK-FIXES: static void f(int /*i*/) {} - static void g(int i = 1) {} +// CHECK-FIXES: static void f(int /*i*/) {;} + static void g(int i = 1) {;} // CHECK-MESSAGES: :[[@LINE-1]]:21: warning -// CHECK-FIXES: static void g(int /*i*/ = 1) {} - static void h(int i[]) {} +// CHECK-FIXES: static void g(int /*i*/ = 1) {;} + static void h(int i[]) {;} // CHECK-MESSAGES: :[[@LINE-1]]:21: warning -// CHECK-FIXES: static void h(int /*i*/[]) {} - static void s(void (*fn)()) {} +// CHECK-FIXES: static void h(int /*i*/[]) {;} + static void s(void (*fn)()) {;} // CHECK-MESSAGES: :[[@LINE-1]]:24: warning -// CHECK-FIXES: static void s(void (* /*fn*/)()) {} +// CHECK-FIXES: static void s(void (* /*fn*/)()) {;} }; namespace { @@ -155,26 +155,26 @@ class C { public: void f(int i); // CHECK-FIXES: void f(); - void g(int i) {} + void g(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:14: warning -// CHECK-FIXES: void g() {} - void h(int i) {} +// CHECK-FIXES: void g() {;} + void h(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:14: warning -// CHECK-FIXES: void h(int /*i*/) {} - void s(int i = 1) {} +// CHECK-FIXES: void h(int /*i*/) {;} + void s(int i = 1) {;} // CHECK-MESSAGES: :[[@LINE-1]]:14: warning -// CHECK-FIXES: void s(int /*i*/ = 1) {} - void u(int i[]) {} +// CHECK-FIXES: void s(int /*i*/ = 1) {;} + void u(int i[]) {;} // CHECK-MESSAGES: :[[@LINE-1]]:14: warning -// CHECK-FIXES: void u(int /*i*/[]) {} - void w(void (*fn)()) {} +// CHECK-FIXES: void u(int /*i*/[]) {;} + void w(void (*fn)()) {;} // CHECK-MESSAGES: :[[@LINE-1]]:17: warning -// CHECK-FIXES: void w(void (* /*fn*/)()) {} +// CHECK-FIXES: void w(void (* /*fn*/)()) {;} }; -void C::f(int i) {} +void C::f(int i) {;} // CHECK-MESSAGES: :[[@LINE-1]]:15: warning -// CHECK-FIXES: void C::f() {} +// CHECK-FIXES: void C::f() {;} template void useFunction(T t); @@ -197,9 +197,9 @@ class Base { }; class Derived : public Base { - void f(int i) override {} + void f(int i) override {;} // CHECK-MESSAGES: :[[@LINE-1]]:14: warning -// CHECK-FIXES: void f(int /*i*/) override {} +// CHECK-FIXES: void f(int /*i*/) override {;} }; } // end namespace @@ -210,10 +210,10 @@ template void someFunctionTemplateOneUnusedParam(T b, T e) { (void) // CHECK-MESSAGES: :[[@LINE-1]]:65: warning // CHECK-FIXES: {{^}}template void someFunctionTemplateOneUnusedParam(T /*b*/, T e) { (void)e; } -template void someFunctionTemplateAllUnusedParams(T b, T e) {} +template void someFunctionTemplateAllUnusedParams(T b, T e) {;} // CHECK-MESSAGES: :[[@LINE-1]]:66: warning // CHECK-MESSAGES: :[[@LINE-2]]:71: warning -// CHECK-FIXES: {{^}}template void someFunctionTemplateAllUnusedParams(T /*b*/, T /*e*/) {} +// CHECK-FIXES: {{^}}template void someFunctionTemplateAllUnusedParams(T /*b*/, T /*e*/) {;} static void dontGetConfusedByParametersInFunctionTypes() { void (*F)(int i); } @@ -221,3 +221,6 @@ template class Function {}; static Function dontGetConfusedByFunctionReturnTypes() { return Function(); } + +// Do not warn on empty function bodies. +void f(int foo) {} -- 2.7.4