Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 270969)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -167,7 +167,16 @@
           dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl());
       if (!BasePrimaryTemplate)
         continue;
-      BaseRD = BasePrimaryTemplate;
+      if (BasePrimaryTemplate != RD) {
+        BaseRD = BasePrimaryTemplate;
+      } else {
+        // Check partial specializations if base primary template was the same.
+        if (auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
+          auto *PS = CTD->findPartialSpecialization(Base.getType());
+          if (PS && PS != RD)
+            BaseRD = PS;
+        }
+      }
     }
     if (BaseRD) {
       for (NamedDecl *ND : BaseRD->lookup(&II)) {
Index: test/SemaTemplate/ms-lookup-template-base-classes.cpp
===================================================================
--- test/SemaTemplate/ms-lookup-template-base-classes.cpp	(revision 270969)
+++ test/SemaTemplate/ms-lookup-template-base-classes.cpp	(working copy)
@@ -603,3 +603,34 @@
 template struct UseUnqualifiedTypeNames<Base>;
 struct BadBase { };
 template struct UseUnqualifiedTypeNames<BadBase>; // expected-note-re 2 {{in instantiation {{.*}} requested here}}
+
+
+namespace partial_template_lookup {
+  
+class Bar;
+class Spare;
+
+template <class T, class X = Bar>
+class FooTemplated;
+
+class FooBase {
+public:
+  typedef int BaseTypedef;
+};
+
+// Partial template spec (unused)
+template <class T>
+class FooTemplated<T, Spare> {};
+
+// Partial template spec (used)
+template <class T>
+class FooTemplated<T, Bar> : public FooBase {};
+
+// Full template spec
+template <class T, class X>
+class FooTemplated : public FooTemplated<T, Bar> {
+public:
+  BaseTypedef Member; // expected-warning {{unqualified lookup}}
+};
+
+}
