diff options
| -rw-r--r-- | clang-tools-extra/clangd/index/SymbolCollector.cpp | 6 | ||||
| -rw-r--r-- | clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp | 14 |
2 files changed, 14 insertions, 6 deletions
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp index 302d46adbc8..b4ef6bf134d 100644 --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -236,8 +236,6 @@ bool SymbolCollector::shouldCollectSymbol(const NamedDecl &ND, const ASTContext &ASTCtx, const Options &Opts, bool IsMainFileOnly) { - if (ND.isImplicit()) - return false; // Skip anonymous declarations, e.g (anonymous enum/class/struct). if (ND.getDeclName().isEmpty()) return false; @@ -328,7 +326,9 @@ bool SymbolCollector::handleDeclOccurence( // then no public declaration was visible, so assume it's main-file only. bool IsMainFileOnly = SM.isWrittenInMainFile(SM.getExpansionLoc(ND->getBeginLoc())); - if (!shouldCollectSymbol(*ND, *ASTCtx, Opts, IsMainFileOnly)) + // In C, printf is a redecl of an implicit builtin! So check OrigD instead. + if (ASTNode.OrigD->isImplicit() || + !shouldCollectSymbol(*ND, *ASTCtx, Opts, IsMainFileOnly)) return true; // Do not store references to main-file symbols. if (CollectRef && !IsMainFileOnly && !isa<NamespaceDecl>(ND) && diff --git a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp index f7b125b99ae..ee6ebc724e4 100644 --- a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp +++ b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp @@ -254,9 +254,8 @@ public: auto Factory = llvm::make_unique<SymbolIndexActionFactory>( CollectorOpts, PragmaHandler.get()); - std::vector<std::string> Args = { - "symbol_collector", "-fsyntax-only", "-xc++", - "-std=c++11", "-include", TestHeaderName}; + std::vector<std::string> Args = {"symbol_collector", "-fsyntax-only", + "-xc++", "-include", TestHeaderName}; Args.insert(Args.end(), ExtraArgs.begin(), ExtraArgs.end()); // This allows to override the "-xc++" with something else, i.e. // -xobjective-c++. @@ -1165,6 +1164,15 @@ TEST_F(SymbolCollectorTest, UsingDecl) { EXPECT_THAT(Symbols, Contains(QName("std::foo"))); } +TEST_F(SymbolCollectorTest, CBuiltins) { + // In C, printf in stdio.h is a redecl of an implicit builtin. + const char *Header = R"( + extern int printf(const char*, ...); + )"; + runSymbolCollector(Header, /**/ "", {"-xc"}); + EXPECT_THAT(Symbols, Contains(QName("printf"))); +} + } // namespace } // namespace clangd } // namespace clang |

