Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp	(revision 186715)
+++ lib/Sema/SemaDeclCXX.cpp	(working copy)
@@ -3353,33 +3353,40 @@
       Info.AllBaseFields[Member->getAnyMember()] = Member;
   }
 
-  // Keep track of the direct virtual bases.
-  llvm::SmallPtrSet<CXXBaseSpecifier *, 16> DirectVBases;
-  for (CXXRecordDecl::base_class_iterator I = ClassDecl->bases_begin(),
-       E = ClassDecl->bases_end(); I != E; ++I) {
-    if (I->isVirtual())
-      DirectVBases.insert(I);
-  }
+  // Ignore virtual base classes of abstract classes, because
+  // abstract classes can impossibly be the most-derived class,
+  // and therefore never have to initialize their virtual bases.
+  if (!ClassDecl->isAbstract()) {
 
-  // Push virtual bases before others.
-  for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(),
-       E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
+    // Keep track of the direct virtual bases.
+    llvm::SmallPtrSet<CXXBaseSpecifier *, 16> DirectVBases;
+    for (CXXRecordDecl::base_class_iterator I = ClassDecl->bases_begin(),
+         E = ClassDecl->bases_end(); I != E; ++I) {
+      if (I->isVirtual())
+        DirectVBases.insert(I);
+    }
 
-    if (CXXCtorInitializer *Value
-        = Info.AllBaseFields.lookup(VBase->getType()->getAs<RecordType>())) {
-      Info.AllToInit.push_back(Value);
-    } else if (!AnyErrors) {
-      bool IsInheritedVirtualBase = !DirectVBases.count(VBase);
-      CXXCtorInitializer *CXXBaseInit;
-      if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
-                                       VBase, IsInheritedVirtualBase, 
-                                       CXXBaseInit)) {
-        HadError = true;
-        continue;
+    // Push virtual bases before others.
+    for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(),
+         E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
+
+      if (CXXCtorInitializer *Value
+          = Info.AllBaseFields.lookup(VBase->getType()->getAs<RecordType>())) {
+        Info.AllToInit.push_back(Value);
+      } else if (!AnyErrors) {
+        bool IsInheritedVirtualBase = !DirectVBases.count(VBase);
+        CXXCtorInitializer *CXXBaseInit;
+        if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
+                                         VBase, IsInheritedVirtualBase, 
+                                         CXXBaseInit)) {
+          HadError = true;
+          continue;
+        }
+
+        Info.AllToInit.push_back(CXXBaseInit);
       }
+    }
 
-      Info.AllToInit.push_back(CXXBaseInit);
-    }
   }
 
   // Non-virtual bases.
@@ -5055,10 +5062,14 @@
         SMI.shouldDeleteForBase(BI))
       return true;
 
-  for (CXXRecordDecl::base_class_iterator BI = RD->vbases_begin(),
-                                          BE = RD->vbases_end(); BI != BE; ++BI)
-    if (SMI.shouldDeleteForBase(BI))
-      return true;
+  // Ignore virtual base classes of abstract classes, because
+  // abstract classes can impossibly be the most-derived class,
+  // and therefore never have to initialize their virtual bases.
+  if (!RD->isAbstract())
+    for (CXXRecordDecl::base_class_iterator BI = RD->vbases_begin(),
+                                            BE = RD->vbases_end(); BI != BE; ++BI)
+      if (SMI.shouldDeleteForBase(BI))
+        return true;
 
   for (CXXRecordDecl::field_iterator FI = RD->field_begin(),
                                      FE = RD->field_end(); FI != FE; ++FI)
Index: test/SemaCXX/abstract.cpp
===================================================================
--- test/SemaCXX/abstract.cpp	(revision 186715)
+++ test/SemaCXX/abstract.cpp	(working copy)
@@ -273,3 +273,15 @@
     foo(C(99)); // expected-error {{allocating an object of abstract class type 'pr12658::C'}}
   }
 }
+
+namespace pr16659 {
+  struct A {
+    A(int);
+    virtual void x() = 0;
+  };
+  struct B : virtual A {};
+  struct C : B {
+    C() : A(37) {}
+    void x() override {}
+  };
+}
