diff --git a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp --- a/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp @@ -31,10 +31,11 @@ } // 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 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 --- 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 @@ // 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 --- 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 @@ // =============== 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 --- 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 @@ 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 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -14632,8 +14632,10 @@ 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()) 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 --- a/clang/test/Sema/warn-unused-parameters.c +++ b/clang/test/Sema/warn-unused-parameters.c @@ -28,3 +28,5 @@ // CHECK-everything-error: 5 errors generated // CHECK-everything-no-unused: 5 warnings generated +// Do not warn on naked functions. +__attribute__((naked)) void nakedFunction(int a, int b) { ; } diff --git a/clang/test/SemaCXX/warn-unused-parameters.cpp b/clang/test/SemaCXX/warn-unused-parameters.cpp --- a/clang/test/SemaCXX/warn-unused-parameters.cpp +++ b/clang/test/SemaCXX/warn-unused-parameters.cpp @@ -32,3 +32,7 @@ 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) { ; }