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; } }
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; } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits