Don't warn on NewCallback argument comments, as they are arguments for the

function the callback points to.

Reviewers: djasper

Reviewed By: djasper

Subscribers: cfe-commits

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

llvm-svn: 214307
This commit is contained in:
Alexander Kornienko 2014-07-30 14:31:36 +00:00
parent 3b6616c3a3
commit 326e48cd09
2 changed files with 25 additions and 12 deletions

View File

@ -8,9 +8,6 @@
//===----------------------------------------------------------------------===//
#include "ArgumentCommentCheck.h"
#include "../ClangTidy.h"
#include "../ClangTidyModule.h"
#include "../ClangTidyModuleRegistry.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Lex/Lexer.h"
@ -25,7 +22,15 @@ ArgumentCommentCheck::ArgumentCommentCheck()
: IdentRE("^(/\\* *)([_A-Za-z][_A-Za-z0-9]*)( *= *\\*/)$") {}
void ArgumentCommentCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(callExpr(unless(operatorCallExpr())).bind("expr"), this);
Finder->addMatcher(
callExpr(unless(operatorCallExpr()),
// NewCallback's arguments relate to the pointed function, don't
// check them against NewCallback's parameter names.
// FIXME: Make this configurable.
unless(hasDeclaration(functionDecl(anyOf(
hasName("NewCallback"), hasName("NewPermanentCallback"))))))
.bind("expr"),
this);
Finder->addMatcher(constructExpr().bind("expr"), this);
}

View File

@ -1,21 +1,29 @@
// RUN: clang-tidy --checks='-*,misc-argument-comment' %s -- | FileCheck %s
// RUN: clang-tidy --checks='-*,misc-argument-comment' %s -- -std=c++11 | FileCheck %s -implicit-check-not='{{warning:|error:}}'
// FIXME: clang-tidy should provide a -verify mode to make writing these checks
// easier and more accurate.
// CHECK-NOT: warning
void f(int x, int y);
void ffff(int xxxx, int yyyy);
void f(int x, int y);
void g() {
// CHECK: [[@LINE+5]]:5: warning: argument name 'y' in comment does not match parameter name 'x'
// CHECK: :8:12: note: 'x' declared here
// CHECK: :[[@LINE-3]]:12: note: 'x' declared here
// CHECK: [[@LINE+3]]:14: warning: argument name 'z' in comment does not match parameter name 'y'
// CHECK: :8:19: note: 'y' declared here
// CHECK: :[[@LINE-5]]:19: note: 'y' declared here
// CHECK-NOT: warning
f(/*y=*/0, /*z=*/0);
}
// CHECK-NOT: warning
struct Closure {};
template <typename T1, typename T2>
Closure *NewCallback(void (*f)(T1, T2), T1 arg1, T2 arg2) { return nullptr; }
template <typename T1, typename T2>
Closure *NewPermanentCallback(void (*f)(T1, T2), T1 arg1, T2 arg2) { return nullptr; }
void h() {
(void)NewCallback(&ffff, /*xxxx=*/11, /*yyyy=*/22);
(void)NewPermanentCallback(&ffff, /*xxxx=*/11, /*yyyy=*/22);
}