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
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();
+ }
}
}
#define NS(name) one::two::name
namespace one {
void oo() {}
+template<typename TT> class tt {};
namespace two {
enum ee {};
void ff() {}
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) {