From: Kadir Cetinkaya Date: Fri, 3 Jul 2020 18:52:41 +0000 (+0200) Subject: [clangd] Fix hover crash on invalid decls X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=50ba9f994c6f9c51692282494c3b40dbc69b4abd;p=android-x86%2Fexternal-llvm-project.git [clangd] Fix hover crash on invalid decls Summary: This also changes the way we display Size and Offset to be independent. Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D83143 --- diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index 616d4c91c0f..f495052d2d3 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -672,11 +672,10 @@ void addLayoutInfo(const NamedDecl &ND, HoverInfo &HI) { 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(); - HI.Offset = OffsetBits / 8; - } + if (!FD->isInvalidDecl()) + HI.Offset = Ctx.getFieldOffset(FD) / 8; } return; } diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 4059f8307c4..3be796a6fb8 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -772,6 +772,22 @@ class Foo {})cpp"; 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);