Improve instantiation of UnresolvedUsingDecls.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80434 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 6c1f011..5978dae 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -757,9 +757,14 @@
   SS.setRange(D->getTargetNestedNameRange());
   SS.setScopeRep(NNS);
   
-  return SemaRef.BuildUsingDeclaration(D->getLocation(), SS, 
-                                       D->getTargetNameLocation(), 
-                                       D->getTargetName(), 0, D->isTypeName());
+  NamedDecl *UD = 
+    SemaRef.BuildUsingDeclaration(D->getLocation(), SS, 
+                                  D->getTargetNameLocation(), 
+                                  D->getTargetName(), 0, D->isTypeName());
+  if (UD)
+    SemaRef.Context.setInstantiatedFromUnresolvedUsingDecl(cast<UsingDecl>(UD), 
+                                                           D);
+  return UD;
 }
 
 Decl *Sema::SubstDecl(Decl *D, DeclContext *Owner,
@@ -1220,6 +1225,12 @@
   return false;
 }
 
+static bool isInstantiationOf(UnresolvedUsingDecl *Pattern,
+                              UsingDecl *Instance,
+                              ASTContext &C) {
+  return C.getInstantiatedFromUnresolvedUsingDecl(Instance) == Pattern;
+}
+
 static bool isInstantiationOfStaticDataMember(VarDecl *Pattern,
                                               VarDecl *Instance) {
   assert(Instance->isStaticDataMember());
@@ -1236,9 +1247,16 @@
 }
 
 static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) {
-  if (D->getKind() != Other->getKind())
-    return false;
+  if (D->getKind() != Other->getKind()) {
+    if (UnresolvedUsingDecl *UUD = dyn_cast<UnresolvedUsingDecl>(D)) {
+      if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
+        return isInstantiationOf(UUD, UD, Ctx);
+      }
+    }
 
+    return false;
+  }
+  
   if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other))
     return isInstantiationOf(cast<CXXRecordDecl>(D), Record);