[clang-tools-extra] r364747 - [clangd] No longer getting template instantiations from header files in Main AST.

Johan Vikstrom via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 1 04:49:01 PDT 2019


Author: jvikstrom
Date: Mon Jul  1 04:49:01 2019
New Revision: 364747

URL: http://llvm.org/viewvc/llvm-project?rev=364747&view=rev
Log:
[clangd] No longer getting template instantiations from header files in Main AST.

Previous implementation to filter decls not in the main file did not
work in the case where a template was instantiated from a header in the
main file. It would than include that function/class in topLevelDecls.

Differential Revision: https://reviews.llvm.org/D63817

Modified:
    clang-tools-extra/trunk/clangd/ClangdUnit.cpp
    clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp

Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=364747&r1=364746&r2=364747&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Mon Jul  1 04:49:01 2019
@@ -67,7 +67,8 @@ public:
 
   bool HandleTopLevelDecl(DeclGroupRef DG) override {
     for (Decl *D : DG) {
-      if (D->isFromASTFile())
+      auto &SM = D->getASTContext().getSourceManager();
+      if (!SM.isWrittenInMainFile(SM.getExpansionLoc(D->getLocation())))
         continue;
 
       // ObjCMethodDecl are not actually top-level decls.

Modified: clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp?rev=364747&r1=364746&r2=364747&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp Mon Jul  1 04:49:01 2019
@@ -83,6 +83,26 @@ TEST(ClangdUnitTest, TopLevelDecls) {
   EXPECT_THAT(AST.getLocalTopLevelDecls(), ElementsAre(DeclNamed("main")));
 }
 
+TEST(ClangdUnitTest, DoesNotGetIncludedTopDecls) {
+  TestTU TU;
+  TU.HeaderCode = R"cpp(
+    #define LL void foo(){}
+    template<class T>
+    struct H {
+      H() {}
+      LL
+    };
+  )cpp";
+  TU.Code = R"cpp(
+    int main() {
+      H<int> h;
+      h.foo();
+    }
+  )cpp";
+  auto AST = TU.build();
+  EXPECT_THAT(AST.getLocalTopLevelDecls(), ElementsAre(DeclNamed("main")));
+}
+
 TEST(ClangdUnitTest, TokensAfterPreamble) {
   TestTU TU;
   TU.AdditionalFiles["foo.h"] = R"(




More information about the cfe-commits mailing list