Skip to content

Commit 1bae108

Browse files
authored
[clang-tidy] fix false positives for the functions with the same name as standard library functions in misc-include-cleaner (#94923)
Fixes: #93335 For decl with body, we should provide physical locations also. Because it may be the function which have the same name as std library.
1 parent d4c6478 commit 1bae108

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,10 @@ Changes in existing checks
337337
<clang-tidy/checks/misc/header-include-cycle>` check by avoiding crash for self
338338
include cycles.
339339

340+
- Improved :doc:`misc-include-cleaner
341+
<clang-tidy/checks/misc/include-cleaner>` check by avoiding false positives for
342+
the functions with the same name as standard library functions.
343+
340344
- Improved :doc:`misc-unused-using-decls
341345
<clang-tidy/checks/misc/unused-using-decls>` check by replacing the local
342346
option `HeaderFileExtensions` by the global option of the same name.

clang-tools-extra/include-cleaner/lib/LocateSymbol.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "clang/AST/DeclTemplate.h"
1515
#include "clang/Tooling/Inclusions/StandardLibrary.h"
1616
#include "llvm/Support/Casting.h"
17+
#include "llvm/Support/raw_ostream.h"
1718
#include <utility>
1819
#include <vector>
1920

@@ -40,8 +41,11 @@ Hints declHints(const Decl *D) {
4041
std::vector<Hinted<SymbolLocation>> locateDecl(const Decl &D) {
4142
std::vector<Hinted<SymbolLocation>> Result;
4243
// FIXME: Should we also provide physical locations?
43-
if (auto SS = tooling::stdlib::Recognizer()(&D))
44-
return {{*SS, Hints::CompleteSymbol}};
44+
if (auto SS = tooling::stdlib::Recognizer()(&D)) {
45+
Result.push_back({*SS, Hints::CompleteSymbol});
46+
if (!D.hasBody())
47+
return Result;
48+
}
4549
// FIXME: Signal foreign decls, e.g. a forward declaration not owned by a
4650
// library. Some useful signals could be derived by checking the DeclContext.
4751
// Most incidental forward decls look like:

clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,17 @@ TEST_F(HeadersForSymbolTest, StandardHeaders) {
628628
tooling::stdlib::Header::named("<assert.h>")));
629629
}
630630

631+
TEST_F(HeadersForSymbolTest, NonStandardHeaders) {
632+
Inputs.Code = "void assert() {}";
633+
buildAST();
634+
EXPECT_THAT(
635+
headersFor("assert"),
636+
// Respect the ordering from the stdlib mapping.
637+
UnorderedElementsAre(physicalHeader("input.mm"),
638+
tooling::stdlib::Header::named("<cassert>"),
639+
tooling::stdlib::Header::named("<assert.h>")));
640+
}
641+
631642
TEST_F(HeadersForSymbolTest, ExporterNoNameMatch) {
632643
Inputs.Code = R"cpp(
633644
#include "exporter/foo.h"

clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,11 @@ std::string HelloString;
1515
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: no header providing "std::string" is directly included [misc-include-cleaner]
1616
int FooBarResult = foobar();
1717
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: no header providing "foobar" is directly included [misc-include-cleaner]
18+
19+
namespace valid {
20+
21+
namespace gh93335 {
22+
void log2() {}
23+
} // namespace gh93335
24+
25+
} // namespace valid

0 commit comments

Comments
 (0)