Author: hokein Date: Thu Feb 7 08:00:44 2019 New Revision: 353421 URL: http://llvm.org/viewvc/llvm-project?rev=353421&view=rev Log: [clangd] Fix an assertion failure in Selection.
Summary: The assertion is triggered when the Decl is null. Details for the assertion: F0207 09:55:09.069385 47308 logging.cc:84] assert.h assertion failed at llvm/include/llvm/Support/Casting.h:105 in static bool llvm::isa_impl_cl<clang::TranslationUnitDecl, const clang:: Decl *>::doit(const From *) [To = clang::TranslationUnitDecl, From = const clang::Decl *]: Val && "isa<> used on a null pointer" 15 *** Check failure stack trace: *** 19 @ 0x55615c1f7e06 __assert_fail 20 @ 0x55615a6297d8 clang::clangd::(anonymous namespace)::SelectionVisitor::TraverseDecl() 21 @ 0x55615a62f48d clang::RecursiveASTVisitor<>::TraverseTemplateTemplateParmDecl() 22 @ 0x55615a62b264 clang::RecursiveASTVisitor<>::TraverseDecl() 23 @ 0x55615a62979c clang::clangd::(anonymous namespace)::SelectionVisitor::TraverseDecl() 24 @ 0x55615a63060c clang::RecursiveASTVisitor<>::TraverseClassTemplatePartialSpecializationDecl() 25 @ 0x55615a62ae45 clang::RecursiveASTVisitor<>::TraverseDecl() Reviewers: sammccall Subscribers: javed.absar, kristof.beyls, ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D57879 Modified: clang-tools-extra/trunk/clangd/Selection.cpp clang-tools-extra/trunk/unittests/clangd/SelectionTests.cpp Modified: clang-tools-extra/trunk/clangd/Selection.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Selection.cpp?rev=353421&r1=353420&r2=353421&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Selection.cpp (original) +++ clang-tools-extra/trunk/clangd/Selection.cpp Thu Feb 7 08:00:44 2019 @@ -51,7 +51,7 @@ public: // - those that can't be stored in DynTypedNode. // We're missing some interesting things like Attr due to the latter. bool TraverseDecl(Decl *X) { - if (isa<TranslationUnitDecl>(X)) + if (X && isa<TranslationUnitDecl>(X)) return Base::TraverseDecl(X); // Already pushed by constructor. return traverseNode(X, [&] { return Base::TraverseDecl(X); }); } Modified: clang-tools-extra/trunk/unittests/clangd/SelectionTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SelectionTests.cpp?rev=353421&r1=353420&r2=353421&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/SelectionTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/SelectionTests.cpp Thu Feb 7 08:00:44 2019 @@ -176,6 +176,16 @@ TEST(SelectionTest, CommonAncestor) { // Node types that have caused problems in the past. {"template <typename T> void foo() { [[^T]] t; }", "TypeLoc"}, + + // No crash + { + R"cpp( + template <class T> struct Foo {}; + template <[[template<class> class /*cursor here*/^U]]> + struct Foo<U<int>*> {}; + )cpp", + "TemplateTemplateParmDecl" + }, }; for (const Case &C : Cases) { Annotations Test(C.Code); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits