Skip to content

Commit

Permalink
[clang-tidy] Don't delete unused parameter in class override method i…
Browse files Browse the repository at this point in the history
…n anonymous namespace.

Summary: Fixes PR26740.

Reviewers: alexfh

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D17926

llvm-svn: 265117
  • Loading branch information
hokein committed Apr 1, 2016
1 parent b7f633b commit 7d15853
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
22 changes: 12 additions & 10 deletions clang-tools-extra/clang-tidy/misc/UnusedParametersCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ using namespace clang::ast_matchers;

namespace clang {
namespace tidy {
namespace {
bool isOverrideMethod(const FunctionDecl *Function) {
if (const auto *MD = dyn_cast<CXXMethodDecl>(Function))
return MD->size_overridden_methods() > 0 || MD->hasAttr<OverrideAttr>();
return false;
}
} // namespace

void UnusedParametersCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(functionDecl().bind("function"), this);
Expand Down Expand Up @@ -63,20 +70,15 @@ void UnusedParametersCheck::warnOnUnusedParameter(
auto MyDiag = diag(Param->getLocation(), "parameter '%0' is unused")
<< Param->getName();

auto UsedByRef = [&] {
return !ast_matchers::match(
decl(hasDescendant(
declRefExpr(to(equalsNode(Function)),
unless(hasAncestor(
callExpr(callee(equalsNode(Function)))))))),
*Result.Context->getTranslationUnitDecl(), *Result.Context)
.empty();
};
auto DeclRefExpr =
declRefExpr(to(equalsNode(Function)),
unless(hasAncestor(callExpr(callee(equalsNode(Function))))));

// Comment out parameter name for non-local functions.
if (Function->isExternallyVisible() ||
!Result.SourceManager->isInMainFile(Function->getLocation()) ||
UsedByRef()) {
!ast_matchers::match(DeclRefExpr, *Result.Context).empty() ||
isOverrideMethod(Function)) {
SourceRange RemovalRange(Param->getLocation(), Param->getLocEnd());
// Note: We always add a space before the '/*' to not accidentally create a
// '*/*' for pointer types, which doesn't start a comment. clang-format will
Expand Down
10 changes: 10 additions & 0 deletions clang-tools-extra/test/clang-tidy/misc-unused-parameters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,16 @@ void someMoreCallSites() {
useFunction(&C::h);
}

class Base {
virtual void f(int i);
};

class Derived : public Base {
void f(int i) override {}
// CHECK-MESSAGES: :[[@LINE-1]]:14: warning
// CHECK-FIXES: void f(int /*i*/) override {}
};

} // end namespace

template <typename T> void someFunctionTemplate(T b, T e) { (void)b; (void)e; }
Expand Down

0 comments on commit 7d15853

Please sign in to comment.