Author: MuAlphaOmegaEpsilon Date: 2022-01-27T11:40:08-05:00 New Revision: ccce1a03c9ce9c3917b310097c89e39bb68527e2
URL: https://github.com/llvm/llvm-project/commit/ccce1a03c9ce9c3917b310097c89e39bb68527e2 DIFF: https://github.com/llvm/llvm-project/commit/ccce1a03c9ce9c3917b310097c89e39bb68527e2.diff LOG: Don't trigger unused-parameter warnings on naked functions This commit checks if a function is marked with the naked attribute and, if it is, will silence the emission of any unused-parameter warning. Inside a naked function only the usage of basic ASM instructions is expected. In this context the parameters can actually be used by fetching them according to the underlying ABI. Since parameters might be used through ASM instructions, the linter and the compiler will have a hard time understanding if one of those is unused or not, therefore no unused-parameter warning should ever be triggered whenever a function is marked naked. Added: Modified: clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters-strict.cpp clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.c clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.cpp clang/lib/Sema/SemaDecl.cpp clang/test/Sema/warn-unused-parameters.c clang/test/SemaCXX/warn-unused-parameters.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp index ee2ca87ab011b..149d63ff1e62f 100644 --- a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp @@ -31,10 +31,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()), + hasAnyParameter(decl()), + unless(hasAttr(attr::Kind::Naked))) + .bind("function"), + this); } template <typename T> diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters-strict.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters-strict.cpp index f45f9defa7ece..0b4fc8f446954 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters-strict.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters-strict.cpp @@ -22,4 +22,8 @@ class F { // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'j' is unused // CHECK-FIXES: {{^}} F(int /*j*/) : i() {}{{$}} }; + +// Do not warn on naked functions. +[[gnu::naked]] int nakedFunction(int a, float b, const char *c) { ; } +__attribute__((naked)) void nakedFunction(int a, int b) { ; } } diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.c b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.c index 1f4527a2ec8f1..67e9a3be9692c 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.c +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.c @@ -15,3 +15,5 @@ static void b(int i) {;} // =============== void h(i, c, d) int i; char *c, *d; {} // Don't mess with K&R style +// Do not warn on naked functions. +__attribute__((naked)) void nakedFunction(int a, int b) { ; } diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.cpp index 52f9675bffa10..a3fcf30f273ef 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-unused-parameters.cpp @@ -286,3 +286,7 @@ void test() { f([](int I) { return; }); } } // namespace lambda + +// Do not warn on naked functions. +[[gnu::naked]] int nakedFunction(int a, float b, const char *c) { ; } +__attribute__((naked)) void nakedFunction(int a, int b) { ; } diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7c5f6b318e973..3252671991b70 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -14694,8 +14694,10 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, Diag(FD->getLocation(), diag::ext_pure_function_definition); if (!FD->isInvalidDecl()) { - // Don't diagnose unused parameters of defaulted or deleted functions. - if (!FD->isDeleted() && !FD->isDefaulted() && !FD->hasSkippedBody()) + // Don't diagnose unused parameters of defaulted, deleted or naked + // functions. + if (!FD->isDeleted() && !FD->isDefaulted() && !FD->hasSkippedBody() && + !FD->hasAttr<NakedAttr>()) DiagnoseUnusedParameters(FD->parameters()); DiagnoseSizeOfParametersAndReturnValue(FD->parameters(), FD->getReturnType(), FD); diff --git a/clang/test/Sema/warn-unused-parameters.c b/clang/test/Sema/warn-unused-parameters.c index d325f887f885a..9167ae0235929 100644 --- a/clang/test/Sema/warn-unused-parameters.c +++ b/clang/test/Sema/warn-unused-parameters.c @@ -17,14 +17,17 @@ void f1(void) { // warnings for the above cases. static void achor() {}; +// Do not warn on naked functions. +__attribute__((naked)) static void nakedFunction(int a, int b) { } + // CHECK: 5:12: warning: unused parameter 'y' // CHECK: 12:15: warning: unused parameter 'y' -// CHECK-unused: 1 warning generated +// CHECK-unused: 2 warnings generated // RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything %s 2>&1 | FileCheck -check-prefix=CHECK-everything %s // RUN: not %clang_cc1 -fblocks -fsyntax-only -Weverything -Werror %s 2>&1 | FileCheck -check-prefix=CHECK-everything-error %s // RUN: %clang_cc1 -fblocks -fsyntax-only -Weverything -Wno-unused %s 2>&1 | FileCheck -check-prefix=CHECK-everything-no-unused %s -// CHECK-everything: 6 warnings generated +// CHECK-everything: 7 warnings generated // CHECK-everything-error: 5 errors generated // CHECK-everything-no-unused: 5 warnings generated diff --git a/clang/test/SemaCXX/warn-unused-parameters.cpp b/clang/test/SemaCXX/warn-unused-parameters.cpp index 00ce1a98c6c8a..ac4e21490a624 100644 --- a/clang/test/SemaCXX/warn-unused-parameters.cpp +++ b/clang/test/SemaCXX/warn-unused-parameters.cpp @@ -32,3 +32,7 @@ static int test_pack(T... t, T... s) auto l = [&t...]() { return sizeof...(s); }; return l(); } + +// Do not warn on naked functions. +[[gnu::naked]] int nakedFunction(int a, float b, const char* c) { ; } +__attribute__((naked)) void nakedFunction(int a, int b) { ; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits