diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -1851,7 +1851,8 @@ if (const VarDecl *VD = dyn_cast(D)) { // If this is a variable, use the type of the variable. - Records.push_back(VD->getType().getTypePtr()->getAsCXXRecordDecl()); + if (const auto *RD = VD->getType().getTypePtr()->getAsCXXRecordDecl()) + Records.push_back(RD); continue; } diff --git a/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp b/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp --- a/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp +++ b/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp @@ -78,6 +78,19 @@ } } +TEST(FindRecordTypeAt, Nonexistent) { + Annotations Source(R"cpp( + int *wa^ldo; + )cpp"); + TestTU TU = TestTU::withCode(Source.code()); + auto AST = TU.build(); + + for (Position Pt : Source.points()) { + auto Records = findRecordTypeAt(AST, Pt); + ASSERT_THAT(Records, SizeIs(0)); + } +} + TEST(FindRecordTypeAt, Method) { Annotations Source(R"cpp( struct Child2 { @@ -119,7 +132,7 @@ for (Position Pt : Source.points()) { // A field does not unambiguously specify a record type - // (possible associated reocrd types could be the field's type, + // (possible associated record types could be the field's type, // or the type of the record that the field is a member of). EXPECT_THAT(findRecordTypeAt(AST, Pt), SizeIs(0)); }