]> granicus.if.org Git - clang/commitdiff
[index] Avoid a crash that happens when looking up a dependent name
authorAlex Lorenz <arphaman@gmail.com>
Mon, 15 May 2017 10:20:39 +0000 (10:20 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Mon, 15 May 2017 10:20:39 +0000 (10:20 +0000)
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

lib/Index/IndexBody.cpp
lib/Index/IndexTypeSourceInfo.cpp
test/Index/Core/index-dependent-source.cpp

index 9439c11dac07e63ac5c81920cb305d9b5e716bbc..08d233fb83e040f834b8693251cbd96d81900ce3 100644 (file)
@@ -165,6 +165,9 @@ public:
     if (!TD)
       return true;
     CXXRecordDecl *RD = TD->getTemplatedDecl();
+    if (!RD->hasDefinition())
+      return true;
+    RD = RD->getDefinition();
     std::vector<const NamedDecl *> Symbols =
         RD->lookupDependentName(NameInfo.getName(), Filter);
     // FIXME: Improve overload handling.
index 7e2041c6cb0e7d3a3a434ae4deaf58c7d381cfd4..e9ca651e002f18f2050cbfaaa9ec9a2e253e7edd 100644 (file)
@@ -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<const NamedDecl *> Symbols = RD->lookupDependentName(
         Name, [](const NamedDecl *ND) { return isa<TypeDecl>(ND); });
index 35f5cf45c35a664b6ac7f0f5a46ccbd6636d1f45..25410799a86e03a9c4df996c34ff1fae14526429 100644 (file)
@@ -122,3 +122,12 @@ void indexDependentOverloads(const TemplateClass<T, S> &object) {
   object.overload1(Y());
 // CHECK-NOT: [[@LINE-1]]
 }
+
+template<typename T> struct UndefinedTemplateClass;
+
+template<typename T>
+void undefinedTemplateLookup(UndefinedTemplateClass<T> &x) {
+// Shouldn't crash!
+  x.lookup;
+  typename UndefinedTemplateClass<T>::Type y;
+}