From cca10be3f60dd30055acc70d117649f889da779d Mon Sep 17 00:00:00 2001 From: Adam Czachorowski Date: Wed, 8 Apr 2020 13:42:10 +0200 Subject: [PATCH] [clangd] Fix a crash bug in AddUsing tweak around template handling. Summary: The crash happened on cases like: template using one = two::three; because we tried to call getName() on getBaseTypeIdentifier(), which can be nullptr. Ideally we would support this use case as well, but for now not crashing will do. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D77656 --- clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp | 8 +++++--- clang-tools-extra/clangd/unittests/TweakTests.cpp | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp index 411c685e2b7d..f2ef235c43f7 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp @@ -206,9 +206,11 @@ bool AddUsing::prepare(const Selection &Inputs) { Name = D->getDecl()->getName(); } else if (auto *T = Node->ASTNode.get()) { if (auto E = T->getAs()) { - QualifierToRemove = E.getQualifierLoc(); - Name = - E.getType().getUnqualifiedType().getBaseTypeIdentifier()->getName(); + if (auto *BaseTypeIdentifier = + E.getType().getUnqualifiedType().getBaseTypeIdentifier()) { + Name = BaseTypeIdentifier->getName(); + QualifierToRemove = E.getQualifierLoc(); + } } } diff --git a/clang-tools-extra/clangd/unittests/TweakTests.cpp b/clang-tools-extra/clangd/unittests/TweakTests.cpp index 979ee44f4474..b93cca23e6b6 100644 --- a/clang-tools-extra/clangd/unittests/TweakTests.cpp +++ b/clang-tools-extra/clangd/unittests/TweakTests.cpp @@ -2436,6 +2436,7 @@ TEST_F(AddUsingTest, Prepare) { #define NS(name) one::two::name namespace one { void oo() {} +template class tt {}; namespace two { enum ee {}; void ff() {} @@ -2458,6 +2459,10 @@ public: EXPECT_UNAVAILABLE(Header + "void fun() { o^n^e^:^:^t^w^o^:^:^c^c^:^:^s^t inst; }"); EXPECT_UNAVAILABLE(Header + "void fun() { N^S(c^c) inst; }"); + // This used to crash. Ideally we would support this case, but for now we just + // test that we don't crash. + EXPECT_UNAVAILABLE(Header + + "template using foo = one::tt;"); } TEST_F(AddUsingTest, Apply) { -- 2.34.1