[clang-tidy] Exclude function calls in std namespace for bugprone-argument-comment.

Reviewers: gribozavr2

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D79494
This commit is contained in:
Haojian Wu 2020-05-06 17:06:14 +02:00
parent a400aa5faf
commit 2a3498e24f
2 changed files with 36 additions and 2 deletions

View File

@ -19,6 +19,13 @@ using namespace clang::ast_matchers;
namespace clang {
namespace tidy {
namespace bugprone {
namespace {
AST_MATCHER(Decl, isFromStdNamespace) {
if (const auto *D = Node.getDeclContext()->getEnclosingNamespaceContext())
return D->isStdNamespace();
return false;
}
} // namespace
ArgumentCommentCheck::ArgumentCommentCheck(StringRef Name,
ClangTidyContext *Context)
@ -54,10 +61,18 @@ void ArgumentCommentCheck::registerMatchers(MatchFinder *Finder) {
// don't check them against NewCallback's parameter names.
// FIXME: Make this configurable.
unless(hasDeclaration(functionDecl(
hasAnyName("NewCallback", "NewPermanentCallback")))))
hasAnyName("NewCallback", "NewPermanentCallback")))),
// Ignore APIs from the standard library, since their names are
// not specified by the standard, and standard library
// implementations in practice have to use reserved names to
// avoid conflicts with same-named macros.
unless(hasDeclaration(isFromStdNamespace())))
.bind("expr"),
this);
Finder->addMatcher(
cxxConstructExpr(unless(hasDeclaration(isFromStdNamespace())))
.bind("expr"),
this);
Finder->addMatcher(cxxConstructExpr().bind("expr"), this);
}
static std::vector<std::pair<SourceLocation, StringRef>>

View File

@ -115,3 +115,22 @@ void g() { f6(/*xxy=*/0, 0); }
// CHECK-NOTES: [[@LINE-3]]:13: note: 'xxx' declared here
// CHECK-FIXES: void g() { f6(/*xxy=*/0, 0); }
}
namespace std {
template <typename T>
class vector {
public:
void assign(int __n, const T &__val);
};
template<typename T>
void swap(T& __a, T& __b);
} // namespace std
namespace ignore_std_functions {
void test(int a, int b) {
std::vector<int> s;
// verify the check is not fired on std functions.
s.assign(1, /*value=*/2);
std::swap(a, /*num=*/b);
}
} // namespace ignore_std_functions