[PATCH] D83143: [clangd] Fix hover crash on invalid decls

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 3 11:59:01 PDT 2020


kadircet created this revision.
kadircet added a reviewer: sammccall.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, ilya-biryukov.
Herald added a project: clang.

This also changes the way we display Size and Offset to be independent.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83143

Files:
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp


Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -772,6 +772,22 @@
          HI.CallPassType->PassBy = PassMode::Value;
          HI.CallPassType->Converted = false;
        }},
+      {// Dont crash on invalid decl
+       R"cpp(
+        // error-ok
+        struct Foo {
+          Bar [[x^x]];
+        };)cpp",
+       [](HoverInfo &HI) {
+         HI.Name = "xx";
+         HI.Kind = index::SymbolKind::Field;
+         HI.NamespaceScope = "";
+         HI.Definition = "int xx";
+         HI.LocalScope = "Foo::";
+         HI.Size = 4;
+         HI.Type = "int";
+         HI.AccessSpecifier = "public";
+       }},
   };
   for (const auto &Case : Cases) {
     SCOPED_TRACE(Case.Code);
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -672,9 +672,10 @@
     if (Record)
       Record = Record->getDefinition();
     if (Record && !Record->isDependentType()) {
-      uint64_t OffsetBits = Ctx.getFieldOffset(FD);
-      if (auto Size = Ctx.getTypeSizeInCharsIfKnown(FD->getType())) {
+      if (auto Size = Ctx.getTypeSizeInCharsIfKnown(FD->getType()))
         HI.Size = Size->getQuantity();
+      if (!FD->isInvalidDecl()) {
+        uint64_t OffsetBits = Ctx.getFieldOffset(FD);
         HI.Offset = OffsetBits / 8;
       }
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83143.275447.patch
Type: text/x-patch
Size: 1575 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200703/5446d009/attachment.bin>


More information about the cfe-commits mailing list