diff --git a/clang-tools-extra/clang-tidy/bugprone/ArgumentCommentCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ArgumentCommentCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/ArgumentCommentCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/ArgumentCommentCheck.cpp @@ -20,10 +20,12 @@ namespace tidy { namespace bugprone { namespace { -AST_MATCHER(Decl, isFromStdNamespace) { +AST_MATCHER(Decl, isFromStdNamespaceOrSystemHeader) { if (const auto *D = Node.getDeclContext()->getEnclosingNamespaceContext()) - return D->isStdNamespace(); - return false; + if (D->isStdNamespace()) + return true; + return Node.getASTContext().getSourceManager().isInSystemHeader( + Node.getLocation()); } } // namespace @@ -66,13 +68,13 @@ // 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()))) + unless(hasDeclaration(isFromStdNamespaceOrSystemHeader()))) .bind("expr"), this); + Finder->addMatcher(cxxConstructExpr(unless(hasDeclaration( + isFromStdNamespaceOrSystemHeader()))) + .bind("expr"), + this); } static std::vector> diff --git a/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/header-with-decl.h b/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/header-with-decl.h new file mode 100644 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/header-with-decl.h @@ -0,0 +1 @@ +void my_header_function(int arg); diff --git a/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/system-header-with-decl.h b/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/system-header-with-decl.h new file mode 100644 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/Inputs/bugprone-argument-comment/system-header-with-decl.h @@ -0,0 +1,3 @@ +#pragma clang system_header + +void my_system_header_function(int arg); diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone-argument-comment.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone-argument-comment.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone-argument-comment.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone-argument-comment.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s bugprone-argument-comment %t +// RUN: %check_clang_tidy %s bugprone-argument-comment %t -- -- -I %S/Inputs/bugprone-argument-comment // FIXME: clang-tidy should provide a -verify mode to make writing these checks // easier and more accurate. @@ -134,3 +134,20 @@ std::swap(a, /*num=*/b); } } // namespace ignore_std_functions + +namespace regular_header { +#include "header-with-decl.h" +void test() { + my_header_function(/*not_arg=*/1); +// CHECK-NOTES: [[@LINE-1]]:22: warning: argument name 'not_arg' in comment does not match parameter name 'arg' +// CHECK-NOTES: header-with-decl.h:1:29: note: 'arg' declared here +// CHECK-FIXES: my_header_function(/*not_arg=*/1); +} +} // namespace regular_header + +namespace system_header { +#include "system-header-with-decl.h" +void test() { + my_system_header_function(/*not_arg=*/1); +} +} // namespace system_header