diff options
author | Haojian Wu <hokein.wu@gmail.com> | 2022-10-31 09:58:58 +0100 |
---|---|---|
committer | Haojian Wu <hokein.wu@gmail.com> | 2022-10-31 11:19:01 +0100 |
commit | 1258747a59db5200112fca7c6140d184f3b8748e (patch) | |
tree | 29daef1d0b2a3cd46d1c4939a3b6c573dea106ac | |
parent | e0b40af7228c24022c98e3201b66fc650c3941a2 (diff) | |
download | llvm-1258747a59db5200112fca7c6140d184f3b8748e.zip llvm-1258747a59db5200112fca7c6140d184f3b8748e.tar.gz llvm-1258747a59db5200112fca7c6140d184f3b8748e.tar.bz2 |
[clangd] Fix a semantic-highlighting crash.
Differential Revision: https://reviews.llvm.org/D137064
-rw-r--r-- | clang-tools-extra/clangd/SemanticHighlighting.cpp | 4 | ||||
-rw-r--r-- | clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 08cca22..af3a3e6 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -661,7 +661,9 @@ public: } bool VisitCXXMemberCallExpr(CXXMemberCallExpr *CE) { - if (isa<CXXDestructorDecl>(CE->getMethodDecl())) { + // getMethodDecl can return nullptr with member pointers, e.g. + // `(foo.*pointer_to_member_fun)(arg);` + if (isa_and_present<CXXDestructorDecl>(CE->getMethodDecl())) { if (auto *ME = dyn_cast<MemberExpr>(CE->getCallee())) { if (auto *TI = ME->getMemberNameInfo().getNamedTypeInfo()) { H.addExtraModifier(TI->getTypeLoc().getBeginLoc(), diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index 3666f1e..9abc49b 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -887,6 +887,17 @@ sizeof...($TemplateParameter[[Elements]]); $TemplateParameter[[T]] $Variable_def[[x]] = {}; template <> int $Variable_def[[x]]<int> = (int)sizeof($Class[[Base]]); + )cpp", + // no crash + R"cpp( + struct $Class_def[[Foo]] { + void $Method_decl[[foo]](); + }; + + void $Function_def[[s]]($Class[[Foo]] $Parameter_def[[f]]) { + auto $LocalVariable_def[[k]] = &$Class[[Foo]]::$Method[[foo]]; + ($Parameter[[f]].*$LocalVariable[[k]])(); // no crash on VisitCXXMemberCallExpr + } )cpp"}; for (const auto &TestCase : TestCases) // Mask off scope modifiers to keep the tests manageable. |