diff options
author | Nathan Ridge <zeratul976@hotmail.com> | 2023-08-25 11:16:04 -0400 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2023-11-20 10:04:33 +0100 |
commit | a71237b9f67fdf1a9bd779f33fa91453cd1bb72c (patch) | |
tree | ab39db285262d8e3d46394da9242f0307c1c60b3 | |
parent | Bump version to 17.0.6 (diff) | |
download | llvm-project-a71237b9f67fdf1a9bd779f33fa91453cd1bb72c.tar.gz llvm-project-a71237b9f67fdf1a9bd779f33fa91453cd1bb72c.tar.bz2 llvm-project-a71237b9f67fdf1a9bd779f33fa91453cd1bb72c.zip |
[clangd] Avoid null result in FindRecordTypeAt()
Fixes https://github.com/clangd/clangd/issues/1743
Differential Revision: https://reviews.llvm.org/D158851
(cherry picked from commit 1994e1173b64b61c07f8acf107f29c2c015575b4)
-rw-r--r-- | clang-tools-extra/clangd/XRefs.cpp | 3 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp | 15 |
2 files changed, 16 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index da1a803daebb..f81e022085bf 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -1857,7 +1857,8 @@ std::vector<const CXXRecordDecl *> findRecordTypeAt(ParsedAST &AST, if (const VarDecl *VD = dyn_cast<VarDecl>(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 index a73ae78766c3..2f82ec7444d7 100644 --- a/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp +++ b/clang-tools-extra/clangd/unittests/TypeHierarchyTests.cpp @@ -78,6 +78,19 @@ int main() { } } +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 @@ int main() { 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)); } |