Author: Haojian Wu Date: 2022-12-13T12:19:41+01:00 New Revision: bcb457c68e20120f0bdd0a59e4b4ce90b8121310
URL: https://github.com/llvm/llvm-project/commit/bcb457c68e20120f0bdd0a59e4b4ce90b8121310 DIFF: https://github.com/llvm/llvm-project/commit/bcb457c68e20120f0bdd0a59e4b4ce90b8121310.diff LOG: [clangd] Fix a semantic highlighting crash on dependent code. Added: Modified: clang-tools-extra/clangd/SemanticHighlighting.cpp clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 6745e2594ead3..f667567407793 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -619,14 +619,14 @@ class CollectExtraHighlightings bool VisitCXXNewExpr(CXXNewExpr *E) { auto &Token = H.addToken(E->getBeginLoc(), HighlightingKind::Operator); - if (isa<CXXMethodDecl>(E->getOperatorNew())) + if (isa_and_present<CXXMethodDecl>(E->getOperatorNew())) Token.addModifier(HighlightingModifier::UserDefined); return true; } bool VisitCXXDeleteExpr(CXXDeleteExpr *E) { auto &Token = H.addToken(E->getBeginLoc(), HighlightingKind::Operator); - if (isa<CXXMethodDecl>(E->getOperatorDelete())) + if (isa_and_present<CXXMethodDecl>(E->getOperatorDelete())) Token.addModifier(HighlightingModifier::UserDefined); return true; } diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp index de3d099986fe9..bc890bf088a52 100644 --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -932,6 +932,16 @@ sizeof...($TemplateParameter[[Elements]]); auto $LocalVariable_def[[k]] = $Operator[[&]]$Class[[Foo]]::$Method[[foo]]; ($Parameter[[f]]$Operator[[.*]]$LocalVariable[[k]])(); // no crash on VisitCXXMemberCallExpr } + )cpp", + R"cpp( + template<typename> + class $Class_def[[Foo]] {}; + + template<typename $TemplateParameter_def[[T]]> + void $Function_def[[k]]() { + auto $LocalVariable_def[[s]] = $Operator[[new]] $Class[[Foo]]<$TemplateParameter[[T]]>(); + $Operator[[delete]] $LocalVariable[[s]]; + } )cpp"}; for (const auto &TestCase : TestCases) // Mask off scope modifiers to keep the tests manageable. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits