[clangd] Fix a crash bug in AddUsing tweak around template handling.

Summary:
The crash happened on cases like:
template<typename TT> using one = two::three<T^T>;
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
This commit is contained in:
Adam Czachorowski 2020-04-08 13:42:10 +02:00 committed by Sam McCall
parent a59008a3a5
commit cca10be3f6
2 changed files with 10 additions and 3 deletions

View File

@ -206,9 +206,11 @@ bool AddUsing::prepare(const Selection &Inputs) {
Name = D->getDecl()->getName();
} else if (auto *T = Node->ASTNode.get<TypeLoc>()) {
if (auto E = T->getAs<ElaboratedTypeLoc>()) {
QualifierToRemove = E.getQualifierLoc();
Name =
E.getType().getUnqualifiedType().getBaseTypeIdentifier()->getName();
if (auto *BaseTypeIdentifier =
E.getType().getUnqualifiedType().getBaseTypeIdentifier()) {
Name = BaseTypeIdentifier->getName();
QualifierToRemove = E.getQualifierLoc();
}
}
}

View File

@ -2436,6 +2436,7 @@ TEST_F(AddUsingTest, Prepare) {
#define NS(name) one::two::name
namespace one {
void oo() {}
template<typename TT> 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<typename TT> using foo = one::tt<T^T>;");
}
TEST_F(AddUsingTest, Apply) {