[clang-tools-extra] 6a78c55 - [clangd] Fix a crash for accessing a null field decl returned by findExplicitReferences.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 15 12:42:37 PDT 2020


Author: Haojian Wu
Date: 2020-04-15T21:42:27+02:00
New Revision: 6a78c55e3af0fc98513bf7e0b76b3b88719ca2c3

URL: https://github.com/llvm/llvm-project/commit/6a78c55e3af0fc98513bf7e0b76b3b88719ca2c3
DIFF: https://github.com/llvm/llvm-project/commit/6a78c55e3af0fc98513bf7e0b76b3b88719ca2c3.diff

LOG: [clangd] Fix a crash for accessing a null field decl returned by findExplicitReferences.

Reviewers: sammccall

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

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

Added: 
    

Modified: 
    clang-tools-extra/clangd/FindTarget.cpp
    clang-tools-extra/clangd/unittests/FindTargetTests.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp
index 27f6532bf5ac..1ff20e6e4bc1 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -714,10 +714,12 @@ llvm::SmallVector<ReferenceLoc, 2> refInExpr(const Expr *E) {
       for (const DesignatedInitExpr::Designator &D : DIE->designators()) {
         if (!D.isFieldDesignator())
           continue;
-        Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(),
-                                    D.getFieldLoc(),
-                                    /*IsDecl=*/false,
-                                    {D.getField()}});
+
+        llvm::SmallVector<const NamedDecl *, 1> Targets;
+        if (D.getField())
+          Targets.push_back(D.getField());
+        Refs.push_back(ReferenceLoc{NestedNameSpecifierLoc(), D.getFieldLoc(),
+                                    /*IsDecl=*/false, std::move(Targets)});
       }
     }
   };

diff  --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index beb81a7c8054..f943772e052e 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -1273,7 +1273,20 @@ TEST_F(FindExplicitReferencesTest, All) {
         "5: targets = {Bar}\n"
         "6: targets = {bar}, decl\n"
         "7: targets = {foo()::Bar::Foo}\n"
-        "8: targets = {foo()::Baz::Field}\n"}};
+        "8: targets = {foo()::Baz::Field}\n"},
+      {R"cpp(
+           template<typename T>
+           void crash(T);
+           template<typename T>
+           void foo() {
+             $0^crash({.$1^x = $2^T()});
+           }
+        )cpp",
+        "0: targets = {crash}\n"
+        "1: targets = {}\n"
+        "2: targets = {T}\n"
+      },
+    };
 
   for (const auto &C : Cases) {
     llvm::StringRef ExpectedCode = C.first;


        


More information about the cfe-commits mailing list