diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 5f00c67..198fd43 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -3101,6 +3101,16 @@
   }
 }
 
+CXXBaseSpecifier
+PCHReader::ReadCXXBaseSpecifier(const RecordData &Record, unsigned &Idx) {
+  bool isVirtual = static_cast<bool>(Record[Idx++]);
+  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
+  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
+  QualType T = GetType(Record[Idx++]);
+  SourceRange Range = ReadSourceRange(Record, Idx);
+  return CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, T);
+}
+
 NestedNameSpecifier *
 PCHReader::ReadNestedNameSpecifier(const RecordData &Record, unsigned &Idx) {
   unsigned N = Record[Idx++];
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index fa7382c..211032b 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -39,8 +39,6 @@
                   unsigned &Idx)
       : Reader(Reader), Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
 
-    CXXBaseSpecifier ReadCXXBaseSpecifier();
-
     void Visit(Decl *D);
 
     void VisitDecl(Decl *D);
@@ -635,15 +633,6 @@
   D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
 }
 
-CXXBaseSpecifier PCHDeclReader::ReadCXXBaseSpecifier() {
-  bool isVirtual = static_cast<bool>(Record[Idx++]);
-  bool isBaseOfClass = static_cast<bool>(Record[Idx++]);
-  AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]);
-  QualType T = Reader.GetType(Record[Idx++]);
-  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
-  return CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, T);
-}
-
 void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
   VisitRecordDecl(D);
 
@@ -676,13 +665,13 @@
       Data.NumBases = Record[Idx++];
       Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
       for (unsigned i = 0; i != Data.NumBases; ++i)
-        Data.Bases[i] = ReadCXXBaseSpecifier();
+        Data.Bases[i] = Reader.ReadCXXBaseSpecifier(Record, Idx);
 
       // FIXME: Make VBases lazily computed when needed to avoid storing them.
       Data.NumVBases = Record[Idx++];
       Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
       for (unsigned i = 0; i != Data.NumVBases; ++i)
-        Data.VBases[i] = ReadCXXBaseSpecifier();
+        Data.VBases[i] = Reader.ReadCXXBaseSpecifier(Record, Idx);
 
       Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
       Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp
index c2dea3a..28641e8 100644
--- a/lib/Frontend/PCHReaderStmt.cpp
+++ b/lib/Frontend/PCHReaderStmt.cpp
@@ -537,6 +537,14 @@
   VisitExpr(E);
   E->setSubExpr(Reader.ReadSubExpr());
   E->setCastKind((CastExpr::CastKind)Record[Idx++]);
+  CXXBaseSpecifierArray &BasePath = E->getBasePath();
+  unsigned NumBaseSpecs = Record[Idx++];
+  while (NumBaseSpecs--) {
+    // FIXME: These gets leaked.
+    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
+    *BaseSpec = Reader.ReadCXXBaseSpecifier(Record, Idx);
+    BasePath.push_back(BaseSpec);
+  }
 }
 
 void PCHStmtReader::VisitBinaryOperator(BinaryOperator *E) {
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp
index 65e8849..52db0ee 100644
--- a/lib/Frontend/PCHWriter.cpp
+++ b/lib/Frontend/PCHWriter.cpp
@@ -2632,3 +2632,12 @@
     Record.push_back(I.getAccess());
   }
 }
+
+void PCHWriter::AddCXXBaseSpecifier(const CXXBaseSpecifier &Base,
+                                    RecordData &Record) {
+  Record.push_back(Base.isVirtual());
+  Record.push_back(Base.isBaseOfClass());
+  Record.push_back(Base.getAccessSpecifierAsWritten());
+  AddTypeRef(Base.getType(), Record);
+  AddSourceRange(Base.getSourceRange(), Record);
+}
diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp
index 41e8a01..411a125 100644
--- a/lib/Frontend/PCHWriterDecl.cpp
+++ b/lib/Frontend/PCHWriterDecl.cpp
@@ -109,8 +109,6 @@
     void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
     void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
     void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
-
-    void WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base);
   };
 }
 
@@ -634,14 +632,6 @@
   Code = pch::DECL_UNRESOLVED_USING_TYPENAME;
 }
 
-void PCHDeclWriter::WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base) {
-  Record.push_back(Base->isVirtual());
-  Record.push_back(Base->isBaseOfClass());
-  Record.push_back(Base->getAccessSpecifierAsWritten());
-  Writer.AddTypeRef(Base->getType(), Record);
-  Writer.AddSourceRange(Base->getSourceRange(), Record);
-}
-
 void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
   VisitRecordDecl(D);
 
@@ -670,13 +660,13 @@
       Record.push_back(D->getNumBases());
       for (CXXRecordDecl::base_class_iterator I = D->bases_begin(),
              E = D->bases_end(); I != E; ++I)
-        WriteCXXBaseSpecifier(&*I);
+        Writer.AddCXXBaseSpecifier(*I, Record);
 
       // FIXME: Make VBases lazily computed when needed to avoid storing them.
       Record.push_back(D->getNumVBases());
       for (CXXRecordDecl::base_class_iterator I = D->vbases_begin(),
              E = D->vbases_end(); I != E; ++I)
-        WriteCXXBaseSpecifier(&*I);
+        Writer.AddCXXBaseSpecifier(*I, Record);
 
       Writer.AddUnresolvedSet(Data.Conversions, Record);
       Writer.AddUnresolvedSet(Data.VisibleConversions, Record);
diff --git a/lib/Frontend/PCHWriterStmt.cpp b/lib/Frontend/PCHWriterStmt.cpp
index 12fcde8..91f9353 100644
--- a/lib/Frontend/PCHWriterStmt.cpp
+++ b/lib/Frontend/PCHWriterStmt.cpp
@@ -529,6 +529,11 @@
   VisitExpr(E);
   Writer.AddStmt(E->getSubExpr());
   Record.push_back(E->getCastKind()); // FIXME: stable encoding
+  CXXBaseSpecifierArray &BasePath = E->getBasePath();
+  Record.push_back(BasePath.size());
+  for (CXXBaseSpecifierArray::iterator I = BasePath.begin(), E = BasePath.end();
+       I != E; ++I)
+    Writer.AddCXXBaseSpecifier(**I, Record);
 }
 
 void PCHStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
