Author: Haojian Wu Date: 2023-09-22T14:35:00+02:00 New Revision: 7b3db8079d0a736c07db30388cdedf608f4ed58f
URL: https://github.com/llvm/llvm-project/commit/7b3db8079d0a736c07db30388cdedf608f4ed58f DIFF: https://github.com/llvm/llvm-project/commit/7b3db8079d0a736c07db30388cdedf608f4ed58f.diff LOG: [include-cleaner] Respect the UsingShadowDecl when find headers for ambiguous std symbols. (#66485) In libcpp, the `std::remove(const char*)` is a using decl in std namespace `using ::remove`, which was not handled correctly in `headerForAmbiguousStdSymbol` Added: Modified: clang-tools-extra/include-cleaner/lib/FindHeaders.cpp clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp index 06e5e1812ba7218..fd2de6a17ad4a53 100644 --- a/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp +++ b/clang-tools-extra/include-cleaner/lib/FindHeaders.cpp @@ -13,6 +13,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" +#include "clang/AST/DeclCXX.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/FileEntry.h" #include "clang/Basic/SourceLocation.h" @@ -116,6 +117,8 @@ std::optional<tooling::stdlib::Header> headerForAmbiguousStdSymbol(const NamedDecl *ND) { if (!ND->isInStdNamespace()) return {}; + if (auto* USD = llvm::dyn_cast<UsingShadowDecl>(ND)) + ND = USD->getTargetDecl(); const auto *FD = ND->getAsFunction(); if (!FD) return std::nullopt; diff --git a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp index 4cdcde1184a0a9e..5a2a41b2d99bdd7 100644 --- a/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp @@ -11,6 +11,7 @@ #include "clang-include-cleaner/Analysis.h" #include "clang-include-cleaner/Record.h" #include "clang-include-cleaner/Types.h" +#include "clang/AST/Expr.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/FileEntry.h" #include "clang/Basic/FileManager.h" @@ -587,6 +588,36 @@ TEST_F(HeadersForSymbolTest, AmbiguousStdSymbols) { } } +TEST_F(HeadersForSymbolTest, AmbiguousStdSymbolsUsingShadow) { + Inputs.Code = R"cpp( + void remove(char*); + namespace std { using ::remove; } + + void k() { + std::remove("abc"); + } + )cpp"; + buildAST(); + + // Find the DeclRefExpr in the std::remove("abc") function call. + struct Visitor : public RecursiveASTVisitor<Visitor> { + const DeclRefExpr *Out = nullptr; + bool VisitDeclRefExpr(const DeclRefExpr *DRE) { + EXPECT_TRUE(Out == nullptr) << "Found multiple DeclRefExpr!"; + Out = DRE; + return true; + } + }; + Visitor V; + V.TraverseDecl(AST->context().getTranslationUnitDecl()); + ASSERT_TRUE(V.Out) << "Couldn't find a DeclRefExpr!"; + EXPECT_THAT(headersForSymbol(*(V.Out->getFoundDecl()), + AST->sourceManager(), &PI), + UnorderedElementsAre( + Header(*tooling::stdlib::Header::named("<cstdio>")))); +} + + TEST_F(HeadersForSymbolTest, StandardHeaders) { Inputs.Code = "void assert();"; buildAST(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits