From: Alex Lorenz Date: Mon, 15 May 2017 10:20:39 +0000 (+0000) Subject: [index] Avoid a crash that happens when looking up a dependent name X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c14490d8a1bffaff51996c6c0619242f35725fa;p=clang [index] Avoid a crash that happens when looking up a dependent name in a record that has no definition rdar://32194921 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@303045 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Index/IndexBody.cpp b/lib/Index/IndexBody.cpp index 9439c11dac..08d233fb83 100644 --- a/lib/Index/IndexBody.cpp +++ b/lib/Index/IndexBody.cpp @@ -165,6 +165,9 @@ public: if (!TD) return true; CXXRecordDecl *RD = TD->getTemplatedDecl(); + if (!RD->hasDefinition()) + return true; + RD = RD->getDefinition(); std::vector Symbols = RD->lookupDependentName(NameInfo.getName(), Filter); // FIXME: Improve overload handling. diff --git a/lib/Index/IndexTypeSourceInfo.cpp b/lib/Index/IndexTypeSourceInfo.cpp index 7e2041c6cb..e9ca651e00 100644 --- a/lib/Index/IndexTypeSourceInfo.cpp +++ b/lib/Index/IndexTypeSourceInfo.cpp @@ -157,6 +157,9 @@ public: if (!TD) return true; CXXRecordDecl *RD = TD->getTemplatedDecl(); + if (!RD->hasDefinition()) + return true; + RD = RD->getDefinition(); DeclarationName Name(DNT->getIdentifier()); std::vector Symbols = RD->lookupDependentName( Name, [](const NamedDecl *ND) { return isa(ND); }); diff --git a/test/Index/Core/index-dependent-source.cpp b/test/Index/Core/index-dependent-source.cpp index 35f5cf45c3..25410799a8 100644 --- a/test/Index/Core/index-dependent-source.cpp +++ b/test/Index/Core/index-dependent-source.cpp @@ -122,3 +122,12 @@ void indexDependentOverloads(const TemplateClass &object) { object.overload1(Y()); // CHECK-NOT: [[@LINE-1]] } + +template struct UndefinedTemplateClass; + +template +void undefinedTemplateLookup(UndefinedTemplateClass &x) { +// Shouldn't crash! + x.lookup; + typename UndefinedTemplateClass::Type y; +}