diff --git a/include/clang/AST/CharUnits.h b/include/clang/AST/CharUnits.h
index 09ff6828ef5c2d92aeeb813664ab249d4eb3a82b..69dee4cdf67d964b883e323148698fc8768088f6 100644
--- a/include/clang/AST/CharUnits.h
+++ b/include/clang/AST/CharUnits.h
@@ -165,7 +165,7 @@ namespace clang {
       /// RoundUpToAlignment - Returns the next integer (mod 2**64) that is
       /// greater than or equal to this quantity and is a multiple of \p Align.
       /// Align must be non-zero.
-      CharUnits RoundUpToAlignment(const CharUnits &Align) {
+      CharUnits RoundUpToAlignment(const CharUnits &Align) const {
         return CharUnits(llvm::RoundUpToAlignment(Quantity, 
                                                   Align.Quantity));
       }
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h
index ca1071804491d7e92c8021635872517bc47c6165..4befb4506212778d324ed93dd8322d747b046c98 100644
--- a/include/clang/AST/RecordLayout.h
+++ b/include/clang/AST/RecordLayout.h
@@ -82,9 +82,9 @@ private:
     /// the size of the object without virtual bases.
     CharUnits NonVirtualSize;
 
-    /// NonVirtualAlign - The non-virtual alignment (in chars) of an object,
+    /// NonVirtualAlignment - The non-virtual alignment (in chars) of an object,
     /// which is the alignment of the object without virtual bases.
-    CharUnits NonVirtualAlign;
+    CharUnits NonVirtualAlignment;
 
     /// SizeOfLargestEmptySubobject - The size of the largest empty subobject
     /// (either a base or a member). Will be zero if the class doesn't contain
@@ -104,8 +104,9 @@ private:
     /// a primary base class.
     bool HasExtendableVFPtr : 1;
 
-    /// HasZeroSizedSubObject - True if this class contains a zero sized member or base or a base
-    /// with a zero sized member or base.  Only used for MS-ABI.
+    /// HasZeroSizedSubObject - True if this class contains a zero sized member
+    /// or base or a base with a zero sized member or base.  Only used for
+    /// MS-ABI.
     bool HasZeroSizedSubObject : 1;
 
     /// \brief True if this class is zero sized or first base is zero sized or
@@ -148,7 +149,7 @@ private:
                   CharUnits vbptroffset,
                   CharUnits datasize,
                   const uint64_t *fieldoffsets, unsigned fieldcount,
-                  CharUnits nonvirtualsize, CharUnits nonvirtualalign,
+                  CharUnits nonvirtualsize, CharUnits nonvirtualalignment,
                   CharUnits SizeOfLargestEmptySubobject,
                   const CXXRecordDecl *PrimaryBase,
                   bool IsPrimaryBaseVirtual,
@@ -198,10 +199,10 @@ public:
 
   /// getNonVirtualSize - Get the non-virtual alignment (in chars) of an object,
   /// which is the alignment of the object without virtual bases.
-  CharUnits getNonVirtualAlign() const {
+  CharUnits getNonVirtualAlignment() const {
     assert(CXXInfo && "Record layout does not have C++ specific info!");
 
-    return CXXInfo->NonVirtualAlign;
+    return CXXInfo->NonVirtualAlignment;
   }
 
   /// getPrimaryBase - Get the primary base for this record.
diff --git a/lib/AST/RecordLayout.cpp b/lib/AST/RecordLayout.cpp
index d72d5dcce0d8e730cde99ba59563488d0d0c2cf9..9d46cc60ca3f0bd75828437547897af61c1b4350 100644
--- a/lib/AST/RecordLayout.cpp
+++ b/lib/AST/RecordLayout.cpp
@@ -53,7 +53,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
                                  const uint64_t *fieldoffsets,
                                  unsigned fieldcount,
                                  CharUnits nonvirtualsize,
-                                 CharUnits nonvirtualalign,
+                                 CharUnits nonvirtualalignment,
                                  CharUnits SizeOfLargestEmptySubobject,
                                  const CXXRecordDecl *PrimaryBase,
                                  bool IsPrimaryBaseVirtual,
@@ -74,7 +74,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
   CXXInfo->PrimaryBase.setPointer(PrimaryBase);
   CXXInfo->PrimaryBase.setInt(IsPrimaryBaseVirtual);
   CXXInfo->NonVirtualSize = nonvirtualsize;
-  CXXInfo->NonVirtualAlign = nonvirtualalign;
+  CXXInfo->NonVirtualAlignment = nonvirtualalignment;
   CXXInfo->SizeOfLargestEmptySubobject = SizeOfLargestEmptySubobject;
   CXXInfo->BaseOffsets = BaseOffsets;
   CXXInfo->VBaseOffsets = VBaseOffsets;
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 832bfef90c950595057affc33585c8ffbdf1742a..5191cb2e73dd5c6897442b4556f189f7b21279e4 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -1189,7 +1189,7 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
     }
   }
   
-  CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlign();
+  CharUnits UnpackedBaseAlign = Layout.getNonVirtualAlignment();
   CharUnits BaseAlign = (Packed) ? CharUnits::One() : UnpackedBaseAlign;
  
   // If we have an empty base class, try to place it at offset 0.
@@ -2026,10 +2026,16 @@ static bool isMsLayout(const RecordDecl* D) {
 //   added for bases is 1 byte.  The padding added for vbases depends on the
 //   alignment of the object but is at least 4 bytes (in both 32 and 64 bit
 //   modes).
+// * There is no concept of non-virtual alignment or any distinction between
+//   data size and non-virtual size.
 
 
 namespace {
 struct MicrosoftRecordLayoutBuilder {
+  struct ElementInfo {
+    CharUnits Size;
+    CharUnits Alignment;
+  };
   typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
   MicrosoftRecordLayoutBuilder(const ASTContext &Context) : Context(Context) {}
 private:
@@ -2037,7 +2043,6 @@ private:
   LLVM_DELETED_FUNCTION;
   void operator=(const MicrosoftRecordLayoutBuilder &) LLVM_DELETED_FUNCTION;
 public:
-
   void layout(const RecordDecl *RD);
   void cxxLayout(const CXXRecordDecl *RD);
   /// \brief Initializes size and alignment and honors some flags.
@@ -2046,10 +2051,13 @@ public:
   /// existence of vfptrs and vbptrs.  Alignment is needed before the vfptr is
   /// laid out.
   void initializeCXXLayout(const CXXRecordDecl *RD);
-  void layoutVFPtr(const CXXRecordDecl *RD);
   void layoutNonVirtualBases(const CXXRecordDecl *RD);
-  void layoutNonVirtualBase(const CXXRecordDecl *RD);
-  void layoutVBPtr(const CXXRecordDecl *RD);
+  void layoutNonVirtualBase(const CXXRecordDecl *BaseDecl,
+                            const ASTRecordLayout &BaseLayout,
+                            const ASTRecordLayout *&PreviousBaseLayout);
+  void injectVFPtr(const CXXRecordDecl *RD);
+  void injectVBPtr(const CXXRecordDecl *RD);
+  void injectVPtrs(const CXXRecordDecl *RD);
   /// \brief Lays out the fields of the record.  Also rounds size up to
   /// alignment.
   void layoutFields(const RecordDecl *RD);
@@ -2058,22 +2066,19 @@ public:
   /// \brief Lays out a single zero-width bit-field in the record and handles
   /// special cases associated with zero-width bit-fields.
   void layoutZeroWidthBitField(const FieldDecl *FD);
-  void fixSizeAndAlignment(const RecordDecl *FD);
   void layoutVirtualBases(const CXXRecordDecl *RD);
-  void layoutVirtualBase(const CXXRecordDecl *RD, bool HasVtordisp);
   void finalizeLayout(const RecordDecl *RD);
-
-  /// \brief Updates the alignment of the type.  This function doesn't take any
-  /// properties (such as packedness) into account.  getAdjustedFieldInfo()
-  /// adjustes for packedness.
-  void updateAlignment(CharUnits NewAlignment) {
-    Alignment = std::max(Alignment, NewAlignment);
-  }
-  CharUnits getBaseAlignment(const ASTRecordLayout& Layout);
-  /// \brief Gets the size and alignment taking attributes into account.
-  std::pair<CharUnits, CharUnits> getAdjustedFieldInfo(const FieldDecl *FD);
-  /// \brief Places a field at offset 0.
-  void placeFieldAtZero() { FieldOffsets.push_back(0); }
+  /// \brief Gets the size and alignment of a base taking pragma pack and
+  /// __declspec(align) into account.
+  ElementInfo getAdjustedElementInfo(const ASTRecordLayout &Layout);
+  /// \brief Gets the size and alignment of a field taking pragma  pack and
+  /// __declspec(align) into account.  It also updates RequiredAlignment as a
+  /// side effect because it is most convenient to do so here.
+  ElementInfo getAdjustedElementInfo(const FieldDecl *FD);
+  /// \brief Updates the alignment of the record.
+  void updateAlignment(CharUnits MemberAlignment) {
+    Alignment = std::max(Alignment, MemberAlignment);
+  }
   /// \brief Places a field at an offset in CharUnits.
   void placeFieldAtOffset(CharUnits FieldOffset) {
     FieldOffsets.push_back(Context.toBits(FieldOffset));
@@ -2085,66 +2090,48 @@ public:
   /// \brief Compute the set of virtual bases for which vtordisps are required.
   llvm::SmallPtrSet<const CXXRecordDecl *, 2>
   computeVtorDispSet(const CXXRecordDecl *RD);
-
   const ASTContext &Context;
   /// \brief The size of the record being laid out.
   CharUnits Size;
+  /// \brief The data alignment of the record layout.
+  CharUnits DataSize;
   /// \brief The current alignment of the record layout.
   CharUnits Alignment;
-  /// \brief The collection of field offsets.
-  SmallVector<uint64_t, 16> FieldOffsets;
   /// \brief The maximum allowed field alignment. This is set by #pragma pack.
   CharUnits MaxFieldAlignment;
   /// \brief The alignment that this record must obey.  This is imposed by
   /// __declspec(align()) on the record itself or one of its fields or bases.
   CharUnits RequiredAlignment;
-  bool IsUnion : 1;
-  /// \brief True if the last field laid out was a bitfield and was not 0
-  /// width.
-  bool LastFieldIsNonZeroWidthBitfield : 1;
   /// \brief The size of the allocation of the currently active bitfield.
   /// This value isn't meaningful unless LastFieldIsNonZeroWidthBitfield
   /// is true.
   CharUnits CurrentBitfieldSize;
-  /// \brief The number of remaining bits in our last bitfield allocation.
-  /// This value isn't meaningful unless LastFieldIsNonZeroWidthBitfield is
-  /// true.
-  unsigned RemainingBitsInField;
-
-  /// \brief The data alignment of the record layout.
-  CharUnits DataSize;
-  /// \brief The alignment of the non-virtual portion of the record layout
-  /// without the impact of the virtual pointers.
-  /// Only used for C++ layouts.
-  CharUnits BasesAndFieldsAlignment;
-  /// \brief The alignment of the non-virtual portion of the record layout
-  /// Only used for C++ layouts.
-  CharUnits NonVirtualAlignment;
+  /// \brief Offset to the virtual base table pointer (if one exists).
+  CharUnits VBPtrOffset;
+  /// \brief The size and alignment info of a pointer.
+  ElementInfo PointerInfo;
   /// \brief The primary base class (if one exists).
   const CXXRecordDecl *PrimaryBase;
   /// \brief The class we share our vb-pointer with.
   const CXXRecordDecl *SharedVBPtrBase;
-  /// \brief True if the class has a vftable pointer that can be extended
-  /// by this class or classes derived from it.  Such a vfptr will always occur
-  /// at offset 0.
-  bool HasExtendableVFPtr : 1;
-  /// \brief True if the class has a (not necessarily its own) vbtable pointer.
-  bool HasVBPtr : 1;
-  /// \brief Offset to the virtual base table pointer (if one exists).
-  CharUnits VBPtrOffset;
+  /// \brief The collection of field offsets.
+  SmallVector<uint64_t, 16> FieldOffsets;
   /// \brief Base classes and their offsets in the record.
   BaseOffsetsMapTy Bases;
   /// \brief virtual base classes and their offsets in the record.
   ASTRecordLayout::VBaseOffsetsMapTy VBases;
-  /// \brief The size of a pointer.
-  CharUnits PointerSize;
-  /// \brief The alignment of a pointer.
-  CharUnits PointerAlignment;
-  /// \brief Holds an empty base we haven't yet laid out.
-  const CXXRecordDecl *LazyEmptyBase;
-  /// \brief A pointer to the Layout for the most recent non-virtual base that
-  /// has been laid out.
-  const ASTRecordLayout *PreviousBaseLayout;
+  /// \brief The number of remaining bits in our last bitfield allocation.
+  /// This value isn't meaningful unless LastFieldIsNonZeroWidthBitfield is
+  /// true.
+  unsigned RemainingBitsInField;
+  bool IsUnion : 1;
+  /// \brief True if the last field laid out was a bitfield and was not 0
+  /// width.
+  bool LastFieldIsNonZeroWidthBitfield : 1;
+  /// \brief True if the class has its own vftable pointer.
+  bool HasOwnVFPtr : 1;
+  /// \brief True if the class has a vbtable pointer.
+  bool HasVBPtr : 1;
   /// \brief Lets us know if we're in 64-bit mode
   bool Is64BitMode : 1;
   /// \brief True if this class contains a zero sized member or base or a base
@@ -2156,61 +2143,92 @@ public:
 };
 } // namespace
 
-CharUnits
-MicrosoftRecordLayoutBuilder::getBaseAlignment(const ASTRecordLayout& Layout) {
-  CharUnits BaseAlignment = Layout.getAlignment();
+MicrosoftRecordLayoutBuilder::ElementInfo
+MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(
+    const ASTRecordLayout &Layout) {
+  ElementInfo Info;
+  Info.Alignment = Layout.getAlignment();
+  // Respect pragma pack.
   if (!MaxFieldAlignment.isZero())
-    BaseAlignment = std::min(BaseAlignment,
-                             std::max(MaxFieldAlignment,
-                                      Layout.getRequiredAlignment()));
-  return BaseAlignment;
+    Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);
+  // Track zero-sized subobjects here where it's already available.
+  if (Layout.hasZeroSizedSubObject())
+    HasZeroSizedSubObject = true;
+  // Respect required alignment, this is necessary because we may have adjusted
+  // the alignment in the case of pragam pack.
+  Info.Alignment = std::max(Info.Alignment, Layout.getRequiredAlignment());
+  Info.Size = Layout.getNonVirtualSize();
+  return Info;
 }
 
-std::pair<CharUnits, CharUnits>
-MicrosoftRecordLayoutBuilder::getAdjustedFieldInfo(const FieldDecl *FD) {
-  std::pair<CharUnits, CharUnits> FieldInfo =
-      Context.getTypeInfoInChars(FD->getType());
-
-  // Respect packed attribute.
-  if (FD->hasAttr<PackedAttr>())
-    FieldInfo.second = CharUnits::One();
-  // Respect pack pragma.
-  else if (!MaxFieldAlignment.isZero())
-    FieldInfo.second = std::min(FieldInfo.second, MaxFieldAlignment);
-  // Respect alignment attributes.
-  if (unsigned fieldAlign = FD->getMaxAlignment()) {
-    CharUnits FieldAlign = Context.toCharUnitsFromBits(fieldAlign);
-    RequiredAlignment = std::max(RequiredAlignment, FieldAlign);
-    FieldInfo.second = std::max(FieldInfo.second, FieldAlign);
-  }
+MicrosoftRecordLayoutBuilder::ElementInfo
+MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(
+    const FieldDecl *FD) {
+  ElementInfo Info;
   // Respect attributes applied to subobjects of the field.
   if (const RecordType *RT =
       FD->getType()->getBaseElementTypeUnsafe()->getAs<RecordType>()) {
     const ASTRecordLayout &Layout = Context.getASTRecordLayout(RT->getDecl());
+    // Get the element info for a layout, respecting pack.
+    Info = getAdjustedElementInfo(Layout);
+    // Nomally getAdjustedElementInfo returns the non-virtual size, which is
+    // correct for bases but not for fields.
+    Info.Size = Layout.getSize();
+    // Capture required alignment as a side-effect.
     RequiredAlignment = std::max(RequiredAlignment,
                                  Layout.getRequiredAlignment());
-    FieldInfo.second = std::max(FieldInfo.second,
-                                Layout.getRequiredAlignment());
-    // Track zero-sized subobjects here where it's already available.
-    if (Layout.hasZeroSizedSubObject())
-      HasZeroSizedSubObject = true;
   }
-  return FieldInfo;
+  else {
+    std::pair<CharUnits, CharUnits> FieldInfo =
+        Context.getTypeInfoInChars(FD->getType());
+    Info.Size = FieldInfo.first;
+    Info.Alignment = FieldInfo.second;
+    // Respect pragma pack.
+    if (!MaxFieldAlignment.isZero())
+      Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);
+  }
+  // Respect packed field attribute.
+  if (FD->hasAttr<PackedAttr>())
+    Info.Alignment = CharUnits::One();
+  // Respect align attributes.
+  CharUnits FieldRequiredAlignment = 
+      Context.toCharUnitsFromBits(FD->getMaxAlignment());
+  // Take required alignment into account.
+  Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);
+  // Capture required alignment as a side-effect.
+  RequiredAlignment = std::max(RequiredAlignment, FieldRequiredAlignment);
+  return Info;
+}
+
+void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
+  initializeLayout(RD);
+  layoutFields(RD);
+  DataSize = Size = Size.RoundUpToAlignment(Alignment);
+  finalizeLayout(RD);
+}
+
+void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
+  initializeLayout(RD);
+  initializeCXXLayout(RD);
+  layoutNonVirtualBases(RD);
+  layoutFields(RD);
+  injectVPtrs(RD);
+  DataSize = Size = Size.RoundUpToAlignment(Alignment);
+  layoutVirtualBases(RD);
+  finalizeLayout(RD);
 }
 
 void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {
   IsUnion = RD->isUnion();
   Is64BitMode = Context.getTargetInfo().getPointerWidth(0) == 64;
-
   Size = CharUnits::Zero();
   Alignment = CharUnits::One();
-
   // In 64-bit mode we always perform an alignment step after laying out vbases.
   // In 32-bit mode we do not.  The check to see if we need to perform alignment
   // checks the RequiredAlignment field and performs alignment if it isn't 0.
   RequiredAlignment = Is64BitMode ? CharUnits::One() : CharUnits::Zero();
-  HasZeroSizedSubObject = false;
-
+  RequiredAlignment = std::max(RequiredAlignment,
+    Context.toCharUnitsFromBits(RD->getMaxAlignment()));
   // Compute the maximum field alignment.
   MaxFieldAlignment = CharUnits::Zero();
   // Honor the default struct packing maximum alignment flag.
@@ -2224,118 +2242,70 @@ void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {
     MaxFieldAlignment = CharUnits::One();
 }
 
-void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
-  initializeLayout(RD);
-  layoutFields(RD);
-  fixSizeAndAlignment(RD);
-  finalizeLayout(RD);
-}
-
-void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
-  initializeLayout(RD);
-  initializeCXXLayout(RD);
-  layoutVFPtr(RD);
-  layoutNonVirtualBases(RD);
-  layoutVBPtr(RD);
-  layoutFields(RD);
-  fixSizeAndAlignment(RD);
-  layoutVirtualBases(RD);
-  finalizeLayout(RD);
-}
-
 void
 MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {
-  // Calculate pointer size and alignment.
-  PointerSize =
-      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
-  PointerAlignment = PointerSize;
-  if (!MaxFieldAlignment.isZero())
-    PointerAlignment = std::min(PointerAlignment, MaxFieldAlignment);
-
-  // Initialize information about the bases.
+  HasZeroSizedSubObject = false;
+  LeadsWithZeroSizedBase = false;
+  HasOwnVFPtr = false;
   HasVBPtr = false;
-  HasExtendableVFPtr = false;
-  SharedVBPtrBase = 0;
   PrimaryBase = 0;
-  LeadsWithZeroSizedBase = false;
+  SharedVBPtrBase = 0;
+  // Calculate pointer size and alignment.  These are used for vfptr and vbprt
+  // injection.
+  PointerInfo.Size =
+      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
+  PointerInfo.Alignment = PointerInfo.Size;
+  // Respect pragma pack.
+  if (!MaxFieldAlignment.isZero())
+    PointerInfo.Alignment = std::min(PointerInfo.Alignment, MaxFieldAlignment);
+}
 
-  // If the record has a dynamic base class, attempt to choose a primary base
-  // class. It is the first (in direct base class order) non-virtual dynamic
-  // base class, if one exists.
+void
+MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {
+  // The MS-ABI lays out all bases that contain leading vfptrs before it lays
+  // out any bases that do not contain vfptrs.  We implement this as two passes
+  // over the bases.  This approach guarantees that the primary base is laid out
+  // first.  We use these passes to calculate some additional aggregated
+  // information about the bases, such as reqruied alignment and the presence of
+  // zero sized members.
+  const ASTRecordLayout* PreviousBaseLayout = 0;
+  // Iterate through the bases and lay out the non-virtual ones.
   for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
                                                 e = RD->bases_end();
        i != e; ++i) {
-    const CXXRecordDecl *BaseDecl =
-        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-    const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);
-    // Handle required alignment.
+    const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
+    const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);
+    // Track RequiredAlignment for all bases in this pass.
     RequiredAlignment = std::max(RequiredAlignment,
-                                 Layout.getRequiredAlignment());
-    // Check for zero sized subobjects.
-    if (Layout.hasZeroSizedSubObject())
-      HasZeroSizedSubObject = true;
-    // Handle virtual bases.
+                                 BaseLayout.getRequiredAlignment());
+    // Mark and skip virtual bases.
     if (i->isVirtual()) {
       HasVBPtr = true;
       continue;
     }
-    // We located a primary base class!
-    if (!PrimaryBase && Layout.hasExtendableVFPtr()) {
-      PrimaryBase = BaseDecl;
-      HasExtendableVFPtr = true;
-    }
-    // We located a base to share a VBPtr with!
-    if (!SharedVBPtrBase && Layout.hasVBPtr()) {
+    // Check fo a base to share a VBPtr with.
+    if (!SharedVBPtrBase && BaseLayout.hasVBPtr()) {
       SharedVBPtrBase = BaseDecl;
       HasVBPtr = true;
     }
-    updateAlignment(getBaseAlignment(Layout));
+    // Only lay out bases with extendable VFPtrs on the first pass.
+    if (!BaseLayout.hasExtendableVFPtr())
+      continue;
+    // If we don't have a primary base, this one qualifies.
+    if (!PrimaryBase)
+      PrimaryBase = BaseDecl;
+    // Lay out the base.
+    layoutNonVirtualBase(BaseDecl, BaseLayout, PreviousBaseLayout);
   }
-
-  // Use LayoutFields to compute the alignment of the fields.  The layout
-  // is discarded.  This is the simplest way to get all of the bit-field
-  // behavior correct and is not actually very expensive.
-  layoutFields(RD);
-  Size = CharUnits::Zero();
-  BasesAndFieldsAlignment = Alignment;
-  FieldOffsets.clear();
-}
-
-void MicrosoftRecordLayoutBuilder::layoutVFPtr(const CXXRecordDecl *RD) {
-  // If we have a primary base then our VFPtr was already laid out
-  if (PrimaryBase)
-    return;
-
-  // Look at all of our methods to determine if we need a VFPtr.  We need a
-  // vfptr if we define a new virtual function.
-  if (!HasExtendableVFPtr && RD->isDynamicClass())
+  // Figure out if we need a fresh VFPtr for this class.
+  if (!PrimaryBase && RD->isDynamicClass())
     for (CXXRecordDecl::method_iterator i = RD->method_begin(),
                                         e = RD->method_end();
-         !HasExtendableVFPtr && i != e; ++i)
-      HasExtendableVFPtr = i->isVirtual() && i->size_overridden_methods() == 0;
-  if (!HasExtendableVFPtr)
-    return;
-
-  updateAlignment(PointerAlignment);
-  Size = Size.RoundUpToAlignment(PointerAlignment) + PointerSize;
-  // MSVC 32 (but not 64) potentially over-aligns the vf-table pointer by giving
-  // it the max alignment of all the non-virtual data in the class.  The
-  // resulting layout is essentially { vftbl, { nvdata } }.  This is completely
-  // unnecessary, but we're not here to pass judgment.
-  if (!Is64BitMode && Alignment > PointerSize)
-    Size += Alignment - PointerSize;
-}
-
-void
-MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {
-  LazyEmptyBase = 0;
-  PreviousBaseLayout = 0;
-
-  // Lay out the primary base first.
-  if (PrimaryBase)
-    layoutNonVirtualBase(PrimaryBase);
-
-  const CXXRecordDecl *LeadingBase = PrimaryBase;
+         !HasOwnVFPtr && i != e; ++i)
+      HasOwnVFPtr = i->isVirtual() && i->size_overridden_methods() == 0;
+  // If we don't have a primary base then we have a leading object that could
+  // itself lead with a zero-sized object, something we track.
+  bool CheckLeadingLayout = !PrimaryBase;
   // Iterate through the bases and lay out the non-virtual ones.
   for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
                                                 e = RD->bases_end();
@@ -2343,71 +2313,41 @@ MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {
     if (i->isVirtual())
       continue;
     const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
-    if (BaseDecl == PrimaryBase)
+    const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);
+    // Only lay out bases without extendable VFPtrs on the second pass.
+    if (BaseLayout.hasExtendableVFPtr())
       continue;
-    const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);
-    if (!LeadingBase) {
-      LeadsWithZeroSizedBase = Layout.leadsWithZeroSizedBase();
-      LeadingBase = BaseDecl;
-    }
-
-    if (LazyEmptyBase) {
-      layoutNonVirtualBase(LazyEmptyBase);
-      LazyEmptyBase = 0;
+    // If this is the first layout, check to see if it leads with a zero sized
+    // object.  If it does, so do we.
+    if (CheckLeadingLayout) {
+      CheckLeadingLayout = false;
+      LeadsWithZeroSizedBase = BaseLayout.leadsWithZeroSizedBase();
     }
-    // Insert padding between two bases if the left first one is zero sized or
-    // contains a zero sized subobject and the right is zero sized or one leads
-    // with a zero sized base.
-    if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
-        Layout.leadsWithZeroSizedBase())
-      Size++;
-    if (Layout.getNonVirtualSize().isZero())
-      LazyEmptyBase = BaseDecl;
-    else
-      layoutNonVirtualBase(BaseDecl);
+    // Lay out the base.
+    layoutNonVirtualBase(BaseDecl, BaseLayout, PreviousBaseLayout);
   }
-}
-
-void
-MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(const CXXRecordDecl *RD) {
-  const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
-  // Insert the base here.
-  CharUnits BaseOffset = Size.RoundUpToAlignment(getBaseAlignment(Layout));
-  Bases.insert(std::make_pair(RD, BaseOffset));
-  Size = BaseOffset + Layout.getDataSize();
-  // Alignment was upadated in InitializeCXXLayout.
-  PreviousBaseLayout = &Layout;
-}
-
-void MicrosoftRecordLayoutBuilder::layoutVBPtr(const CXXRecordDecl *RD) {
+  // Set our VBPtroffset if we know it at this point.
   if (!HasVBPtr)
     VBPtrOffset = CharUnits::fromQuantity(-1);
-  else if (SharedVBPtrBase)
-    VBPtrOffset = Bases[SharedVBPtrBase] +
-                  Context.getASTRecordLayout(SharedVBPtrBase).getVBPtrOffset();
-  else {
-    VBPtrOffset = Size.RoundUpToAlignment(PointerAlignment);
-    CharUnits OldSize = Size;
-    Size = VBPtrOffset + PointerSize;
-    if (BasesAndFieldsAlignment <= PointerAlignment)
-      // Handle strange padding rules for the lazily placed base.  I have no
-      // explanation for why the last virtual base is padded in such an odd way.
-      // Two things to note about this padding are that the rules are different
-      // if the alignment of the bases+fields is <= to the alignemnt of a
-      // pointer and that the rule in 64-bit mode behaves differently depending
-      // on if the second to last base was also zero sized.
-      Size += OldSize % BasesAndFieldsAlignment.getQuantity();
-    else {
-      if (!Is64BitMode)
-        Size = OldSize + BasesAndFieldsAlignment;
-      else if (PreviousBaseLayout &&
-               PreviousBaseLayout->getNonVirtualSize().isZero())
-        Size += CharUnits::One();
-    }
-    updateAlignment(PointerAlignment);
-  }
-  if (LazyEmptyBase)
-    layoutNonVirtualBase(LazyEmptyBase);
+}
+
+void MicrosoftRecordLayoutBuilder::layoutNonVirtualBase(
+    const CXXRecordDecl *BaseDecl,
+    const ASTRecordLayout &BaseLayout,
+    const ASTRecordLayout *&PreviousBaseLayout) {
+  // Insert padding between two bases if the left first one is zero sized or
+  // contains a zero sized subobject and the right is zero sized or one leads
+  // with a zero sized base.
+  if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
+      BaseLayout.leadsWithZeroSizedBase())
+    Size++;
+  ElementInfo Info = getAdjustedElementInfo(BaseLayout);
+  CharUnits BaseOffset = Size.RoundUpToAlignment(Info.Alignment);
+  Bases.insert(std::make_pair(BaseDecl, BaseOffset));
+  Size = BaseOffset + BaseLayout.getDataSize();
+  updateAlignment(Info.Alignment);
+  PreviousBaseLayout = &BaseLayout;
+  VBPtrOffset = Size;
 }
 
 void MicrosoftRecordLayoutBuilder::layoutFields(const RecordDecl *RD) {
@@ -2416,7 +2356,6 @@ void MicrosoftRecordLayoutBuilder::layoutFields(const RecordDecl *RD) {
                                   FieldEnd = RD->field_end();
        Field != FieldEnd; ++Field)
     layoutField(*Field);
-  Size = Size.RoundUpToAlignment(Alignment);
 }
 
 void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
@@ -2425,21 +2364,16 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
     return;
   }
   LastFieldIsNonZeroWidthBitfield = false;
-
-  std::pair<CharUnits, CharUnits> FieldInfo = getAdjustedFieldInfo(FD);
-  CharUnits FieldSize = FieldInfo.first;
-  CharUnits FieldAlign = FieldInfo.second;
-
-  updateAlignment(FieldAlign);
+  ElementInfo Info = getAdjustedElementInfo(FD);
   if (IsUnion) {
-    placeFieldAtZero();
-    Size = std::max(Size, FieldSize);
+    placeFieldAtOffset(CharUnits::Zero());
+    Size = std::max(Size, Info.Size);
   } else {
-    // Round up the current record size to the field's alignment boundary.
-    CharUnits FieldOffset = Size.RoundUpToAlignment(FieldAlign);
+    CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
     placeFieldAtOffset(FieldOffset);
-    Size = FieldOffset + FieldSize;
+    Size = FieldOffset + Info.Size;
   }
+  updateAlignment(Info.Alignment);
 }
 
 void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
@@ -2448,39 +2382,33 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
     layoutZeroWidthBitField(FD);
     return;
   }
-
-  std::pair<CharUnits, CharUnits> FieldInfo = getAdjustedFieldInfo(FD);
-  CharUnits FieldSize = FieldInfo.first;
-  CharUnits FieldAlign = FieldInfo.second;
-
+  ElementInfo Info = getAdjustedElementInfo(FD);
   // Clamp the bitfield to a containable size for the sake of being able
   // to lay them out.  Sema will throw an error.
-  if (Width > Context.toBits(FieldSize))
-    Width = Context.toBits(FieldSize);
-
+  if (Width > Context.toBits(Info.Size))
+    Width = Context.toBits(Info.Size);
   // Check to see if this bitfield fits into an existing allocation.  Note:
   // MSVC refuses to pack bitfields of formal types with different sizes
   // into the same allocation.
   if (!IsUnion && LastFieldIsNonZeroWidthBitfield &&
-      CurrentBitfieldSize == FieldSize && Width <= RemainingBitsInField) {
+      CurrentBitfieldSize == Info.Size && Width <= RemainingBitsInField) {
     placeFieldAtBitOffset(Context.toBits(Size) - RemainingBitsInField);
     RemainingBitsInField -= Width;
     return;
   }
-
   LastFieldIsNonZeroWidthBitfield = true;
-  CurrentBitfieldSize = FieldSize;
+  CurrentBitfieldSize = Info.Size;
   if (IsUnion) {
-    placeFieldAtZero();
-    Size = std::max(Size, FieldSize);
+    placeFieldAtOffset(CharUnits::Zero());
+    Size = std::max(Size, Info.Size);
     // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
   } else {
     // Allocate a new block of memory and place the bitfield in it.
-    CharUnits FieldOffset = Size.RoundUpToAlignment(FieldAlign);
+    CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
     placeFieldAtOffset(FieldOffset);
-    Size = FieldOffset + FieldSize;
-    updateAlignment(FieldAlign);
-    RemainingBitsInField = Context.toBits(FieldSize) - Width;
+    Size = FieldOffset + Info.Size;
+    updateAlignment(Info.Alignment);
+    RemainingBitsInField = Context.toBits(Info.Size) - Width;
   }
 }
 
@@ -2488,96 +2416,210 @@ void
 MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {
   // Zero-width bitfields are ignored unless they follow a non-zero-width
   // bitfield.
-  std::pair<CharUnits, CharUnits> FieldInfo = getAdjustedFieldInfo(FD);
-  CharUnits FieldSize = FieldInfo.first;
-  CharUnits FieldAlign = FieldInfo.second;
-
   if (!LastFieldIsNonZeroWidthBitfield) {
     placeFieldAtOffset(IsUnion ? CharUnits::Zero() : Size);
     // TODO: Add a Sema warning that MS ignores alignment for zero
     // sized bitfields that occur after zero-size bitfields or non-bitfields.
     return;
   }
-
   LastFieldIsNonZeroWidthBitfield = false;
+  ElementInfo Info = getAdjustedElementInfo(FD);
   if (IsUnion) {
-    placeFieldAtZero();
-    Size = std::max(Size, FieldSize);
+    placeFieldAtOffset(CharUnits::Zero());
+    Size = std::max(Size, Info.Size);
   } else {
     // Round up the current record size to the field's alignment boundary.
-    CharUnits FieldOffset = Size.RoundUpToAlignment(FieldAlign);
+    CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
     placeFieldAtOffset(FieldOffset);
     Size = FieldOffset;
-    updateAlignment(FieldAlign);
+    updateAlignment(Info.Alignment);
   }
 }
 
-void MicrosoftRecordLayoutBuilder::fixSizeAndAlignment(const RecordDecl *RD) {
-  DataSize = Size;
-  NonVirtualAlignment = Alignment;
-  RequiredAlignment = std::max(RequiredAlignment,
-      Context.toCharUnitsFromBits(RD->getMaxAlignment()));
-  updateAlignment(RequiredAlignment);
+void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) {
+  if (!HasVBPtr)
+    return;
+  if (SharedVBPtrBase) {
+    const ASTRecordLayout &Layout = Context.getASTRecordLayout(SharedVBPtrBase);
+    VBPtrOffset = Bases[SharedVBPtrBase] + Layout.getVBPtrOffset();
+    return;
+  }
+  // Inject the VBPointer at the injection site.
+  CharUnits InjectionSite = VBPtrOffset;
+  // But before we do, make sure it's properly aligned.
+  VBPtrOffset = VBPtrOffset.RoundUpToAlignment(PointerInfo.Alignment);
+  // Determine where the first field should be laid out after the vbptr.
+  CharUnits FieldStart = VBPtrOffset + PointerInfo.Size;
+  // Make sure that the amount we push the fields back by is a multiple of the
+  // alignment.
+  CharUnits Offset = (FieldStart - InjectionSite).RoundUpToAlignment(Alignment);
+  // Increase the size of the object and push back all fields by the offset
+  // amount.
+  Size += Offset;
+  for (SmallVector<uint64_t, 16>::iterator i = FieldOffsets.begin(),
+                                           e = FieldOffsets.end();
+       i != e; ++i)
+    *i += Context.toBits(Offset);
+  for (BaseOffsetsMapTy::iterator i = Bases.begin(), e = Bases.end();
+       i != e; ++i)
+       if (i->second >= InjectionSite)
+         i->second += Offset;
+  // Update the object alignment.
+  updateAlignment(PointerInfo.Alignment);
 }
 
-void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
-  if (!HasVBPtr)
+void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) {
+  if (!HasOwnVFPtr)
     return;
+  // Make sure that the amount we push the struct back by is a multiple of the
+  // alignment.
+  CharUnits Offset = PointerInfo.Size.RoundUpToAlignment(Alignment);
+  // Increase the size of the object and push back all fields, the vbptr and all
+  // bases by the offset amount.
+  Size += Offset;
+  for (SmallVector<uint64_t, 16>::iterator i = FieldOffsets.begin(),
+                                           e = FieldOffsets.end();
+       i != e; ++i)
+    *i += Context.toBits(Offset);
+  if (HasVBPtr)
+    VBPtrOffset += Offset;
+  for (BaseOffsetsMapTy::iterator i = Bases.begin(), e = Bases.end();
+       i != e; ++i)
+    i->second += Offset;
+  updateAlignment(PointerInfo.Alignment);
+}
 
-  PreviousBaseLayout = 0;
+void MicrosoftRecordLayoutBuilder::injectVPtrs(const CXXRecordDecl *RD) {
+  if (!(HasOwnVFPtr || HasVBPtr && !SharedVBPtrBase))
+    return;
+  if (!Is64BitMode || RequiredAlignment <= CharUnits::fromQuantity(8)) {
+    // Note that the VBPtr is injected first.  It depends on the alignment of
+    // the object *before* the alignment is updated by inserting a pointer into
+    // the record.
+    injectVBPtr(RD);
+    injectVFPtr(RD);
+    return;
+  }
+  // In 64-bit mode, structs with RequiredAlignment greater than 8 get special
+  // layout rules.  Likely this is to avoid excessive padding intruced around
+  // the vfptrs and vbptrs.  The special rules involve re-laying out the struct
+  // and inserting the vfptr and vbptr as if they were fields/bases.
+  FieldOffsets.clear();
+  Bases.clear();
+  Size = CharUnits::Zero();
+  updateAlignment(PointerInfo.Alignment);
+  if (HasOwnVFPtr)
+    Size = PointerInfo.Size;
+  layoutNonVirtualBases(RD);
+  if (HasVBPtr && !SharedVBPtrBase) {
+    const CXXRecordDecl *PenultBaseDecl = 0;
+    const CXXRecordDecl *LastBaseDecl = 0;
+    // Iterate through the bases and find the last two non-virtual bases.
+    for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
+                                                  e = RD->bases_end();
+          i != e; ++i) {
+      if (i->isVirtual())
+        continue;
+      const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
+      if (!LastBaseDecl || Bases[BaseDecl] > Bases[LastBaseDecl]) {
+        PenultBaseDecl = LastBaseDecl;
+        LastBaseDecl = BaseDecl;
+      }
+    }
+    const ASTRecordLayout *PenultBaseLayout = PenultBaseDecl ?
+        &Context.getASTRecordLayout(PenultBaseDecl) : 0;
+    const ASTRecordLayout *LastBaseLayout = LastBaseDecl ?
+        &Context.getASTRecordLayout(LastBaseDecl) : 0;
+    // Calculate the vbptr offset.  The rule is different than in the general
+    // case layout.  Particularly, if the last two non-virtual bases are both
+    // zero sized, the site of the vbptr is *before* the padding that occurs
+    // between the two zero sized bases and the vbptr potentially aliases with
+    // the first of these two bases.  We have no understanding of why this is
+    // different from the general case layout but it may have to do with lazy
+    // placement of zero sized bases.
+    VBPtrOffset = Size;
+    if (LastBaseLayout && LastBaseLayout->getNonVirtualSize().isZero()) {
+      VBPtrOffset = Bases[LastBaseDecl];
+      if (PenultBaseLayout && PenultBaseLayout->getNonVirtualSize().isZero())
+        VBPtrOffset = Bases[PenultBaseDecl];
+    }
+    // Once we've located a spot for the vbptr, place it.
+    VBPtrOffset = VBPtrOffset.RoundUpToAlignment(PointerInfo.Alignment);
+    Size = VBPtrOffset + PointerInfo.Size;
+    if (LastBaseLayout && LastBaseLayout->getNonVirtualSize().isZero()) {
+      // Add the padding between zero sized bases after the vbptr.
+      if (PenultBaseLayout && PenultBaseLayout->getNonVirtualSize().isZero())
+        Size += CharUnits::One();
+      Size = Size.RoundUpToAlignment(LastBaseLayout->getRequiredAlignment());
+      Bases[LastBaseDecl] = Size;
+    }
+  }
+  layoutFields(RD);
+}
 
-  llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordisp =
+void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
+  if (!HasVBPtr)
+    return;
+  // Vtordisps are always 4 bytes (even in 64-bit mode)
+  CharUnits VtorDispSize = CharUnits::fromQuantity(4);
+  CharUnits VtorDispAlignment = VtorDispSize;
+  // vtordisps respect pragma pack.
+  if (!MaxFieldAlignment.isZero())
+    VtorDispAlignment = std::min(VtorDispAlignment, MaxFieldAlignment);
+  // The alignment of the vtordisp is at least the required alignment of the
+  // entire record.  This requirement may be present to support vtordisp
+  // injection.
+  VtorDispAlignment = std::max(VtorDispAlignment, RequiredAlignment);
+  // Compute the vtordisp set.
+  llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordispSet =
       computeVtorDispSet(RD);
-
   // Iterate through the virtual bases and lay them out.
+  const ASTRecordLayout* PreviousBaseLayout = 0;
   for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
                                                 e = RD->vbases_end();
        i != e; ++i) {
     const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
+    const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);
+    bool HasVtordisp = HasVtordispSet.count(BaseDecl);
     // If the last field we laid out was a non-zero length bitfield then add
     // some extra padding for no obvious reason.
     if (LastFieldIsNonZeroWidthBitfield)
       Size += CurrentBitfieldSize;
-    layoutVirtualBase(BaseDecl, HasVtordisp.count(BaseDecl));
+    // Insert padding between two bases if the left first one is zero sized or
+    // contains a zero sized subobject and the right is zero sized or one leads
+    // with a zero sized base.  The padding between virtual bases is 4
+    // bytes (in both 32 and 64 bits modes) and always involves rounding up to
+    // the required alignment, we don't know why.
+    if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
+        BaseLayout.leadsWithZeroSizedBase())
+      Size = Size.RoundUpToAlignment(VtorDispAlignment) + VtorDispSize;
+    // Insert the vtordisp.
+    if (HasVtordisp)
+      Size = Size.RoundUpToAlignment(VtorDispAlignment) + VtorDispSize;
+    // Insert the virtual base.
+    ElementInfo Info = getAdjustedElementInfo(BaseLayout);
+    CharUnits BaseOffset = Size.RoundUpToAlignment(Info.Alignment);
+    VBases.insert(std::make_pair(BaseDecl,
+        ASTRecordLayout::VBaseInfo(BaseOffset, HasVtordisp)));
+    Size = BaseOffset + BaseLayout.getNonVirtualSize();
+    updateAlignment(Info.Alignment);
+    PreviousBaseLayout = &BaseLayout;
   }
 }
 
-void MicrosoftRecordLayoutBuilder::layoutVirtualBase(const CXXRecordDecl *RD,
-                                                     bool HasVtordisp) {
-  const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
-  const CharUnits Four = CharUnits::fromQuantity(4);
-  // Insert padding between two bases if the left first one is zero sized or
-  // contains a zero sized subobject and the right is zero sized or one leads
-  // with a zero sized base.  The minimal padding between virtual bases is 4
-  // bytes (in both 32 and 64 bits modes), we don't know why.
-  if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
-      Layout.leadsWithZeroSizedBase())
-    Size = Size.RoundUpToAlignment(std::max(Four, RequiredAlignment)) + Four;
-
-  // vtordisps are always 4 bytes (even in 64-bit mode)
-  if (HasVtordisp)
-    Size = Size.RoundUpToAlignment(Alignment) + Four;
-
-  // Insert the base here.
-  Size = Size.RoundUpToAlignment(getBaseAlignment(Layout));
-  // Update the alignment 
-  updateAlignment(getBaseAlignment(Layout));
-  VBases.insert(
-      std::make_pair(RD, ASTRecordLayout::VBaseInfo(Size, HasVtordisp)));
-  Size += Layout.getNonVirtualSize();
-  // Alignment was upadated in InitializeCXXLayout.
-  PreviousBaseLayout = &Layout;
-}
-
 void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
+  // Respect required alignment.  Note that in 32-bit mode Required alignment
+  // may be 0 nad cause size not to be updated.
+  if (!RequiredAlignment.isZero()) {
+    Alignment = std::max(Alignment, RequiredAlignment);
+    Size = Size.RoundUpToAlignment(Alignment);
+  }
+  // Zero-sized structures have size equal to their alignment.
   if (Size.isZero()) {
     HasZeroSizedSubObject = true;
     LeadsWithZeroSizedBase = true;
     Size = Alignment;
   }
-
-  if (!RequiredAlignment.isZero())
-    Size = Size.RoundUpToAlignment(Alignment);
 }
 
 static bool
@@ -2600,8 +2642,7 @@ RequiresVtordisp(const llvm::SmallPtrSet<const CXXRecordDecl *, 2> &HasVtordisp,
 
 llvm::SmallPtrSet<const CXXRecordDecl *, 2>
 MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) {
-  llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordisp;
-
+  llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordispSet;
   // If any of our bases need a vtordisp for this type, so do we.  Check our
   // direct bases for vtordisp requirements.
   for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
@@ -2615,9 +2656,8 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) {
              be = Layout.getVBaseOffsetsMap().end();
          bi != be; ++bi)
       if (bi->second.hasVtorDisp())
-        HasVtordisp.insert(bi->first);
+        HasVtordispSet.insert(bi->first);
   }
-
   // If we define a constructor or destructor and override a function that is
   // defined in a virtual base's vtable, that virtual bases need a vtordisp.
   // Here we collect a list of classes with vtables for which our virtual bases
@@ -2639,25 +2679,24 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) {
                                      e = MD->end_overridden_methods();
       if (i == e)
         // If a virtual method has no-overrides it lives in its parent's vtable.
-        HasVtordisp.insert(MD->getParent());
+        HasVtordispSet.insert(MD->getParent());
       else
         Work.insert(i, e);
       // We've finished processing this element, remove it from the working set.
       Work.erase(MD);
     }
   }
-
   // Re-check all of our vbases for vtordisp requirements (in case their
   // non-virtual bases have vtordisp requirements).
   for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
                                                 e = RD->vbases_end();
        i != e; ++i) {
     const CXXRecordDecl *BaseDecl =  i->getType()->getAsCXXRecordDecl();
-    if (!HasVtordisp.count(BaseDecl) && RequiresVtordisp(HasVtordisp, BaseDecl))
-      HasVtordisp.insert(BaseDecl);
+    if (!HasVtordispSet.count(BaseDecl) &&
+        RequiresVtordisp(HasVtordispSet, BaseDecl))
+      HasVtordispSet.insert(BaseDecl);
   }
-
-  return HasVtordisp;
+  return HasVtordispSet;
 }
 
 /// \brief Get or compute information about the layout of the specified record
@@ -2670,11 +2709,11 @@ ASTContext::BuildMicrosoftASTRecordLayout(const RecordDecl *D) const {
     Builder.cxxLayout(RD);
     return new (*this) ASTRecordLayout(
         *this, Builder.Size, Builder.Alignment, Builder.RequiredAlignment,
-        Builder.HasExtendableVFPtr && !Builder.PrimaryBase,
-        Builder.HasExtendableVFPtr,
+        Builder.HasOwnVFPtr,
+        Builder.HasOwnVFPtr || Builder.PrimaryBase,
         Builder.VBPtrOffset, Builder.DataSize, Builder.FieldOffsets.data(),
         Builder.FieldOffsets.size(), Builder.DataSize,
-        Builder.NonVirtualAlignment, CharUnits::Zero(), Builder.PrimaryBase,
+        Builder.Alignment, CharUnits::Zero(), Builder.PrimaryBase,
         false, Builder.SharedVBPtrBase,
         Builder.HasZeroSizedSubObject, Builder.LeadsWithZeroSizedBase,
         Builder.Bases, Builder.VBases);
@@ -2998,7 +3037,7 @@ static void DumpCXXRecordLayout(raw_ostream &OS,
 
   PrintIndentNoOffset(OS, IndentLevel - 1);
   OS << " nvsize=" << Layout.getNonVirtualSize().getQuantity();
-  OS << ", nvalign=" << Layout.getNonVirtualAlign().getQuantity() << "]\n";
+  OS << ", nvalign=" << Layout.getNonVirtualAlignment().getQuantity() << "]\n";
   OS << '\n';
 }
 
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp
index 2dba75e4d48ad8b7fde4b0bd260ce32d7d5afcca..69aecfdc09a6eb0d8e32fd8106a3f3e01f509c66 100644
--- a/lib/CodeGen/CGExprCXX.cpp
+++ b/lib/CodeGen/CGExprCXX.cpp
@@ -316,7 +316,7 @@ static void EmitNullBaseClassInitialization(CodeGenFunction &CGF,
 
   const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
   CharUnits Size = Layout.getNonVirtualSize();
-  CharUnits Align = Layout.getNonVirtualAlign();
+  CharUnits Align = Layout.getNonVirtualAlignment();
 
   llvm::Value *SizeVal = CGF.CGM.getSize(Size);
 
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp
index 34cee37760400ef8297a541e5914a3a034c6d05a..c3338a17b36b75fc206621242443d2a92bfc5511 100644
--- a/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -712,7 +712,7 @@ CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) {
   const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(RD);
 
   CharUnits NonVirtualSize  = Layout.getNonVirtualSize();
-  CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
+  CharUnits NonVirtualAlign = Layout.getNonVirtualAlignment();
   CharUnits AlignedNonVirtualTypeSize =
     NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
   
@@ -994,7 +994,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D,
 
   if (BaseTy) {
     CharUnits NonVirtualSize  = Layout.getNonVirtualSize();
-    CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
+    CharUnits NonVirtualAlign = Layout.getNonVirtualAlignment();
     CharUnits AlignedNonVirtualTypeSize = 
       NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
 
diff --git a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp
index dca9f170a909e0df876d78e818415dcd16f7abe0..ba7bc899f5016cd5b222fe353deb92ee8170bef5 100644
--- a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp
+++ b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp
@@ -95,7 +95,7 @@ void (UnspecSingle::*us_f_mp)() = &UnspecSingle::foo;
 // CHECK: @"\01?v_f_mp@Const@@3P8Virtual@@AEXXZQ2@" =
 // CHECK:   global { i8*, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Virtual@@QAEXXZ" to i8*), i32 0, i32 0 }, align 4
 // CHECK: @"\01?u_f_mp@Const@@3P8Unspecified@@AEXXZQ2@" =
-// CHECK:   global { i8*, i32, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 12, i32 0 }, align 4
+// CHECK:   global { i8*, i32, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 20, i32 0 }, align 4
 // CHECK: @"\01?us_f_mp@Const@@3P8UnspecSingle@@AEXXZQ2@" =
 // CHECK:   global { i8*, i32, i32, i32 } { i8* bitcast ({{.*}} @"\01?foo@UnspecSingle@@QAEXXZ" to i8*), i32 0, i32 0, i32 0 }, align 4
 }
@@ -167,7 +167,7 @@ void EmitNonVirtualMemberPointers() {
 // CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Virtual@@QAEXXZ" to i8*), i32 0, i32 0 },
 // CHECK:     { i8*, i32, i32 }* %{{.*}}, align 4
 // CHECK:   store { i8*, i32, i32, i32 }
-// CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 12, i32 0 },
+// CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@Unspecified@@QAEXXZ" to i8*), i32 0, i32 20, i32 0 },
 // CHECK:     { i8*, i32, i32, i32 }* %{{.*}}, align 4
 // CHECK:   store { i8*, i32, i32, i32 }
 // CHECK:     { i8* bitcast (void (%{{.*}}*)* @"\01?foo@UnspecWithVBPtr@@QAEXXZ" to i8*),
diff --git a/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp b/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp
index 3fef0e4093496972f652593c38cc1e50351285a7..2976d1967cdf9941d9829ee26b5cb6d25071f67e 100644
--- a/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp
+++ b/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance-vtordisps.cpp
@@ -264,7 +264,7 @@ struct H : Z, A {
 
   // VTABLE-EXTENDED-H: VFTable for 'V1' in 'simple::A' in 'extended::A' in 'extended::H' (2 entries).
   // VTABLE-EXTENDED-H-NEXT: 0 | void simple::A::f()
-  // VTABLE-EXTENDED-H-NEXT:     [this adjustment: vtordisp at -4, vbptr at 8 to the left,
+  // VTABLE-EXTENDED-H-NEXT:     [this adjustment: vtordisp at -4, vbptr at 4 to the left,
   // VTABLE-EXTENDED-H-NEXT:      vboffset at 8 in the vbtable, 8 non-virtual]
 
   // MANGLING-DAG: @"\01?f@A@simple@@$R477PPPPPPPM@7AEXXZ"
diff --git a/test/CodeGenCXX/virtual-base-cast.cpp b/test/CodeGenCXX/virtual-base-cast.cpp
index 40e68f672232d99746c22ed38ddea5a1b18a3748..e35f41e1cae8ae95f52f10cf07e85d7b44f7bde2 100644
--- a/test/CodeGenCXX/virtual-base-cast.cpp
+++ b/test/CodeGenCXX/virtual-base-cast.cpp
@@ -77,13 +77,13 @@ BB* d() { return y; }
 // Same as 'c' except the vbptr offset is 4, changing the initial GEP and the
 // final add.
 // MSVC: @"\01?d@@YAPAUBB@@XZ"() [[NUW:#[0-9]+]] {
-// MSVC:   %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 4
+// MSVC:   %[[vbptr_off:.*]] = getelementptr inbounds i8* {{.*}}, i32 12
 // MSVC:   %[[vbptr:.*]] = bitcast i8* %[[vbptr_off]] to i8**
 // MSVC:   %[[vbtable:.*]] = load i8** %[[vbptr]]
 // MSVC:   %[[entry:.*]] = getelementptr inbounds i8* {{.*}}, i32 16
 // MSVC:   %[[entry_i32:.*]] = bitcast i8* %[[entry]] to i32*
 // MSVC:   %[[offset:.*]] = load i32* %[[entry_i32]]
-// MSVC:   add nsw i32 4, %[[offset]]
+// MSVC:   add nsw i32 12, %[[offset]]
 // MSVC: }
 
 // CHECK: attributes [[NUW]] = { nounwind{{.*}} }
diff --git a/test/Layout/ms-x86-alias-avoidance-padding.cpp b/test/Layout/ms-x86-alias-avoidance-padding.cpp
index 78957cf747e5940b8896c5788eef3a09482622ba..1b5d25cd5b79ab1e48ac3a07aa2471501c6f8ca9 100644
--- a/test/Layout/ms-x86-alias-avoidance-padding.cpp
+++ b/test/Layout/ms-x86-alias-avoidance-padding.cpp
@@ -46,41 +46,55 @@ struct AT3 : AT2, AT1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AT3
-// CHECK:    0 |   struct AT2 (base)
-// CHECK:    0 |     struct AT0 t
-// CHECK:    0 |       union AT0::<anonymous at {{.*}} x
-// CHECK:    0 |         struct AT0::<anonymous at {{.*}} y
-// CHECK:    0 |           int a
-// CHECK:    4 |           struct AT t (empty)
-// CHECK:    0 |         int b
-// CHECK:    8 |       char c
-// CHECK:   12 |     char AT2FieldName0
-// CHECK:   20 |   struct AT1 (base)
-// CHECK:   20 |     struct V (base)
-// CHECK:   20 |       struct AT (base) (empty)
-// CHECK:   20 |       char c
-// CHECK:   24 |     int a
-// CHECK:      | [sizeof=28, align=4
-// CHECK:      |  nvsize=28, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AT3
+// CHECK-NEXT:    0 |   struct AT2 (base)
+// CHECK-NEXT:    0 |     struct AT0 t
+// CHECK-NEXT:    0 |       union AT0::<anonymous at {{.*}} x
+// CHECK-NEXT:    0 |         struct AT0::<anonymous at {{.*}} y
+// CHECK-NEXT:    0 |           int a
+// CHECK-NEXT:    4 |           struct AT t (empty)
+// CHECK:         0 |         int b
+// CHECK:         8 |       char c
+// CHECK:        12 |     char AT2FieldName0
+// CHECK-NEXT:   20 |   struct AT1 (base)
+// CHECK-NEXT:   20 |     struct V (base)
+// CHECK-NEXT:   20 |       struct AT (base) (empty)
+// CHECK-NEXT:   20 |       char c
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:      | [sizeof=28, align=4
+// CHECK-NEXT:      |  nvsize=28, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AT3
-// CHECK-X64:    0 |   struct AT2 (base)
-// CHECK-X64:    0 |     struct AT0 t
-// CHECK-X64:    0 |       union AT0::<anonymous at {{.*}} x
-// CHECK-X64:    0 |         struct AT0::<anonymous at {{.*}} y
-// CHECK-X64:    0 |           int a
-// CHECK-X64:    4 |           struct AT t (empty)
-// CHECK-X64:    0 |         int b
-// CHECK-X64:    8 |       char c
-// CHECK-X64:   12 |     char AT2FieldName0
-// CHECK-X64:   20 |   struct AT1 (base)
-// CHECK-X64:   20 |     struct V (base)
-// CHECK-X64:   20 |       struct AT (base) (empty)
-// CHECK-X64:   20 |       char c
-// CHECK-X64:   24 |     int a
-// CHECK-X64:      | [sizeof=28, align=4
-// CHECK-X64:      |  nvsize=28, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AT3
+// CHECK-X64-NEXT:    0 |   struct AT2 (base)
+// CHECK-X64-NEXT:    0 |     struct AT0 t
+// CHECK-X64-NEXT:    0 |       union AT0::<anonymous at {{.*}} x
+// CHECK-X64-NEXT:    0 |         struct AT0::<anonymous at {{.*}} y
+// CHECK-X64-NEXT:    0 |           int a
+// CHECK-X64-NEXT:    4 |           struct AT t (empty)
+// CHECK-X64:         0 |         int b
+// CHECK-X64:         8 |       char c
+// CHECK-X64:        12 |     char AT2FieldName0
+// CHECK-X64-NEXT:   20 |   struct AT1 (base)
+// CHECK-X64-NEXT:   20 |     struct V (base)
+// CHECK-X64-NEXT:   20 |       struct AT (base) (empty)
+// CHECK-X64-NEXT:   20 |       char c
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:      | [sizeof=28, align=4
+// CHECK-X64-NEXT:      |  nvsize=28, nvalign=4]
 
 struct BT0 {
 	BT0() {
@@ -103,21 +117,25 @@ struct BT3 : BT0, BT2 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct BT3
-// CHECK:    0 |   struct BT0 (base) (empty)
-// CHECK:    1 |   struct BT2 (base)
-// CHECK:    1 |     struct BT0 (base) (empty)
-// CHECK:    1 |     char BT2FieldName0
-// CHECK:      | [sizeof=2, align=1
-// CHECK:      |  nvsize=2, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct BT3
+// CHECK-NEXT:    0 |   struct BT0 (base) (empty)
+// CHECK-NEXT:    1 |   struct BT2 (base)
+// CHECK-NEXT:    1 |     struct BT0 (base) (empty)
+// CHECK-NEXT:    1 |     char BT2FieldName0
+// CHECK-NEXT:      | [sizeof=2, align=1
+// CHECK-NEXT:      |  nvsize=2, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct BT3
-// CHECK-X64:    0 |   struct BT0 (base) (empty)
-// CHECK-X64:    1 |   struct BT2 (base)
-// CHECK-X64:    1 |     struct BT0 (base) (empty)
-// CHECK-X64:    1 |     char BT2FieldName0
-// CHECK-X64:      | [sizeof=2, align=1
-// CHECK-X64:      |  nvsize=2, nvalign=1]
+// CHECK-X64-NEXT:    0 | struct BT3
+// CHECK-X64-NEXT:    0 |   struct BT0 (base) (empty)
+// CHECK-X64-NEXT:    1 |   struct BT2 (base)
+// CHECK-X64-NEXT:    1 |     struct BT0 (base) (empty)
+// CHECK-X64-NEXT:    1 |     char BT2FieldName0
+// CHECK-X64-NEXT:      | [sizeof=2, align=1
+// CHECK-X64-NEXT:      |  nvsize=2, nvalign=1]
 
 struct T0 : AT {
 	T0() {
@@ -148,29 +166,35 @@ struct __declspec(align(1)) T3 : virtual T1, virtual T2 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct T3
-// CHECK:    0 |   (T3 vbtable pointer)
-// CHECK:    4 |   struct T1 (virtual base)
-// CHECK:    4 |     struct T0 (base) (empty)
-// CHECK:    4 |       struct AT (base) (empty)
-// CHECK:    4 |     char a
-// CHECK:   12 |   struct T2 (virtual base)
-// CHECK:   12 |     struct AT (base) (empty)
-// CHECK:   12 |     char a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct T3
+// CHECK-NEXT:    0 |   (T3 vbtable pointer)
+// CHECK-NEXT:    4 |   struct T1 (virtual base)
+// CHECK-NEXT:    4 |     struct T0 (base) (empty)
+// CHECK-NEXT:    4 |       struct AT (base) (empty)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:   12 |   struct T2 (virtual base)
+// CHECK-NEXT:   12 |     struct AT (base) (empty)
+// CHECK-NEXT:   12 |     char a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct T3
-// CHECK-X64:    0 |   (T3 vbtable pointer)
-// CHECK-X64:    8 |   struct T1 (virtual base)
-// CHECK-X64:    8 |     struct T0 (base) (empty)
-// CHECK-X64:    8 |       struct AT (base) (empty)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   16 |   struct T2 (virtual base)
-// CHECK-X64:   16 |     struct AT (base) (empty)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct T3
+// CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct T1 (virtual base)
+// CHECK-X64-NEXT:    8 |     struct T0 (base) (empty)
+// CHECK-X64-NEXT:    8 |       struct AT (base) (empty)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   16 |   struct T2 (virtual base)
+// CHECK-X64-NEXT:   16 |     struct AT (base) (empty)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 int a[
 sizeof(AT3) +
diff --git a/test/Layout/ms-x86-aligned-tail-padding.cpp b/test/Layout/ms-x86-aligned-tail-padding.cpp
index b9020f386c03a3bffe8c1f2b693b930c1ea65ce6..3b5be919d116da662fdb1ac706499fac783a9694 100644
--- a/test/Layout/ms-x86-aligned-tail-padding.cpp
+++ b/test/Layout/ms-x86-aligned-tail-padding.cpp
@@ -75,33 +75,41 @@ struct A : B1, B0, B2, virtual V {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   struct B1 (base)
-// CHECK:    0 |     int a
-// CHECK:    4 |   struct B0 (base)
-// CHECK:    4 |     int a
-// CHECK:   16 |   struct B2 (base)
-// CHECK:   16 |     int a
-// CHECK:   32 |   (A vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   64 |   struct V (virtual base)
-// CHECK:   64 |     char a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   struct B1 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    4 |   struct B0 (base)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:   16 |   struct B2 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   32 |   (A vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   64 |   struct V (virtual base)
+// CHECK-NEXT:   64 |     char a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   struct B1 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:    4 |   struct B0 (base)
-// CHECK-X64:    4 |     int a
-// CHECK-X64:   16 |   struct B2 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   (A vbtable pointer)
-// CHECK-X64:   40 |   int a
-// CHECK-X64:   48 |   struct V (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   struct B1 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:    4 |   struct B0 (base)
+// CHECK-X64-NEXT:    4 |     int a
+// CHECK-X64-NEXT:   16 |   struct B2 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   (A vbtable pointer)
+// CHECK-X64-NEXT:   40 |   int a
+// CHECK-X64-NEXT:   48 |   struct V (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct B : B2, B0, B1, virtual V {
 	int a;
@@ -109,33 +117,33 @@ struct B : B2, B0, B1, virtual V {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct B2 (base)
-// CHECK:    0 |     int a
-// CHECK:   16 |   struct B0 (base)
-// CHECK:   16 |     int a
-// CHECK:   32 |   struct B1 (base)
-// CHECK:   32 |     int a
-// CHECK:   36 |   (B vbtable pointer)
-// CHECK:   52 |   int a
-// CHECK:   64 |   struct V (virtual base)
-// CHECK:   64 |     char a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct B2 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:   16 |   struct B0 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   32 |   struct B1 (base)
+// CHECK-NEXT:   32 |     int a
+// CHECK-NEXT:   36 |   (B vbtable pointer)
+// CHECK-NEXT:   52 |   int a
+// CHECK-NEXT:   64 |   struct V (virtual base)
+// CHECK-NEXT:   64 |     char a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   struct B2 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:   16 |   struct B0 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   struct B1 (base)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:   40 |   (B vbtable pointer)
-// CHECK-X64:   48 |   int a
-// CHECK-X64:   64 |   struct V (virtual base)
-// CHECK-X64:   64 |     char a
-// CHECK-X64:      | [sizeof=80, align=16
-// CHECK-X64:      |  nvsize=64, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   struct B2 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:   16 |   struct B0 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   struct B1 (base)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:   40 |   (B vbtable pointer)
+// CHECK-X64-NEXT:   48 |   int a
+// CHECK-X64-NEXT:   64 |   struct V (virtual base)
+// CHECK-X64-NEXT:   64 |     char a
+// CHECK-X64-NEXT:      | [sizeof=80, align=16
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
 
 struct C : B1, B0, virtual V {
 	int a;
@@ -144,31 +152,31 @@ struct C : B1, B0, virtual V {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   struct B1 (base)
-// CHECK:    0 |     int a
-// CHECK:    4 |   struct B0 (base)
-// CHECK:    4 |     int a
-// CHECK:    8 |   (C vbtable pointer)
-// CHECK:   24 |   int a
-// CHECK:   32 |   long long a1
-// CHECK:   48 |   struct V (virtual base)
-// CHECK:   48 |     char a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   struct B1 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    4 |   struct B0 (base)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   (C vbtable pointer)
+// CHECK-NEXT:   24 |   int a
+// CHECK-NEXT:   32 |   long long a1
+// CHECK-NEXT:   48 |   struct V (virtual base)
+// CHECK-NEXT:   48 |     char a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   struct B1 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:    4 |   struct B0 (base)
-// CHECK-X64:    4 |     int a
-// CHECK-X64:    8 |   (C vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   long long a1
-// CHECK-X64:   32 |   struct V (virtual base)
-// CHECK-X64:   32 |     char a
-// CHECK-X64:      | [sizeof=48, align=16
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   struct B1 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:    4 |   struct B0 (base)
+// CHECK-X64-NEXT:    4 |     int a
+// CHECK-X64-NEXT:    8 |   (C vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   long long a1
+// CHECK-X64-NEXT:   32 |   struct V (virtual base)
+// CHECK-X64-NEXT:   32 |     char a
+// CHECK-X64-NEXT:      | [sizeof=48, align=16
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct D : B2, B0, virtual V {
 	int a;
@@ -176,29 +184,29 @@ struct D : B2, B0, virtual V {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct B2 (base)
-// CHECK:    0 |     int a
-// CHECK:   16 |   struct B0 (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |   (D vbtable pointer)
-// CHECK:   36 |   int a
-// CHECK:   48 |   struct V (virtual base)
-// CHECK:   48 |     char a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct B2 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:   16 |   struct B0 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |   (D vbtable pointer)
+// CHECK-NEXT:   36 |   int a
+// CHECK-NEXT:   48 |   struct V (virtual base)
+// CHECK-NEXT:   48 |     char a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   struct B2 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:   16 |   struct B0 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   (D vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct V (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   struct B2 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:   16 |   struct B0 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   (D vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct V (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct E : B3, B0, virtual V {
 	int a;
@@ -206,31 +214,33 @@ struct E : B3, B0, virtual V {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   struct B3 (base)
-// CHECK:    0 |     long long a1
-// CHECK:    8 |     int a
-// CHECK:   16 |   struct B0 (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |   (E vbtable pointer)
-// CHECK:   36 |   int a
-// CHECK:   48 |   struct V (virtual base)
-// CHECK:   48 |     char a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   struct B3 (base)
+// CHECK-NEXT:    0 |     long long a1
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   16 |   struct B0 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |   (E vbtable pointer)
+// CHECK-NEXT:   36 |   int a
+// CHECK-NEXT:   48 |   struct V (virtual base)
+// CHECK-NEXT:   48 |     char a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   struct B3 (base)
-// CHECK-X64:    0 |     long long a1
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   struct B0 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   (E vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct V (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   struct B3 (base)
+// CHECK-X64-NEXT:    0 |     long long a1
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   struct B0 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   (E vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct V (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct F : B0, virtual V1 {
 	__declspec(align(16)) int a;
@@ -239,29 +249,33 @@ struct F : B0, virtual V1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   struct B0 (base)
-// CHECK:    0 |     int a
-// CHECK:    4 |   (F vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   92 |   (vtordisp for vbase V1)
-// CHECK:   96 |   struct V1 (virtual base)
-// CHECK:   96 |     (V1 vftable pointer)
-// CHECK:  128 |     struct A16 (base) (empty)
-// CHECK:      | [sizeof=128, align=32
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   struct B0 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    4 |   (F vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   92 |   (vtordisp for vbase V1)
+// CHECK-NEXT:   96 |   struct V1 (virtual base)
+// CHECK-NEXT:   96 |     (V1 vftable pointer)
+// CHECK-NEXT:  128 |     struct A16 (base) (empty)
+// CHECK-NEXT:      | [sizeof=128, align=32
+// CHECK-NEXT:      |  nvsize=48, nvalign=32]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   struct B0 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:    8 |   (F vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   60 |   (vtordisp for vbase V1)
-// CHECK-X64:   64 |   struct V1 (virtual base)
-// CHECK-X64:   64 |     (V1 vftable pointer)
-// CHECK-X64:   96 |     struct A16 (base) (empty)
-// CHECK-X64:      | [sizeof=96, align=32
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   struct B0 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:    8 |   (F vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   60 |   (vtordisp for vbase V1)
+// CHECK-X64-NEXT:   64 |   struct V1 (virtual base)
+// CHECK-X64-NEXT:   64 |     (V1 vftable pointer)
+// CHECK-X64-NEXT:   96 |     struct A16 (base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=96, align=32
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=32]
 
 struct G : virtual V2, virtual V3 {
 	int a;
@@ -269,27 +283,31 @@ struct G : virtual V2, virtual V3 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    0 |   (G vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct V2 (virtual base)
-// CHECK:    8 |     long long a
-// CHECK:   16 |     int a1
-// CHECK:   24 |   struct V3 (virtual base)
-// CHECK:   24 |     int a
-// CHECK:      | [sizeof=28, align=8
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    0 |   (G vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct V2 (virtual base)
+// CHECK-NEXT:    8 |     long long a
+// CHECK-NEXT:   16 |     int a1
+// CHECK-NEXT:   24 |   struct V3 (virtual base)
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:      | [sizeof=28, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct G
-// CHECK-X64:    0 |   (G vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct V2 (virtual base)
-// CHECK-X64:   16 |     long long a
-// CHECK-X64:   24 |     int a1
-// CHECK-X64:   32 |   struct V3 (virtual base)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct G
+// CHECK-X64-NEXT:    0 |   (G vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct V2 (virtual base)
+// CHECK-X64-NEXT:   16 |     long long a
+// CHECK-X64-NEXT:   24 |     int a1
+// CHECK-X64-NEXT:   32 |   struct V3 (virtual base)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct H {
 	__declspec(align(16)) int a;
@@ -298,17 +316,17 @@ struct H {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct H
-// CHECK:    0 |   int a
-// CHECK:    4 |   int b
-// CHECK:      | [sizeof=16, align=16
-// CHECK:      |  nvsize=16, nvalign=16]
+// CHECK-NEXT:    0 | struct H
+// CHECK-NEXT:    0 |   int a
+// CHECK-NEXT:    4 |   int b
+// CHECK-NEXT:      | [sizeof=16, align=16
+// CHECK-NEXT:      |  nvsize=16, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct H
-// CHECK-X64:    0 |   int a
-// CHECK-X64:    4 |   int b
-// CHECK-X64:      | [sizeof=16, align=16
-// CHECK-X64:      |  nvsize=16, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct H
+// CHECK-X64-NEXT:    0 |   int a
+// CHECK-X64-NEXT:    4 |   int b
+// CHECK-X64-NEXT:      | [sizeof=16, align=16
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
 
 struct I {
 	B2 a;
@@ -317,19 +335,19 @@ struct I {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct I
-// CHECK:    0 |   struct B2 a
-// CHECK:    0 |     int a
-// CHECK:   16 |   int b
-// CHECK:      | [sizeof=32, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
+// CHECK-NEXT:    0 | struct I
+// CHECK-NEXT:    0 |   struct B2 a
+// CHECK-NEXT:    0 |     int a
+// CHECK:        16 |   int b
+// CHECK-NEXT:      | [sizeof=32, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct I
-// CHECK-X64:    0 |   struct B2 a
-// CHECK-X64:    0 |     int a
-// CHECK-X64:   16 |   int b
-// CHECK-X64:      | [sizeof=32, align=16
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct I
+// CHECK-X64-NEXT:    0 |   struct B2 a
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64:        16 |   int b
+// CHECK-X64-NEXT:      | [sizeof=32, align=16
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
 	int a;
@@ -339,41 +357,49 @@ struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AX
-// CHECK:    0 |   (AX vftable pointer)
-// CHECK:   16 |   struct B0X (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |     int a1
-// CHECK:   24 |   (AX vbtable pointer)
-// CHECK:   40 |   int a
-// CHECK:   48 |   struct B2X (virtual base)
-// CHECK:   48 |     int a
-// CHECK:   52 |   struct B6X (virtual base)
-// CHECK:   52 |     int a
-// CHECK:   76 |   (vtordisp for vbase B3X)
-// CHECK:   80 |   struct B3X (virtual base)
-// CHECK:   80 |     (B3X vftable pointer)
-// CHECK:   84 |     int a
-// CHECK:      | [sizeof=96, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AX
+// CHECK-NEXT:    0 |   (AX vftable pointer)
+// CHECK-NEXT:   16 |   struct B0X (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |     int a1
+// CHECK-NEXT:   24 |   (AX vbtable pointer)
+// CHECK-NEXT:   40 |   int a
+// CHECK-NEXT:   48 |   struct B2X (virtual base)
+// CHECK-NEXT:   48 |     int a
+// CHECK-NEXT:   52 |   struct B6X (virtual base)
+// CHECK-NEXT:   52 |     int a
+// CHECK-NEXT:   76 |   (vtordisp for vbase B3X)
+// CHECK-NEXT:   80 |   struct B3X (virtual base)
+// CHECK-NEXT:   80 |     (B3X vftable pointer)
+// CHECK-NEXT:   84 |     int a
+// CHECK-NEXT:      | [sizeof=96, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AX
-// CHECK-X64:    0 |   (AX vftable pointer)
-// CHECK-X64:   16 |   struct B0X (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   20 |     int a1
-// CHECK-X64:   24 |   (AX vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B2X (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:   52 |   struct B6X (virtual base)
-// CHECK-X64:   52 |     int a
-// CHECK-X64:   76 |   (vtordisp for vbase B3X)
-// CHECK-X64:   80 |   struct B3X (virtual base)
-// CHECK-X64:   80 |     (B3X vftable pointer)
-// CHECK-X64:   88 |     int a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AX
+// CHECK-X64-NEXT:    0 |   (AX vftable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0X (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   20 |     int a1
+// CHECK-X64-NEXT:   24 |   (AX vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
+// CHECK-X64-NEXT:   52 |     int a
+// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
+// CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
+// CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
+// CHECK-X64-NEXT:   88 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
 	int a;
@@ -383,43 +409,47 @@ struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct BX
-// CHECK:    0 |   (BX vftable pointer)
-// CHECK:   16 |   struct B4X (base)
-// CHECK:   16 |     struct A16X (base) (empty)
-// CHECK:   16 |     int a
-// CHECK:   20 |     int a1
-// CHECK:   32 |   (BX vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   64 |   struct B2X (virtual base)
-// CHECK:   64 |     int a
-// CHECK:   68 |   struct B6X (virtual base)
-// CHECK:   68 |     int a
-// CHECK:   92 |   (vtordisp for vbase B3X)
-// CHECK:   96 |   struct B3X (virtual base)
-// CHECK:   96 |     (B3X vftable pointer)
-// CHECK:  100 |     int a
-// CHECK:      | [sizeof=112, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct BX
+// CHECK-NEXT:    0 |   (BX vftable pointer)
+// CHECK-NEXT:   16 |   struct B4X (base)
+// CHECK-NEXT:   16 |     struct A16X (base) (empty)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |     int a1
+// CHECK-NEXT:   32 |   (BX vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   64 |   struct B2X (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:   68 |   struct B6X (virtual base)
+// CHECK-NEXT:   68 |     int a
+// CHECK-NEXT:   92 |   (vtordisp for vbase B3X)
+// CHECK-NEXT:   96 |   struct B3X (virtual base)
+// CHECK-NEXT:   96 |     (B3X vftable pointer)
+// CHECK-NEXT:  100 |     int a
+// CHECK-NEXT:      | [sizeof=112, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct BX
-// CHECK-X64:    0 |   (BX vftable pointer)
-// CHECK-X64:   16 |   struct B4X (base)
-// CHECK-X64:   16 |     struct A16X (base) (empty)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   20 |     int a1
-// CHECK-X64:   32 |   (BX vbtable pointer)
-// CHECK-X64:   40 |   int a
-// CHECK-X64:   48 |   struct B2X (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:   52 |   struct B6X (virtual base)
-// CHECK-X64:   52 |     int a
-// CHECK-X64:   76 |   (vtordisp for vbase B3X)
-// CHECK-X64:   80 |   struct B3X (virtual base)
-// CHECK-X64:   80 |     (B3X vftable pointer)
-// CHECK-X64:   88 |     int a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct BX
+// CHECK-X64-NEXT:    0 |   (BX vftable pointer)
+// CHECK-X64-NEXT:   16 |   struct B4X (base)
+// CHECK-X64-NEXT:   16 |     struct A16X (base) (empty)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   20 |     int a1
+// CHECK-X64-NEXT:   32 |   (BX vbtable pointer)
+// CHECK-X64-NEXT:   40 |   int a
+// CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
+// CHECK-X64-NEXT:   52 |     int a
+// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
+// CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
+// CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
+// CHECK-X64-NEXT:   88 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
 	int a;
@@ -429,43 +459,45 @@ struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct CX
-// CHECK:    0 |   (CX vftable pointer)
-// CHECK:   16 |   struct B5X (base)
-// CHECK:   16 |     (B5X vbtable pointer)
-// CHECK:   20 |     int a
-// CHECK:   24 |     int a1
-// CHECK:   28 |   int a
-// CHECK:   32 |   struct A16X (virtual base) (empty)
-// CHECK:   32 |   struct B2X (virtual base)
-// CHECK:   32 |     int a
-// CHECK:   36 |   struct B6X (virtual base)
-// CHECK:   36 |     int a
-// CHECK:   60 |   (vtordisp for vbase B3X)
-// CHECK:   64 |   struct B3X (virtual base)
-// CHECK:   64 |     (B3X vftable pointer)
-// CHECK:   68 |     int a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct CX
+// CHECK-NEXT:    0 |   (CX vftable pointer)
+// CHECK-NEXT:   16 |   struct B5X (base)
+// CHECK-NEXT:   16 |     (B5X vbtable pointer)
+// CHECK-NEXT:   20 |     int a
+// CHECK-NEXT:   24 |     int a1
+// CHECK-NEXT:   28 |   int a
+// CHECK-NEXT:   32 |   struct A16X (virtual base) (empty)
+// CHECK-NEXT:   32 |   struct B2X (virtual base)
+// CHECK-NEXT:   32 |     int a
+// CHECK-NEXT:   36 |   struct B6X (virtual base)
+// CHECK-NEXT:   36 |     int a
+// CHECK-NEXT:   60 |   (vtordisp for vbase B3X)
+// CHECK-NEXT:   64 |   struct B3X (virtual base)
+// CHECK-NEXT:   64 |     (B3X vftable pointer)
+// CHECK-NEXT:   68 |     int a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct CX
-// CHECK-X64:    0 |   (CX vftable pointer)
-// CHECK-X64:   16 |   struct B5X (base)
-// CHECK-X64:   16 |     (B5X vbtable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   28 |     int a1
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct A16X (virtual base) (empty)
-// CHECK-X64:   48 |   struct B2X (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:   52 |   struct B6X (virtual base)
-// CHECK-X64:   52 |     int a
-// CHECK-X64:   76 |   (vtordisp for vbase B3X)
-// CHECK-X64:   80 |   struct B3X (virtual base)
-// CHECK-X64:   80 |     (B3X vftable pointer)
-// CHECK-X64:   88 |     int a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct CX
+// CHECK-X64-NEXT:    0 |   (CX vftable pointer)
+// CHECK-X64-NEXT:   16 |   struct B5X (base)
+// CHECK-X64-NEXT:   16 |     (B5X vbtable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   28 |     int a1
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct A16X (virtual base) (empty)
+// CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
+// CHECK-X64-NEXT:   52 |     int a
+// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
+// CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
+// CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
+// CHECK-X64-NEXT:   88 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct __declspec(align(16)) DX {
 	int a;
@@ -474,17 +506,17 @@ struct __declspec(align(16)) DX {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct DX
-// CHECK:    0 |   (DX vftable pointer)
-// CHECK:    4 |   int a
-// CHECK:      | [sizeof=16, align=16
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct DX
+// CHECK-NEXT:    0 |   (DX vftable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:      | [sizeof=16, align=16
+// CHECK-NEXT:      |  nvsize=8, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct DX
-// CHECK-X64:    0 |   (DX vftable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:      | [sizeof=16, align=16
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct DX
+// CHECK-X64-NEXT:    0 |   (DX vftable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:      | [sizeof=16, align=16
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-basic-layout.cpp b/test/Layout/ms-x86-basic-layout.cpp
index b65930b4505ea8fb9bc4692c4592e970a9d92c1f..f509f2938cb657825738c62e01178343c0f4021c 100644
--- a/test/Layout/ms-x86-basic-layout.cpp
+++ b/test/Layout/ms-x86-basic-layout.cpp
@@ -77,7 +77,7 @@ struct TestF1 : A4, virtual A16 {
 // CHECK-NEXT:   16 |   struct A16 (virtual base)
 // CHECK-NEXT:   16 |     int a
 // CHECK-NEXT:      | [sizeof=32, align=16
-// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:      |  nvsize=12, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct TestF1
@@ -88,7 +88,7 @@ struct TestF1 : A4, virtual A16 {
 // CHECK-X64-NEXT:   32 |   struct A16 (virtual base)
 // CHECK-X64-NEXT:   32 |     int a
 // CHECK-X64-NEXT:      | [sizeof=48, align=16
-// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
 
 struct TestF2 : A4, virtual C4 {
 	int a;
@@ -136,7 +136,7 @@ struct TestF3 : A4, virtual C16 {
 // CHECK-NEXT:   16 |     (C16 vftable pointer)
 // CHECK-NEXT:   32 |     int a
 // CHECK-NEXT:      | [sizeof=48, align=16
-// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:      |  nvsize=12, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct TestF3
@@ -148,7 +148,7 @@ struct TestF3 : A4, virtual C16 {
 // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
 // CHECK-X64-NEXT:   48 |     int a
 // CHECK-X64-NEXT:      | [sizeof=64, align=16
-// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
 
 struct TestF4 : TestF3, A4 {
 	int a;
@@ -281,7 +281,7 @@ struct TestF7 : A4, virtual C16 {
 // CHECK-NEXT:   32 |     (C16 vftable pointer)
 // CHECK-NEXT:   48 |     int a
 // CHECK-NEXT:      | [sizeof=64, align=16
-// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:      |  nvsize=12, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct TestF7
 // CHECK-X64-NEXT:    0 |   struct A4 (base)
@@ -293,7 +293,7 @@ struct TestF7 : A4, virtual C16 {
 // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
 // CHECK-X64-NEXT:   64 |     int a
 // CHECK-X64-NEXT:      | [sizeof=80, align=16
-// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
 
 struct TestF8 : TestF7, A4 {
 	int a;
@@ -351,7 +351,7 @@ struct TestF9 : A4, virtual C16 {
 // CHECK-NEXT:   16 |     (C16 vftable pointer)
 // CHECK-NEXT:   32 |     int a
 // CHECK-NEXT:      | [sizeof=48, align=16
-// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-NEXT:      |  nvsize=16, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct TestF9
 // CHECK-X64-NEXT:    0 |   (TestF9 vftable pointer)
@@ -363,7 +363,7 @@ struct TestF9 : A4, virtual C16 {
 // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
 // CHECK-X64-NEXT:   48 |     int a
 // CHECK-X64-NEXT:      | [sizeof=64, align=16
-// CHECK-X64-NEXT:      |  nvsize=32, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct TestFA : TestF9, A4 {
 	int a;
@@ -604,7 +604,7 @@ struct F2 : A4, virtual A16f {
 // CHECK-NEXT:   16 |     (A16f vftable pointer)
 // CHECK-NEXT:   32 |     int a
 // CHECK-NEXT:      | [sizeof=48, align=16
-// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-NEXT:      |  nvsize=16, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct F2
 // CHECK-X64-NEXT:    0 |   (F2 vftable pointer)
@@ -616,7 +616,7 @@ struct F2 : A4, virtual A16f {
 // CHECK-X64-NEXT:   32 |     (A16f vftable pointer)
 // CHECK-X64-NEXT:   48 |     int a
 // CHECK-X64-NEXT:      | [sizeof=64, align=16
-// CHECK-X64-NEXT:      |  nvsize=32, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct F3 : A4, virtual A16f {
 	__declspec(align(16)) int a;
@@ -748,7 +748,7 @@ struct F6 : virtual A16f, A4, virtual B {
 // CHECK-NEXT:   64 |       (X vbtable pointer)
 // CHECK-NEXT:   68 |     int a
 // CHECK-NEXT:      | [sizeof=80, align=16
-// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-NEXT:      |  nvsize=16, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64-NEXT:    0 | struct F6
 // CHECK-X64-NEXT:    0 |   (F6 vftable pointer)
@@ -768,7 +768,7 @@ struct F6 : virtual A16f, A4, virtual B {
 // CHECK-X64-NEXT:   80 |       (X vbtable pointer)
 // CHECK-X64-NEXT:   88 |     int a
 // CHECK-X64-NEXT:      | [sizeof=96, align=16
-// CHECK-X64-NEXT:      |  nvsize=32, nvalign=8]
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 int a[
 sizeof(TestF0)+
diff --git a/test/Layout/ms-x86-bitfields-vbases.cpp b/test/Layout/ms-x86-bitfields-vbases.cpp
index f973edd6a3e54621f2dc5a77288e6e8291313caa..240cc99976c6e5c5aaeb013dbbed1933c89f9e1b 100644
--- a/test/Layout/ms-x86-bitfields-vbases.cpp
+++ b/test/Layout/ms-x86-bitfields-vbases.cpp
@@ -9,104 +9,108 @@ struct B1 { int a; };
 struct A : virtual B0 { char a : 1; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vbtable pointer)
-// CHECK:    4 |   char a
-// CHECK:   12 |   struct B0 (virtual base)
-// CHECK:   12 |     int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vbtable pointer)
+// CHECK-NEXT:    4 |   char a
+// CHECK-NEXT:   12 |   struct B0 (virtual base)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vbtable pointer)
-// CHECK-X64:    8 |   char a
-// CHECK-X64:   20 |   struct B0 (virtual base)
-// CHECK-X64:   20 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vbtable pointer)
+// CHECK-X64-NEXT:    8 |   char a
+// CHECK-X64-NEXT:   20 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   20 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct B : virtual B0 { short a : 1; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   (B vbtable pointer)
-// CHECK:    4 |   short a
-// CHECK:   12 |   struct B0 (virtual base)
-// CHECK:   12 |     int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   (B vbtable pointer)
+// CHECK-NEXT:    4 |   short a
+// CHECK-NEXT:   12 |   struct B0 (virtual base)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   (B vbtable pointer)
-// CHECK-X64:    8 |   short a
-// CHECK-X64:   20 |   struct B0 (virtual base)
-// CHECK-X64:   20 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
+// CHECK-X64-NEXT:    8 |   short a
+// CHECK-X64-NEXT:   20 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   20 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct C : virtual B0 { char a : 1; char : 0; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vbtable pointer)
-// CHECK:    4 |   char a
-// CHECK:    5 |   char
-// CHECK:    8 |   struct B0 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vbtable pointer)
+// CHECK-NEXT:    4 |   char a
+// CHECK-NEXT:    5 |   char
+// CHECK-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vbtable pointer)
-// CHECK-X64:    8 |   char a
-// CHECK-X64:    9 |   char
-// CHECK-X64:   16 |   struct B0 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vbtable pointer)
+// CHECK-X64-NEXT:    8 |   char a
+// CHECK-X64-NEXT:    9 |   char
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct D : virtual B0 { char a : 1; char b; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   (D vbtable pointer)
-// CHECK:    4 |   char a
-// CHECK:    5 |   char b
-// CHECK:    8 |   struct B0 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   (D vbtable pointer)
+// CHECK-NEXT:    4 |   char a
+// CHECK-NEXT:    5 |   char b
+// CHECK-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   (D vbtable pointer)
-// CHECK-X64:    8 |   char a
-// CHECK-X64:    9 |   char b
-// CHECK-X64:   16 |   struct B0 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   (D vbtable pointer)
+// CHECK-X64-NEXT:    8 |   char a
+// CHECK-X64-NEXT:    9 |   char b
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct E : virtual B0, virtual B1 { long long : 1; };
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   (E vbtable pointer)
-// CHECK:    8 |   long long
-// CHECK:   24 |   struct B0 (virtual base)
-// CHECK:   24 |     int a
-// CHECK:   36 |   struct B1 (virtual base)
-// CHECK:   36 |     int a
-// CHECK:      | [sizeof=40, align=8
-// CHECK:      |  nvsize=16, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   (E vbtable pointer)
+// CHECK-NEXT:    8 |   long long
+// CHECK-NEXT:   24 |   struct B0 (virtual base)
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:   36 |   struct B1 (virtual base)
+// CHECK-NEXT:   36 |     int a
+// CHECK-NEXT:      | [sizeof=40, align=8
+// CHECK-NEXT:      |  nvsize=16, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   (E vbtable pointer)
-// CHECK-X64:    8 |   long long
-// CHECK-X64:   24 |   struct B0 (virtual base)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   36 |   struct B1 (virtual base)
-// CHECK-X64:   36 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
+// CHECK-X64-NEXT:    8 |   long long
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   36 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   36 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-empty-base-after-base-with-vbptr.cpp b/test/Layout/ms-x86-empty-base-after-base-with-vbptr.cpp
index 293a61b96e646b8e8ea777df6200e0146f0707bc..8d71b0585d682942cca55d874acb19d5e8afa0df 100644
--- a/test/Layout/ms-x86-empty-base-after-base-with-vbptr.cpp
+++ b/test/Layout/ms-x86-empty-base-after-base-with-vbptr.cpp
@@ -14,197 +14,209 @@ struct Z : Y { };
 struct A : X, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    9 |   struct W (base) (empty)
-// CHECK:    9 |   char a
-// CHECK:   12 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    9 |   struct W (base) (empty)
+// CHECK-NEXT:    9 |   char a
+// CHECK-NEXT:   12 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   17 |   struct W (base) (empty)
-// CHECK-X64:   17 |   char a
-// CHECK-X64:   24 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   17 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   17 |   char a
+// CHECK-X64-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct B : X, U, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    8 |   struct U (base)
-// CHECK:    8 |     char a
-// CHECK:    9 |   struct W (base) (empty)
-// CHECK:    9 |   char a
-// CHECK:   12 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    8 |   struct U (base)
+// CHECK-NEXT:    8 |     char a
+// CHECK-NEXT:    9 |   struct W (base) (empty)
+// CHECK-NEXT:    9 |   char a
+// CHECK-NEXT:   12 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   16 |   struct U (base)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:   17 |   struct W (base) (empty)
-// CHECK-X64:   17 |   char a
-// CHECK-X64:   24 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   16 |   struct U (base)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:   17 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   17 |   char a
+// CHECK-X64-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct C : X, V, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    9 |   struct V (base) (empty)
-// CHECK:   10 |   struct W (base) (empty)
-// CHECK:   10 |   char a
-// CHECK:   12 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    9 |   struct V (base) (empty)
+// CHECK-NEXT:   10 |   struct W (base) (empty)
+// CHECK-NEXT:   10 |   char a
+// CHECK-NEXT:   12 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   17 |   struct V (base) (empty)
-// CHECK-X64:   18 |   struct W (base) (empty)
-// CHECK-X64:   18 |   char a
-// CHECK-X64:   24 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   17 |   struct V (base) (empty)
+// CHECK-X64-NEXT:   18 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   18 |   char a
+// CHECK-X64-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct D : X, U, V, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    8 |   struct U (base)
-// CHECK:    8 |     char a
-// CHECK:    9 |   struct V (base) (empty)
-// CHECK:   10 |   struct W (base) (empty)
-// CHECK:   10 |   char a
-// CHECK:   12 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    8 |   struct U (base)
+// CHECK-NEXT:    8 |     char a
+// CHECK-NEXT:    9 |   struct V (base) (empty)
+// CHECK-NEXT:   10 |   struct W (base) (empty)
+// CHECK-NEXT:   10 |   char a
+// CHECK-NEXT:   12 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   16 |   struct U (base)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:   17 |   struct V (base) (empty)
-// CHECK-X64:   18 |   struct W (base) (empty)
-// CHECK-X64:   18 |   char a
-// CHECK-X64:   24 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   16 |   struct U (base)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:   17 |   struct V (base) (empty)
+// CHECK-X64-NEXT:   18 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   18 |   char a
+// CHECK-X64-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct E : X, U, Y, V, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    8 |   struct U (base)
-// CHECK:    8 |     char a
-// CHECK:   12 |   struct Y (base)
-// CHECK:   12 |     (Y vbtable pointer)
-// CHECK:   16 |     char a
-// CHECK:   21 |   struct V (base) (empty)
-// CHECK:   22 |   struct W (base) (empty)
-// CHECK:   22 |   char a
-// CHECK:   24 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=24, align=4
-// CHECK:      |  nvsize=24, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    8 |   struct U (base)
+// CHECK-NEXT:    8 |     char a
+// CHECK-NEXT:   12 |   struct Y (base)
+// CHECK-NEXT:   12 |     (Y vbtable pointer)
+// CHECK-NEXT:   16 |     char a
+// CHECK-NEXT:   21 |   struct V (base) (empty)
+// CHECK-NEXT:   22 |   struct W (base) (empty)
+// CHECK-NEXT:   22 |   char a
+// CHECK-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=24, align=4
+// CHECK-NEXT:      |  nvsize=24, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   16 |   struct U (base)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:   24 |   struct Y (base)
-// CHECK-X64:   24 |     (Y vbtable pointer)
-// CHECK-X64:   32 |     char a
-// CHECK-X64:   41 |   struct V (base) (empty)
-// CHECK-X64:   42 |   struct W (base) (empty)
-// CHECK-X64:   42 |   char a
-// CHECK-X64:   48 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=8
-// CHECK-X64:      |  nvsize=48, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   16 |   struct U (base)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:   24 |   struct Y (base)
+// CHECK-X64-NEXT:   24 |     (Y vbtable pointer)
+// CHECK-X64-NEXT:   32 |     char a
+// CHECK-X64-NEXT:   41 |   struct V (base) (empty)
+// CHECK-X64-NEXT:   42 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   42 |   char a
+// CHECK-X64-NEXT:   48 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=8
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=8]
 
 struct F : Z, W  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   struct Z (base)
-// CHECK:    0 |     struct Y (base)
-// CHECK:    0 |       (Y vbtable pointer)
-// CHECK:    4 |       char a
-// CHECK:    9 |   struct W (base) (empty)
-// CHECK:    9 |   char a
-// CHECK:   12 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   struct Z (base)
+// CHECK-NEXT:    0 |     struct Y (base)
+// CHECK-NEXT:    0 |       (Y vbtable pointer)
+// CHECK-NEXT:    4 |       char a
+// CHECK-NEXT:    9 |   struct W (base) (empty)
+// CHECK-NEXT:    9 |   char a
+// CHECK-NEXT:   12 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   struct Z (base)
-// CHECK-X64:    0 |     struct Y (base)
-// CHECK-X64:    0 |       (Y vbtable pointer)
-// CHECK-X64:    8 |       char a
-// CHECK-X64:   17 |   struct W (base) (empty)
-// CHECK-X64:   17 |   char a
-// CHECK-X64:   24 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   struct Z (base)
+// CHECK-X64-NEXT:    0 |     struct Y (base)
+// CHECK-X64-NEXT:    0 |       (Y vbtable pointer)
+// CHECK-X64-NEXT:    8 |       char a
+// CHECK-X64-NEXT:   17 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   17 |   char a
+// CHECK-X64-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct G : X, W, Y, V  { char a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    0 |   struct X (base)
-// CHECK:    0 |     (X vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    9 |   struct W (base) (empty)
-// CHECK:   12 |   struct Y (base)
-// CHECK:   12 |     (Y vbtable pointer)
-// CHECK:   16 |     char a
-// CHECK:   21 |   struct V (base) (empty)
-// CHECK:   21 |   char a
-// CHECK:   24 |   struct V (virtual base) (empty)
-// CHECK:      | [sizeof=24, align=4
-// CHECK:      |  nvsize=24, nvalign=4]
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    0 |   struct X (base)
+// CHECK-NEXT:    0 |     (X vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    9 |   struct W (base) (empty)
+// CHECK-NEXT:   12 |   struct Y (base)
+// CHECK-NEXT:   12 |     (Y vbtable pointer)
+// CHECK-NEXT:   16 |     char a
+// CHECK-NEXT:   21 |   struct V (base) (empty)
+// CHECK-NEXT:   21 |   char a
+// CHECK-NEXT:   24 |   struct V (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=24, align=4
+// CHECK-NEXT:      |  nvsize=24, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct G
-// CHECK-X64:    0 |   struct X (base)
-// CHECK-X64:    0 |     (X vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   17 |   struct W (base) (empty)
-// CHECK-X64:   24 |   struct Y (base)
-// CHECK-X64:   24 |     (Y vbtable pointer)
-// CHECK-X64:   32 |     char a
-// CHECK-X64:   41 |   struct V (base) (empty)
-// CHECK-X64:   41 |   char a
-// CHECK-X64:   48 |   struct V (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=8
-// CHECK-X64:      |  nvsize=48, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct G
+// CHECK-X64-NEXT:    0 |   struct X (base)
+// CHECK-X64-NEXT:    0 |     (X vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   17 |   struct W (base) (empty)
+// CHECK-X64-NEXT:   24 |   struct Y (base)
+// CHECK-X64-NEXT:   24 |     (Y vbtable pointer)
+// CHECK-X64-NEXT:   32 |     char a
+// CHECK-X64-NEXT:   41 |   struct V (base) (empty)
+// CHECK-X64-NEXT:   41 |   char a
+// CHECK-X64-NEXT:   48 |   struct V (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=8
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-empty-nonvirtual-bases.cpp b/test/Layout/ms-x86-empty-nonvirtual-bases.cpp
index 01d10c9994f6eba7596de414e0dfad449a88c265..dd1cbe739bdde9c85c4111163cb8ca805896e1d9 100644
--- a/test/Layout/ms-x86-empty-nonvirtual-bases.cpp
+++ b/test/Layout/ms-x86-empty-nonvirtual-bases.cpp
@@ -23,11 +23,12 @@ struct A : B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    0 |   int a
-// CHECK:      | [sizeof=8, align=8
-// CHECK:      |  nvsize=8, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    0 |   int a
+// CHECK-NEXT:      | [sizeof=8, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
 
 struct B : B0 {
 	B0 b0;
@@ -36,14 +37,14 @@ struct B : B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    0 |   struct B0 b0 (empty)
-// CHECK:      |   [sizeof=8, align=8
-// CHECK:      |    nvsize=0, nvalign=1]
-// CHECK:    8 |   int a
-// CHECK:      | [sizeof=16, align=8
-// CHECK:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    0 |   struct B0 b0 (empty)
+// CHECK-NEXT:      |   [sizeof=8, align=8
+// CHECK-NEXT:      |    nvsize=0, nvalign=8]
+// CHECK:         8 |   int a
+// CHECK-NEXT:      | [sizeof=16, align=8
+// CHECK-NEXT:      |  nvsize=16, nvalign=8]
 
 struct C : B0, B1, B2, B3, B4 {
 	int a;
@@ -51,15 +52,19 @@ struct C : B0, B1, B2, B3, B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    8 |   struct B1 (base) (empty)
-// CHECK:   16 |   struct B2 (base) (empty)
-// CHECK:   24 |   struct B3 (base) (empty)
-// CHECK:   32 |   struct B4 (base) (empty)
-// CHECK:   32 |   int a
-// CHECK:      | [sizeof=40, align=8
-// CHECK:      |  nvsize=40, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    8 |   struct B1 (base) (empty)
+// CHECK-NEXT:   16 |   struct B2 (base) (empty)
+// CHECK-NEXT:   24 |   struct B3 (base) (empty)
+// CHECK-NEXT:   32 |   struct B4 (base) (empty)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:      | [sizeof=40, align=8
+// CHECK-NEXT:      |  nvsize=40, nvalign=8]
 
 struct D {
 	B0 b0;
@@ -72,28 +77,31 @@ struct D {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct B0 b0 (empty)
-// CHECK:      |   [sizeof=8, align=8
-// CHECK:      |    nvsize=0, nvalign=1]
-// CHECK:    8 |   struct C0 c0
-// CHECK:    8 |     int a
-// CHECK:      |   [sizeof=4, align=4
-// CHECK:      |    nvsize=4, nvalign=4]
-// CHECK:   12 |   struct C1 c1
-// CHECK:   12 |     int a
-// CHECK:      |   [sizeof=4, align=4
-// CHECK:      |    nvsize=4, nvalign=4]
-// CHECK:   16 |   struct C2 c2
-// CHECK:   16 |     int a
-// CHECK:      |   [sizeof=4, align=4
-// CHECK:      |    nvsize=4, nvalign=4]
-// CHECK:   24 |   struct B1 b1 (empty)
-// CHECK:      |   [sizeof=8, align=8
-// CHECK:      |    nvsize=0, nvalign=1]
-// CHECK:   32 |   int a
-// CHECK:      | [sizeof=40, align=8
-// CHECK:      |  nvsize=40, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct B0 b0 (empty)
+// CHECK-NEXT:      |   [sizeof=8, align=8
+// CHECK-NEXT:      |    nvsize=0, nvalign=8]
+// CHECK:         8 |   struct C0 c0
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:      |   [sizeof=4, align=4
+// CHECK-NEXT:      |    nvsize=4, nvalign=4]
+// CHECK:        12 |   struct C1 c1
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:      |   [sizeof=4, align=4
+// CHECK-NEXT:      |    nvsize=4, nvalign=4]
+// CHECK:        16 |   struct C2 c2
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      |   [sizeof=4, align=4
+// CHECK-NEXT:      |    nvsize=4, nvalign=4]
+// CHECK:        24 |   struct B1 b1 (empty)
+// CHECK-NEXT:      |   [sizeof=8, align=8
+// CHECK-NEXT:      |    nvsize=0, nvalign=8]
+// CHECK:        32 |   int a
+// CHECK-NEXT:      | [sizeof=40, align=8
+// CHECK-NEXT:      |  nvsize=40, nvalign=8]
 
 struct E : B0, C0, C1, C2, B1 {
 	int a;
@@ -101,18 +109,18 @@ struct E : B0, C0, C1, C2, B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    0 |   struct C0 (base)
-// CHECK:    0 |     int a
-// CHECK:    4 |   struct C1 (base)
-// CHECK:    4 |     int a
-// CHECK:    8 |   struct C2 (base)
-// CHECK:    8 |     int a
-// CHECK:   16 |   struct B1 (base) (empty)
-// CHECK:   16 |   int a
-// CHECK:      | [sizeof=24, align=8
-// CHECK:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    0 |   struct C0 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    4 |   struct C1 (base)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   struct C2 (base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:      | [sizeof=24, align=8
+// CHECK-NEXT:      |  nvsize=24, nvalign=8]
 
 struct F : C0, B0, B1, C1 {
 	int a;
@@ -120,16 +128,16 @@ struct F : C0, B0, B1, C1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   struct C0 (base)
-// CHECK:    0 |     int a
-// CHECK:    8 |   struct B0 (base) (empty)
-// CHECK:   16 |   struct B1 (base) (empty)
-// CHECK:   16 |   struct C1 (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |   int a
-// CHECK:      | [sizeof=24, align=8
-// CHECK:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   struct C0 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    8 |   struct B0 (base) (empty)
+// CHECK-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-NEXT:   16 |   struct C1 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |   int a
+// CHECK-NEXT:      | [sizeof=24, align=8
+// CHECK-NEXT:      |  nvsize=24, nvalign=8]
 
 struct G : B0, B1, B2, B3, B4 {
 	__declspec(align(32)) int a;
@@ -137,15 +145,15 @@ struct G : B0, B1, B2, B3, B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    8 |   struct B1 (base) (empty)
-// CHECK:   16 |   struct B2 (base) (empty)
-// CHECK:   24 |   struct B3 (base) (empty)
-// CHECK:   32 |   struct B4 (base) (empty)
-// CHECK:   32 |   int a
-// CHECK:      | [sizeof=64, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    8 |   struct B1 (base) (empty)
+// CHECK-NEXT:   16 |   struct B2 (base) (empty)
+// CHECK-NEXT:   24 |   struct B3 (base) (empty)
+// CHECK-NEXT:   32 |   struct B4 (base) (empty)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:      | [sizeof=64, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
 
 struct __declspec(align(32)) H : B0, B1, B2, B3, B4 {
 	int a;
@@ -153,15 +161,15 @@ struct __declspec(align(32)) H : B0, B1, B2, B3, B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct H
-// CHECK:    0 |   struct B0 (base) (empty)
-// CHECK:    8 |   struct B1 (base) (empty)
-// CHECK:   16 |   struct B2 (base) (empty)
-// CHECK:   24 |   struct B3 (base) (empty)
-// CHECK:   32 |   struct B4 (base) (empty)
-// CHECK:   32 |   int a
-// CHECK:      | [sizeof=64, align=32
-// CHECK:      |  nvsize=40, nvalign=8]
+// CHECK-NEXT:    0 | struct H
+// CHECK-NEXT:    0 |   struct B0 (base) (empty)
+// CHECK-NEXT:    8 |   struct B1 (base) (empty)
+// CHECK-NEXT:   16 |   struct B2 (base) (empty)
+// CHECK-NEXT:   24 |   struct B3 (base) (empty)
+// CHECK-NEXT:   32 |   struct B4 (base) (empty)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:      | [sizeof=64, align=32
+// CHECK-NEXT:      |  nvsize=40, nvalign=32]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-empty-virtual-base.cpp b/test/Layout/ms-x86-empty-virtual-base.cpp
index 8377969aa9ba4f936d584da0790f51c0031ace20..e61cdf327bc948e76607470273dff580c36b33c3 100644
--- a/test/Layout/ms-x86-empty-virtual-base.cpp
+++ b/test/Layout/ms-x86-empty-virtual-base.cpp
@@ -27,19 +27,21 @@ struct A : virtual B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=8, align=8
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=8, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct B : virtual B0 {
 	B0 b0;
@@ -48,25 +50,25 @@ struct B : virtual B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   (B vbtable pointer)
-// CHECK:    8 |   struct B0 b0 (empty)
-// CHECK:      |   [sizeof=8, align=8
-// CHECK:      |    nvsize=0, nvalign=1]
-// CHECK:   16 |   int a
-// CHECK:   24 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=24, align=8
-// CHECK:      |  nvsize=24, nvalign=8]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   (B vbtable pointer)
-// CHECK-X64:    8 |   struct B0 b0 (empty)
-// CHECK-X64:      |   [sizeof=8, align=8
-// CHECK-X64:      |    nvsize=0, nvalign=1]
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   (B vbtable pointer)
+// CHECK-NEXT:    8 |   struct B0 b0 (empty)
+// CHECK-NEXT:      |   [sizeof=8, align=8
+// CHECK-NEXT:      |    nvsize=0, nvalign=8]
+// CHECK:        16 |   int a
+// CHECK-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=24, align=8
+// CHECK-NEXT:      |  nvsize=24, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 b0 (empty)
+// CHECK-X64-NEXT:      |   [sizeof=8, align=8
+// CHECK-X64-NEXT:      |    nvsize=0, nvalign=8]
+// CHECK-X64:        16 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
 	int a;
@@ -74,27 +76,35 @@ struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:   16 |   struct B1 (virtual base) (empty)
-// CHECK:   24 |   struct B2 (virtual base) (empty)
-// CHECK:   32 |   struct B3 (virtual base) (empty)
-// CHECK:   40 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=40, align=8
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   24 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   32 |   struct B2 (virtual base) (empty)
-// CHECK-X64:   40 |   struct B3 (virtual base) (empty)
-// CHECK-X64:   48 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   16 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   24 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:   32 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:   40 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=40, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   24 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   32 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:   48 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct D {
 	B0 b0;
@@ -107,31 +117,37 @@ struct D {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct B0 b0 (empty)
-// CHECK:    8 |   struct C0 c0
-// CHECK:    8 |     int a
-// CHECK:   12 |   struct C1 c1
-// CHECK:   12 |     int a
-// CHECK:   16 |   struct C2 c2
-// CHECK:   16 |     int a
-// CHECK:   24 |   struct B1 b1 (empty)
-// CHECK:   32 |   int a
-// CHECK:      | [sizeof=40, align=8
-// CHECK:      |  nvsize=40, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct B0 b0 (empty)
+// CHECK:         8 |   struct C0 c0
+// CHECK-NEXT:    8 |     int a
+// CHECK:        12 |   struct C1 c1
+// CHECK-NEXT:   12 |     int a
+// CHECK:        16 |   struct C2 c2
+// CHECK-NEXT:   16 |     int a
+// CHECK:        24 |   struct B1 b1 (empty)
+// CHECK:        32 |   int a
+// CHECK-NEXT:      | [sizeof=40, align=8
+// CHECK-NEXT:      |  nvsize=40, nvalign=8]
+// CHECK-64: *** Dumping AST Record Layout
+// CHECK-64: *** Dumping AST Record Layout
+// CHECK-64: *** Dumping AST Record Layout
 // CHECK-64: *** Dumping AST Record Layout
-// CHECK-64:    0 | struct D
-// CHECK-64:    0 |   struct B0 b0 (empty)
-// CHECK-64:    8 |   struct C0 c0
-// CHECK-64:    8 |     int a
-// CHECK-64:   12 |   struct C1 c1
-// CHECK-64:   12 |     int a
-// CHECK-64:   16 |   struct C2 c2
-// CHECK-64:   16 |     int a
-// CHECK-64:   24 |   struct B1 b1 (empty)
-// CHECK-64:   32 |   int a
-// CHECK-64:      | [sizeof=40, align=8
-// CHECK-64:      |  nvsize=40, nvalign=8]
+// CHECK-64-NEXT:    0 | struct D
+// CHECK-64-NEXT:    0 |   struct B0 b0 (empty)
+// CHECK-64:         8 |   struct C0 c0
+// CHECK-64-NEXT:    8 |     int a
+// CHECK-64:        12 |   struct C1 c1
+// CHECK-64-NEXT:   12 |     int a
+// CHECK-64:        16 |   struct C2 c2
+// CHECK-64-NEXT:   16 |     int a
+// CHECK-64:        24 |   struct B1 b1 (empty)
+// CHECK-64:        32 |   int a
+// CHECK-64-NEXT:      | [sizeof=40, align=8
+// CHECK-64-NEXT:      |  nvsize=40, nvalign=8]
 
 struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
 	int a;
@@ -139,33 +155,37 @@ struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   (E vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:    8 |   struct C0 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:   12 |   struct C1 (virtual base)
-// CHECK:   12 |     int a
-// CHECK:   16 |   struct C2 (virtual base)
-// CHECK:   16 |     int a
-// CHECK:   24 |   struct B1 (virtual base) (empty)
-// CHECK:      | [sizeof=24, align=8
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   (E vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   16 |   struct C0 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   20 |   struct C1 (virtual base)
-// CHECK-X64:   20 |     int a
-// CHECK-X64:   24 |   struct C2 (virtual base)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   32 |   struct B1 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=32, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   (E vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:    8 |   struct C0 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   12 |   struct C1 (virtual base)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:   16 |   struct C2 (virtual base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=24, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   20 |   struct C1 (virtual base)
+// CHECK-X64-NEXT:   20 |     int a
+// CHECK-X64-NEXT:   24 |   struct C2 (virtual base)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=32, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
 	int a;
@@ -173,29 +193,29 @@ struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   (F vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct C0 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:   24 |   struct B1 (virtual base) (empty)
-// CHECK:   24 |   struct C1 (virtual base)
-// CHECK:   24 |     int a
-// CHECK:      | [sizeof=32, align=8
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   (F vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct C0 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   32 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   32 |   struct C1 (virtual base)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   (F vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct C0 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   24 |   struct C1 (virtual base)
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:      | [sizeof=32, align=8
+// CHECK-NEXT:      |  nvsize=8, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   (F vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   32 |   struct C1 (virtual base)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
 	int a;
@@ -204,33 +224,35 @@ struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    0 |   struct D0 (primary base)
-// CHECK:    0 |     (D0 vftable pointer)
-// CHECK:    4 |   (G vbtable pointer)
-// CHECK:   20 |   int a
-// CHECK:   32 |   struct C0 (virtual base)
-// CHECK:   32 |     int a
-// CHECK:   40 |   struct B0 (virtual base) (empty)
-// CHECK:   56 |   struct B1 (virtual base) (empty)
-// CHECK:   56 |   struct C1 (virtual base)
-// CHECK:   56 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct G
-// CHECK-X64:    0 |   struct D0 (primary base)
-// CHECK-X64:    0 |     (D0 vftable pointer)
-// CHECK-X64:    8 |   (G vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   32 |   struct C0 (virtual base)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:   40 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   56 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   56 |   struct C1 (virtual base)
-// CHECK-X64:   56 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    0 |   struct D0 (primary base)
+// CHECK-NEXT:    0 |     (D0 vftable pointer)
+// CHECK-NEXT:    4 |   (G vbtable pointer)
+// CHECK-NEXT:   20 |   int a
+// CHECK-NEXT:   32 |   struct C0 (virtual base)
+// CHECK-NEXT:   32 |     int a
+// CHECK-NEXT:   40 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   56 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   56 |   struct C1 (virtual base)
+// CHECK-NEXT:   56 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct G
+// CHECK-X64-NEXT:    0 |   struct D0 (primary base)
+// CHECK-X64-NEXT:    0 |     (D0 vftable pointer)
+// CHECK-X64-NEXT:    8 |   (G vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   32 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:   40 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   56 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   56 |   struct C1 (virtual base)
+// CHECK-X64-NEXT:   56 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
 	int a;
@@ -239,35 +261,35 @@ struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct H
-// CHECK:    0 |   (H vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct C0 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:   24 |   struct B1 (virtual base) (empty)
-// CHECK:   44 |   (vtordisp for vbase D0)
-// CHECK:   48 |   struct D0 (virtual base)
-// CHECK:   48 |     (D0 vftable pointer)
-// CHECK:   52 |   struct C1 (virtual base)
-// CHECK:   52 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct H
-// CHECK-X64:    0 |   (H vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct C0 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   40 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   60 |   (vtordisp for vbase D0)
-// CHECK-X64:   64 |   struct D0 (virtual base)
-// CHECK-X64:   64 |     (D0 vftable pointer)
-// CHECK-X64:   72 |   struct C1 (virtual base)
-// CHECK-X64:   72 |     int a
-// CHECK-X64:      | [sizeof=80, align=16
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct H
+// CHECK-NEXT:    0 |   (H vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct C0 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   44 |   (vtordisp for vbase D0)
+// CHECK-NEXT:   48 |   struct D0 (virtual base)
+// CHECK-NEXT:   48 |     (D0 vftable pointer)
+// CHECK-NEXT:   52 |   struct C1 (virtual base)
+// CHECK-NEXT:   52 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=8, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct H
+// CHECK-X64-NEXT:    0 |   (H vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   60 |   (vtordisp for vbase D0)
+// CHECK-X64-NEXT:   64 |   struct D0 (virtual base)
+// CHECK-X64-NEXT:   64 |     (D0 vftable pointer)
+// CHECK-X64-NEXT:   72 |   struct C1 (virtual base)
+// CHECK-X64-NEXT:   72 |     int a
+// CHECK-X64-NEXT:      | [sizeof=80, align=16
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
 
 struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -275,27 +297,27 @@ struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct I
-// CHECK:    0 |   (I vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B0 (virtual base) (empty)
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct I
-// CHECK-X64:    0 |   (I vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct I
+// CHECK-NEXT:    0 |   (I vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct I
+// CHECK-X64-NEXT:    0 |   (I vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
 	int a;
@@ -303,27 +325,27 @@ struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3,
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct J
-// CHECK:    0 |   (J vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:   40 |   struct B1 (virtual base) (empty)
-// CHECK:   72 |   struct B2 (virtual base) (empty)
-// CHECK:  104 |   struct B3 (virtual base) (empty)
-// CHECK:  136 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=160, align=32
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct J
-// CHECK-X64:    0 |   (J vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   40 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=160, align=32
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct J
+// CHECK-NEXT:    0 |   (J vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=160, align=32
+// CHECK-NEXT:      |  nvsize=8, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct J
+// CHECK-X64-NEXT:    0 |   (J vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=160, align=32
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
 
 struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -331,27 +353,29 @@ struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct K
-// CHECK:    0 |   (K vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct D1 (virtual base) (empty)
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct K
-// CHECK-X64:    0 |   (K vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct D1 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct K
+// CHECK-NEXT:    0 |   (K vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct K
+// CHECK-X64-NEXT:    0 |   (K vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -359,27 +383,27 @@ struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct L
-// CHECK:    0 |   (L vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B1 (virtual base) (empty)
-// CHECK:   68 |   struct D1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct L
-// CHECK-X64:    0 |   (L vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   68 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct L
+// CHECK-NEXT:    0 |   (L vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct L
+// CHECK-X64-NEXT:    0 |   (L vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -387,27 +411,27 @@ struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct M
-// CHECK:    0 |   (M vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B1 (virtual base) (empty)
-// CHECK:   72 |   struct B2 (virtual base) (empty)
-// CHECK:  100 |   struct D1 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct M
-// CHECK-X64:    0 |   (M vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  100 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct M
+// CHECK-NEXT:    0 |   (M vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct M
+// CHECK-X64-NEXT:    0 |   (M vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -415,31 +439,31 @@ struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct N
-// CHECK:    0 |   (N vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct C0 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:  100 |   struct D1 (virtual base) (empty)
-// CHECK:  136 |   struct B2 (virtual base) (empty)
-// CHECK:  168 |   struct B3 (virtual base) (empty)
-// CHECK:  200 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=224, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct N
-// CHECK-X64:    0 |   (N vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct C0 (virtual base)
-// CHECK-X64:   64 |     int a
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:  100 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  200 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=224, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct N
+// CHECK-NEXT:    0 |   (N vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=224, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct N
+// CHECK-X64-NEXT:    0 |   (N vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   64 |     int a
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=224, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -447,31 +471,31 @@ struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct O
-// CHECK:    0 |   (O vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct C0 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  132 |   struct D1 (virtual base) (empty)
-// CHECK:  168 |   struct B3 (virtual base) (empty)
-// CHECK:  200 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=224, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct O
-// CHECK-X64:    0 |   (O vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct C0 (virtual base)
-// CHECK-X64:   64 |     int a
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  132 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  200 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=224, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct O
+// CHECK-NEXT:    0 |   (O vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  132 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=224, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct O
+// CHECK-X64-NEXT:    0 |   (O vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   64 |     int a
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  132 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=224, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -479,31 +503,31 @@ struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct P
-// CHECK:    0 |   (P vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B1 (virtual base) (empty)
-// CHECK:   64 |   struct C0 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:   68 |   struct D1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct P
-// CHECK-X64:    0 |   (P vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   64 |   struct C0 (virtual base)
-// CHECK-X64:   64 |     int a
-// CHECK-X64:   68 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct P
+// CHECK-NEXT:    0 |   (P vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct P
+// CHECK-X64-NEXT:    0 |   (P vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   64 |     int a
+// CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -511,31 +535,31 @@ struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct Q
-// CHECK:    0 |   (Q vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B1 (virtual base) (empty)
-// CHECK:   64 |   struct C0 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:   72 |   struct B2 (virtual base) (empty)
-// CHECK:  100 |   struct D1 (virtual base) (empty)
-// CHECK:  136 |   struct B3 (virtual base) (empty)
-// CHECK:  168 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=192, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct Q
-// CHECK-X64:    0 |   (Q vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   64 |   struct C0 (virtual base)
-// CHECK-X64:   64 |     int a
-// CHECK-X64:   72 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  100 |   struct D1 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  168 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=192, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct Q
+// CHECK-NEXT:    0 |   (Q vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=192, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct Q
+// CHECK-X64-NEXT:    0 |   (Q vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   64 |     int a
+// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=192, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -543,31 +567,31 @@ struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct R
-// CHECK:    0 |   (R vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B0 (virtual base) (empty)
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:  104 |   struct B2 (virtual base) (empty)
-// CHECK:  104 |   struct C0 (virtual base)
-// CHECK:  104 |     int a
-// CHECK:  112 |   struct B3 (virtual base) (empty)
-// CHECK:  136 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=160, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct R
-// CHECK-X64:    0 |   (R vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  104 |   struct C0 (virtual base)
-// CHECK-X64:  104 |     int a
-// CHECK-X64:  112 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=160, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct R
+// CHECK-NEXT:    0 |   (R vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct C0 (virtual base)
+// CHECK-NEXT:  104 |     int a
+// CHECK-NEXT:  112 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=160, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct R
+// CHECK-X64-NEXT:    0 |   (R vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:  104 |     int a
+// CHECK-X64-NEXT:  112 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=160, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(32)) int a;
@@ -575,31 +599,31 @@ struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct S
-// CHECK:    0 |   (S vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   64 |   struct B0 (virtual base) (empty)
-// CHECK:   72 |   struct B1 (virtual base) (empty)
-// CHECK:   72 |   struct C0 (virtual base)
-// CHECK:   72 |     int a
-// CHECK:   80 |   struct B2 (virtual base) (empty)
-// CHECK:  104 |   struct B3 (virtual base) (empty)
-// CHECK:  136 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=160, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct S
-// CHECK-X64:    0 |   (S vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   64 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   72 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   72 |   struct C0 (virtual base)
-// CHECK-X64:   72 |     int a
-// CHECK-X64:   80 |   struct B2 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  136 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=160, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-NEXT:    0 | struct S
+// CHECK-NEXT:    0 |   (S vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   72 |   struct C0 (virtual base)
+// CHECK-NEXT:   72 |     int a
+// CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=160, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct S
+// CHECK-X64-NEXT:    0 |   (S vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   72 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   72 |     int a
+// CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=160, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
 	__declspec(align(16)) int a;
@@ -607,35 +631,37 @@ struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct T
-// CHECK:    0 |   (T vbtable pointer)
-// CHECK:   16 |   int a
-// CHECK:   32 |   struct B0 (virtual base) (empty)
-// CHECK:   40 |   struct B1 (virtual base) (empty)
-// CHECK:   40 |   struct C0 (virtual base)
-// CHECK:   40 |     int a
-// CHECK:   44 |   struct D2 (virtual base)
-// CHECK:   44 |     int [8] a
-// CHECK:   80 |   struct B2 (virtual base) (empty)
-// CHECK:   88 |   struct B3 (virtual base) (empty)
-// CHECK:  104 |   struct B4 (virtual base) (empty)
-// CHECK:      | [sizeof=112, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct T
-// CHECK-X64:    0 |   (T vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   32 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   40 |   struct B1 (virtual base) (empty)
-// CHECK-X64:   40 |   struct C0 (virtual base)
-// CHECK-X64:   40 |     int a
-// CHECK-X64:   44 |   struct D2 (virtual base)
-// CHECK-X64:   44 |     int [8] a
-// CHECK-X64:   80 |   struct B2 (virtual base) (empty)
-// CHECK-X64:   88 |   struct B3 (virtual base) (empty)
-// CHECK-X64:  104 |   struct B4 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=112, align=16
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct T
+// CHECK-NEXT:    0 |   (T vbtable pointer)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   32 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:   40 |   struct C0 (virtual base)
+// CHECK-NEXT:   40 |     int a
+// CHECK-NEXT:   44 |   struct D2 (virtual base)
+// CHECK-NEXT:   44 |     int [8] a
+// CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
+// CHECK-NEXT:   88 |   struct B3 (virtual base) (empty)
+// CHECK-NEXT:  104 |   struct B4 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=112, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct T
+// CHECK-X64-NEXT:    0 |   (T vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   32 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct C0 (virtual base)
+// CHECK-X64-NEXT:   40 |     int a
+// CHECK-X64-NEXT:   44 |   struct D2 (virtual base)
+// CHECK-X64-NEXT:   44 |     int [8] a
+// CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
+// CHECK-X64-NEXT:   88 |   struct B3 (virtual base) (empty)
+// CHECK-X64-NEXT:  104 |   struct B4 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=112, align=16
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct __declspec(align(32)) U : virtual B0, virtual B1 {
 	int a;
@@ -643,21 +669,21 @@ struct __declspec(align(32)) U : virtual B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct U
-// CHECK:    0 |   (U vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:   40 |   struct B1 (virtual base) (empty)
-// CHECK:      | [sizeof=64, align=32
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct U
+// CHECK-NEXT:    0 |   (U vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=64, align=32
+// CHECK-NEXT:      |  nvsize=8, nvalign=32]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct U
-// CHECK-X64:    0 |   (U vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:   40 |   struct B1 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=64, align=32
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct U
+// CHECK-X64-NEXT:    0 |   (U vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=64, align=32
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
 
 struct __declspec(align(32)) V : virtual D1 {
 	int a;
@@ -665,44 +691,48 @@ struct __declspec(align(32)) V : virtual D1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct V
-// CHECK:    0 |   (V vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct D1 (virtual base) (empty)
-// CHECK:      | [sizeof=32, align=32
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct V
+// CHECK-NEXT:    0 |   (V vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct D1 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=32, align=32
+// CHECK-NEXT:      |  nvsize=8, nvalign=32]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct V
-// CHECK-X64:    0 |   (V vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct D1 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=32, align=32
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct V
+// CHECK-X64-NEXT:    0 |   (V vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct D1 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=32, align=32
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
 
 struct T0 {};
 struct T1 : T0 { char a; };
 struct T3 : virtual T1, virtual T0 { long long a; };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct T3
-// CHECK:    0 |   (T3 vbtable pointer)
-// CHECK:    8 |   long long a
-// CHECK:   16 |   struct T1 (virtual base)
-// CHECK:   16 |     struct T0 (base) (empty)
-// CHECK:   16 |     char a
-// CHECK:   24 |   struct T0 (virtual base) (empty)
-// CHECK:      | [sizeof=24, align=8
-// CHECK:      |  nvsize=16, nvalign=8]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct T3
-// CHECK-X64:    0 |   (T3 vbtable pointer)
-// CHECK-X64:    8 |   long long a
-// CHECK-X64:   16 |   struct T1 (virtual base)
-// CHECK-X64:   16 |     struct T0 (base) (empty)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:   24 |   struct T0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct T3
+// CHECK-NEXT:    0 |   (T3 vbtable pointer)
+// CHECK-NEXT:    8 |   long long a
+// CHECK-NEXT:   16 |   struct T1 (virtual base)
+// CHECK-NEXT:   16 |     struct T0 (base) (empty)
+// CHECK-NEXT:   16 |     char a
+// CHECK-NEXT:   24 |   struct T0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=24, align=8
+// CHECK-NEXT:      |  nvsize=16, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct T3
+// CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
+// CHECK-X64-NEXT:    8 |   long long a
+// CHECK-X64-NEXT:   16 |   struct T1 (virtual base)
+// CHECK-X64-NEXT:   16 |     struct T0 (base) (empty)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:   24 |   struct T0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp b/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp
index 10d6f8bee6d1acb87ca392d0421a98eb8f1bf211..8cada5104bf1944635f48d8303733583af0be894 100644
--- a/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp
+++ b/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp
@@ -24,687 +24,721 @@ struct __declspec(align(2)) B3X { B3X() { printf("B3 = %p\n", this); } };
 struct B4X { B4X() { printf("B4 = %p\n", this); } };
 struct B5X { B5X() { printf("B5 = %p\n", this); } };
 struct B6X { B6X() { printf("B6 = %p\n", this); } };
-struct B8X { short a; B8X() : a(0xf00000B8) { printf("B8 = %p\n", this); } };
+struct B8X { short a; B8X() : a(0x000000B8) { printf("B8 = %p\n", this); } };
 
 struct AA : B8, B1, virtual B0 {
 	int a;
-	AA() : a(0xf00000AA) { printf("AA = %p\n", this); }
+	AA() : a(0x000000AA) { printf("AA = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AA
-// CHECK:    0 |   struct B8 (base)
-// CHECK:    0 |     char [5] c
-// CHECK:   13 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AA vbtable pointer)
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AA
-// CHECK-X64:    0 |   struct B8 (base)
-// CHECK-X64:    0 |     char [5] c
-// CHECK-X64:   17 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AA vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AA
+// CHECK-NEXT:    0 |   struct B8 (base)
+// CHECK-NEXT:    0 |     char [5] c
+// CHECK-NEXT:   13 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AA vbtable pointer)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AA
+// CHECK-X64-NEXT:    0 |   struct B8 (base)
+// CHECK-X64-NEXT:    0 |     char [5] c
+// CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AA vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AB : B8, B1, virtual B0 {
 	short a;
-	AB() : a(0xf00000AB) { printf("AB = %p\n", this); }
+	AB() : a(0x000000AB) { printf("AB = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AB
-// CHECK:    0 |   struct B8 (base)
-// CHECK:    0 |     char [5] c
-// CHECK:   13 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AB vbtable pointer)
-// CHECK:   14 |   short a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AB
-// CHECK-X64:    0 |   struct B8 (base)
-// CHECK-X64:    0 |     char [5] c
-// CHECK-X64:   17 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AB vbtable pointer)
-// CHECK-X64:   18 |   short a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AB
+// CHECK-NEXT:    0 |   struct B8 (base)
+// CHECK-NEXT:    0 |     char [5] c
+// CHECK-NEXT:   13 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AB vbtable pointer)
+// CHECK-NEXT:   14 |   short a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AB
+// CHECK-X64-NEXT:    0 |   struct B8 (base)
+// CHECK-X64-NEXT:    0 |     char [5] c
+// CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AB vbtable pointer)
+// CHECK-X64-NEXT:   18 |   short a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AC : B8, B1, virtual B0 {
 	char a;
-	AC() : a(0xf00000AC) { printf("AC = %p\n", this); }
+	AC() : a(0x000000AC) { printf("AC = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AC
-// CHECK:    0 |   struct B8 (base)
-// CHECK:    0 |     char [5] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AC vbtable pointer)
-// CHECK:   12 |   char a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AC
-// CHECK-X64:    0 |   struct B8 (base)
-// CHECK-X64:    0 |     char [5] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AC vbtable pointer)
-// CHECK-X64:   16 |   char a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AC
+// CHECK-NEXT:    0 |   struct B8 (base)
+// CHECK-NEXT:    0 |     char [5] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AC vbtable pointer)
+// CHECK-NEXT:   12 |   char a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AC
+// CHECK-X64-NEXT:    0 |   struct B8 (base)
+// CHECK-X64-NEXT:    0 |     char [5] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AC vbtable pointer)
+// CHECK-X64-NEXT:   16 |   char a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AD : B8, B1, virtual B0 {
 	AD() { printf("AD = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AD
-// CHECK:    0 |   struct B8 (base)
-// CHECK:    0 |     char [5] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AD vbtable pointer)
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AD
-// CHECK-X64:    0 |   struct B8 (base)
-// CHECK-X64:    0 |     char [5] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AD vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct AD
+// CHECK-NEXT:    0 |   struct B8 (base)
+// CHECK-NEXT:    0 |     char [5] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AD vbtable pointer)
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AD
+// CHECK-X64-NEXT:    0 |   struct B8 (base)
+// CHECK-X64-NEXT:    0 |     char [5] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AD vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct AA1 : B9, B1, virtual B0 {
 	int a;
-	AA1() : a(0xf0000AA1) { printf("AA1 = %p\n", this); }
+	AA1() : a(0x00000AA1) { printf("AA1 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AA1
-// CHECK:    0 |   struct B9 (base)
-// CHECK:    0 |     char [6] c
-// CHECK:   14 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AA1 vbtable pointer)
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AA1
-// CHECK-X64:    0 |   struct B9 (base)
-// CHECK-X64:    0 |     char [6] c
-// CHECK-X64:   18 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AA1 vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AA1
+// CHECK-NEXT:    0 |   struct B9 (base)
+// CHECK-NEXT:    0 |     char [6] c
+// CHECK-NEXT:   14 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AA1 vbtable pointer)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AA1
+// CHECK-X64-NEXT:    0 |   struct B9 (base)
+// CHECK-X64-NEXT:    0 |     char [6] c
+// CHECK-X64-NEXT:   18 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AA1 vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AB1 : B9, B1, virtual B0 {
 	short a;
-	AB1() : a(0xf0000AB1) { printf("AB1 = %p\n", this); }
+	AB1() : a(0x00000AB1) { printf("AB1 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AB1
-// CHECK:    0 |   struct B9 (base)
-// CHECK:    0 |     char [6] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AB1 vbtable pointer)
-// CHECK:   12 |   short a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AB1
-// CHECK-X64:    0 |   struct B9 (base)
-// CHECK-X64:    0 |     char [6] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AB1 vbtable pointer)
-// CHECK-X64:   16 |   short a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AB1
+// CHECK-NEXT:    0 |   struct B9 (base)
+// CHECK-NEXT:    0 |     char [6] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AB1 vbtable pointer)
+// CHECK-NEXT:   12 |   short a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AB1
+// CHECK-X64-NEXT:    0 |   struct B9 (base)
+// CHECK-X64-NEXT:    0 |     char [6] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AB1 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   short a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AC1 : B9, B1, virtual B0 {
 	char a;
-	AC1() : a(0xf0000AC1) { printf("AC1 = %p\n", this); }
+	AC1() : a(0x000000C1) { printf("AC1 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AC1
-// CHECK:    0 |   struct B9 (base)
-// CHECK:    0 |     char [6] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AC1 vbtable pointer)
-// CHECK:   12 |   char a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AC1
-// CHECK-X64:    0 |   struct B9 (base)
-// CHECK-X64:    0 |     char [6] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AC1 vbtable pointer)
-// CHECK-X64:   16 |   char a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AC1
+// CHECK-NEXT:    0 |   struct B9 (base)
+// CHECK-NEXT:    0 |     char [6] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AC1 vbtable pointer)
+// CHECK-NEXT:   12 |   char a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AC1
+// CHECK-X64-NEXT:    0 |   struct B9 (base)
+// CHECK-X64-NEXT:    0 |     char [6] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AC1 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   char a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AD1 : B9, B1, virtual B0 {
 	AD1() { printf("AD1 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AD1
-// CHECK:    0 |   struct B9 (base)
-// CHECK:    0 |     char [6] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AD1 vbtable pointer)
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AD1
-// CHECK-X64:    0 |   struct B9 (base)
-// CHECK-X64:    0 |     char [6] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AD1 vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct AD1
+// CHECK-NEXT:    0 |   struct B9 (base)
+// CHECK-NEXT:    0 |     char [6] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AD1 vbtable pointer)
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AD1
+// CHECK-X64-NEXT:    0 |   struct B9 (base)
+// CHECK-X64-NEXT:    0 |     char [6] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AD1 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct AA2 : B10, B1, virtual B0 {
 	int a;
-	AA2() : a(0xf0000AA2) { printf("AA2 = %p\n", this); }
+	AA2() : a(0x00000AA2) { printf("AA2 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AA2
-// CHECK:    0 |   struct B10 (base)
-// CHECK:    0 |     char [7] c
-// CHECK:   15 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AA2 vbtable pointer)
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AA2
-// CHECK-X64:    0 |   struct B10 (base)
-// CHECK-X64:    0 |     char [7] c
-// CHECK-X64:   19 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AA2 vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AA2
+// CHECK-NEXT:    0 |   struct B10 (base)
+// CHECK-NEXT:    0 |     char [7] c
+// CHECK-NEXT:   15 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AA2 vbtable pointer)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AA2
+// CHECK-X64-NEXT:    0 |   struct B10 (base)
+// CHECK-X64-NEXT:    0 |     char [7] c
+// CHECK-X64-NEXT:   19 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AA2 vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AB2 : B10, B1, virtual B0 {
 	short a;
-	AB2() : a(0xf0000AB2) { printf("AB2 = %p\n", this); }
+	AB2() : a(0x00000AB2) { printf("AB2 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AB2
-// CHECK:    0 |   struct B10 (base)
-// CHECK:    0 |     char [7] c
-// CHECK:   13 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AB2 vbtable pointer)
-// CHECK:   14 |   short a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AB2
-// CHECK-X64:    0 |   struct B10 (base)
-// CHECK-X64:    0 |     char [7] c
-// CHECK-X64:   17 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AB2 vbtable pointer)
-// CHECK-X64:   18 |   short a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AB2
+// CHECK-NEXT:    0 |   struct B10 (base)
+// CHECK-NEXT:    0 |     char [7] c
+// CHECK-NEXT:   13 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AB2 vbtable pointer)
+// CHECK-NEXT:   14 |   short a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AB2
+// CHECK-X64-NEXT:    0 |   struct B10 (base)
+// CHECK-X64-NEXT:    0 |     char [7] c
+// CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AB2 vbtable pointer)
+// CHECK-X64-NEXT:   18 |   short a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AC2 : B10, B1, virtual B0 {
 	char a;
-	AC2() : a(0xf0000AC2) { printf("AC2 = %p\n", this); }
+	AC2() : a(0x000000C2) { printf("AC2 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AC2
-// CHECK:    0 |   struct B10 (base)
-// CHECK:    0 |     char [7] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AC2 vbtable pointer)
-// CHECK:   12 |   char a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AC2
-// CHECK-X64:    0 |   struct B10 (base)
-// CHECK-X64:    0 |     char [7] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AC2 vbtable pointer)
-// CHECK-X64:   16 |   char a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AC2
+// CHECK-NEXT:    0 |   struct B10 (base)
+// CHECK-NEXT:    0 |     char [7] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AC2 vbtable pointer)
+// CHECK-NEXT:   12 |   char a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AC2
+// CHECK-X64-NEXT:    0 |   struct B10 (base)
+// CHECK-X64-NEXT:    0 |     char [7] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AC2 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   char a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AD2 : B10, B1, virtual B0 {
 	AD2() { printf("AD2 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AD2
-// CHECK:    0 |   struct B10 (base)
-// CHECK:    0 |     char [7] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AD2 vbtable pointer)
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AD2
-// CHECK-X64:    0 |   struct B10 (base)
-// CHECK-X64:    0 |     char [7] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AD2 vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct AD2
+// CHECK-NEXT:    0 |   struct B10 (base)
+// CHECK-NEXT:    0 |     char [7] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AD2 vbtable pointer)
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AD2
+// CHECK-X64-NEXT:    0 |   struct B10 (base)
+// CHECK-X64-NEXT:    0 |     char [7] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AD2 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct AA3 : B11, B1, virtual B0 {
 	int a;
-	AA3() : a(0xf0000AA3) { printf("AA3 = %p\n", this); }
+	AA3() : a(0x00000AA3) { printf("AA3 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AA3
-// CHECK:    0 |   struct B11 (base)
-// CHECK:    0 |     char [8] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AA3 vbtable pointer)
-// CHECK:   12 |   int a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AA3
-// CHECK-X64:    0 |   struct B11 (base)
-// CHECK-X64:    0 |     char [8] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AA3 vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AA3
+// CHECK-NEXT:    0 |   struct B11 (base)
+// CHECK-NEXT:    0 |     char [8] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AA3 vbtable pointer)
+// CHECK-NEXT:   12 |   int a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AA3
+// CHECK-X64-NEXT:    0 |   struct B11 (base)
+// CHECK-X64-NEXT:    0 |     char [8] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AA3 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AB3 : B11, B1, virtual B0 {
 	short a;
-	AB3() : a(0xf0000AB3) { printf("AB3 = %p\n", this); }
+	AB3() : a(0x00000AB3) { printf("AB3 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AB3
-// CHECK:    0 |   struct B11 (base)
-// CHECK:    0 |     char [8] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AB3 vbtable pointer)
-// CHECK:   12 |   short a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AB3
-// CHECK-X64:    0 |   struct B11 (base)
-// CHECK-X64:    0 |     char [8] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AB3 vbtable pointer)
-// CHECK-X64:   16 |   short a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AB3
+// CHECK-NEXT:    0 |   struct B11 (base)
+// CHECK-NEXT:    0 |     char [8] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AB3 vbtable pointer)
+// CHECK-NEXT:   12 |   short a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AB3
+// CHECK-X64-NEXT:    0 |   struct B11 (base)
+// CHECK-X64-NEXT:    0 |     char [8] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AB3 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   short a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AC3 : B11, B1, virtual B0 {
 	char a;
-	AC3() : a(0xf0000AC3) { printf("AC3 = %p\n", this); }
+	AC3() : a(0x000000C3) { printf("AC3 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AC3
-// CHECK:    0 |   struct B11 (base)
-// CHECK:    0 |     char [8] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AC3 vbtable pointer)
-// CHECK:   12 |   char a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AC3
-// CHECK-X64:    0 |   struct B11 (base)
-// CHECK-X64:    0 |     char [8] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AC3 vbtable pointer)
-// CHECK-X64:   16 |   char a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct AC3
+// CHECK-NEXT:    0 |   struct B11 (base)
+// CHECK-NEXT:    0 |     char [8] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AC3 vbtable pointer)
+// CHECK-NEXT:   12 |   char a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AC3
+// CHECK-X64-NEXT:    0 |   struct B11 (base)
+// CHECK-X64-NEXT:    0 |     char [8] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AC3 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   char a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct AD3 : B11, B1, virtual B0 {
 	AD3() { printf("AD3 = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AD3
-// CHECK:    0 |   struct B11 (base)
-// CHECK:    0 |     char [8] c
-// CHECK:   12 |   struct B1 (base) (empty)
-// CHECK:    8 |   (AD3 vbtable pointer)
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AD3
-// CHECK-X64:    0 |   struct B11 (base)
-// CHECK-X64:    0 |     char [8] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (AD3 vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-NEXT:    0 | struct AD3
+// CHECK-NEXT:    0 |   struct B11 (base)
+// CHECK-NEXT:    0 |     char [8] c
+// CHECK-NEXT:   12 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (AD3 vbtable pointer)
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AD3
+// CHECK-X64-NEXT:    0 |   struct B11 (base)
+// CHECK-X64-NEXT:    0 |     char [8] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (AD3 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct B : B1, B2, virtual B0 {
 	B() { printf("B = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct B1 (base) (empty)
-// CHECK:    8 |   struct B2 (base) (empty)
-// CHECK:    4 |   (B vbtable pointer)
-// CHECK:    8 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   struct B2 (base) (empty)
+// CHECK-NEXT:    4 |   (B vbtable pointer)
+// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   struct B1 (base) (empty)
-// CHECK-X64:   16 |   struct B2 (base) (empty)
-// CHECK-X64:    8 |   (B vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:   16 |   struct B2 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (B vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct C : B1, B2, B3, virtual B0 {
 	char a;
-	C() : a(0xf000000C) { printf("C = %p\n", this); }
+	C() : a(0x0000000C) { printf("C = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   struct B1 (base) (empty)
-// CHECK:    1 |   struct B2 (base) (empty)
-// CHECK:    8 |   struct B3 (base) (empty)
-// CHECK:    4 |   (C vbtable pointer)
-// CHECK:    8 |   char a
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   struct B1 (base) (empty)
-// CHECK-X64:    1 |   struct B2 (base) (empty)
-// CHECK-X64:   16 |   struct B3 (base) (empty)
-// CHECK-X64:    8 |   (C vbtable pointer)
-// CHECK-X64:   16 |   char a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-NEXT:    1 |   struct B2 (base) (empty)
+// CHECK-NEXT:    8 |   struct B3 (base) (empty)
+// CHECK-NEXT:    4 |   (C vbtable pointer)
+// CHECK-NEXT:    8 |   char a
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    1 |   struct B2 (base) (empty)
+// CHECK-X64-NEXT:   16 |   struct B3 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (C vbtable pointer)
+// CHECK-X64-NEXT:   16 |   char a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct D : B1, B2, B3, B4, B5, virtual B0 {
 	int a;
-	D() : a(0xf000000D) { printf("D = %p\n", this); }
+	D() : a(0x0000000D) { printf("D = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct B1 (base) (empty)
-// CHECK:    1 |   struct B2 (base) (empty)
-// CHECK:    2 |   struct B3 (base) (empty)
-// CHECK:    3 |   struct B4 (base) (empty)
-// CHECK:    8 |   struct B5 (base) (empty)
-// CHECK:    4 |   (D vbtable pointer)
-// CHECK:    8 |   int a
-// CHECK:   12 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   struct B1 (base) (empty)
-// CHECK-X64:    1 |   struct B2 (base) (empty)
-// CHECK-X64:    2 |   struct B3 (base) (empty)
-// CHECK-X64:    3 |   struct B4 (base) (empty)
-// CHECK-X64:   16 |   struct B5 (base) (empty)
-// CHECK-X64:    8 |   (D vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-NEXT:    1 |   struct B2 (base) (empty)
+// CHECK-NEXT:    2 |   struct B3 (base) (empty)
+// CHECK-NEXT:    3 |   struct B4 (base) (empty)
+// CHECK-NEXT:    8 |   struct B5 (base) (empty)
+// CHECK-NEXT:    4 |   (D vbtable pointer)
+// CHECK-NEXT:    8 |   int a
+// CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    1 |   struct B2 (base) (empty)
+// CHECK-X64-NEXT:    2 |   struct B3 (base) (empty)
+// CHECK-X64-NEXT:    3 |   struct B4 (base) (empty)
+// CHECK-X64-NEXT:   16 |   struct B5 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (D vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct E : B1, B6, B3, B4, B5, virtual B0 {
 	int a;
-	E() : a(0xf000000E) { printf("E = %p\n", this); }
+	E() : a(0x0000000E) { printf("E = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   struct B1 (base) (empty)
-// CHECK:    2 |   struct B6 (base) (empty)
-// CHECK:    3 |   struct B3 (base) (empty)
-// CHECK:    4 |   struct B4 (base) (empty)
-// CHECK:   13 |   struct B5 (base) (empty)
-// CHECK:    8 |   (E vbtable pointer)
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   struct B1 (base) (empty)
-// CHECK-X64:    2 |   struct B6 (base) (empty)
-// CHECK-X64:    3 |   struct B3 (base) (empty)
-// CHECK-X64:    4 |   struct B4 (base) (empty)
-// CHECK-X64:   17 |   struct B5 (base) (empty)
-// CHECK-X64:    8 |   (E vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-NEXT:    2 |   struct B6 (base) (empty)
+// CHECK-NEXT:    3 |   struct B3 (base) (empty)
+// CHECK-NEXT:    4 |   struct B4 (base) (empty)
+// CHECK-NEXT:   13 |   struct B5 (base) (empty)
+// CHECK-NEXT:    8 |   (E vbtable pointer)
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    2 |   struct B6 (base) (empty)
+// CHECK-X64-NEXT:    3 |   struct B3 (base) (empty)
+// CHECK-X64-NEXT:    4 |   struct B4 (base) (empty)
+// CHECK-X64-NEXT:   17 |   struct B5 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (E vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct F : B1, B6, B4, B8, B5, virtual B0 {
 	int a;
-	F() : a(0xf000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
+	F() : a(0x0000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   struct B1 (base) (empty)
-// CHECK:    2 |   struct B6 (base) (empty)
-// CHECK:    3 |   struct B4 (base) (empty)
-// CHECK:    3 |   struct B8 (base)
-// CHECK:    3 |     char [5] c
-// CHECK:   12 |   struct B5 (base) (empty)
-// CHECK:    8 |   (F vbtable pointer)
-// CHECK:   12 |   int a
-// CHECK:   16 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   struct B1 (base) (empty)
-// CHECK-X64:    2 |   struct B6 (base) (empty)
-// CHECK-X64:    3 |   struct B4 (base) (empty)
-// CHECK-X64:    3 |   struct B8 (base)
-// CHECK-X64:    3 |     char [5] c
-// CHECK-X64:   16 |   struct B5 (base) (empty)
-// CHECK-X64:    8 |   (F vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-NEXT:    2 |   struct B6 (base) (empty)
+// CHECK-NEXT:    3 |   struct B4 (base) (empty)
+// CHECK-NEXT:    3 |   struct B8 (base)
+// CHECK-NEXT:    3 |     char [5] c
+// CHECK-NEXT:   12 |   struct B5 (base) (empty)
+// CHECK-NEXT:    8 |   (F vbtable pointer)
+// CHECK-NEXT:   12 |   int a
+// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    2 |   struct B6 (base) (empty)
+// CHECK-X64-NEXT:    3 |   struct B4 (base) (empty)
+// CHECK-X64-NEXT:    3 |   struct B8 (base)
+// CHECK-X64-NEXT:    3 |     char [5] c
+// CHECK-X64-NEXT:   16 |   struct B5 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (F vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct G : B8, B1, virtual B0 {
 	int a;
 	__declspec(align(16)) int a1;
-	G() : a(0xf0000010), a1(0xf0000010) { printf("G = %p\n", this); }
+	G() : a(0x00000010), a1(0xf0000010) { printf("G = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    0 |   struct B8 (base)
-// CHECK:    0 |     char [5] c
-// CHECK:   21 |   struct B1 (base) (empty)
-// CHECK:    8 |   (G vbtable pointer)
-// CHECK:   24 |   int a
-// CHECK:   32 |   int a1
-// CHECK:   48 |   struct B0 (virtual base) (empty)
-// CHECK:      | [sizeof=48, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct G
-// CHECK-X64:    0 |   struct B8 (base)
-// CHECK-X64:    0 |     char [5] c
-// CHECK-X64:   16 |   struct B1 (base) (empty)
-// CHECK-X64:    8 |   (G vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   32 |   int a1
-// CHECK-X64:   48 |   struct B0 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    0 |   struct B8 (base)
+// CHECK-NEXT:    0 |     char [5] c
+// CHECK-NEXT:   21 |   struct B1 (base) (empty)
+// CHECK-NEXT:    8 |   (G vbtable pointer)
+// CHECK-NEXT:   24 |   int a
+// CHECK-NEXT:   32 |   int a1
+// CHECK-NEXT:   48 |   struct B0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=48, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct G
+// CHECK-X64-NEXT:    0 |   struct B8 (base)
+// CHECK-X64-NEXT:    0 |     char [5] c
+// CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
+// CHECK-X64-NEXT:    8 |   (G vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   32 |   int a1
+// CHECK-X64-NEXT:   48 |   struct B0 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct AX : B1X, B2X, B3X, B4X, virtual B0X {
 	int a;
-	AX() : a(0xf000000A) { printf(" A = %p\n", this); }
+	AX() : a(0x0000000A) { printf(" A = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AX
-// CHECK:    0 |   struct B1X (base) (empty)
-// CHECK:   16 |   struct B2X (base) (empty)
-// CHECK:   18 |   struct B3X (base) (empty)
-// CHECK:   35 |   struct B4X (base) (empty)
-// CHECK:   20 |   (AX vbtable pointer)
-// CHECK:   36 |   int a
-// CHECK:   48 |   struct B0X (virtual base) (empty)
-// CHECK:      | [sizeof=48, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AX
-// CHECK-X64:    0 |   struct B1X (base) (empty)
-// CHECK-X64:   16 |   struct B2X (base) (empty)
-// CHECK-X64:   18 |   struct B3X (base) (empty)
-// CHECK-X64:   33 |   struct B4X (base) (empty)
-// CHECK-X64:   24 |   (AX vbtable pointer)
-// CHECK-X64:   36 |   int a
-// CHECK-X64:   48 |   struct B0X (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AX
+// CHECK-NEXT:    0 |   struct B1X (base) (empty)
+// CHECK-NEXT:   16 |   struct B2X (base) (empty)
+// CHECK-NEXT:   18 |   struct B3X (base) (empty)
+// CHECK-NEXT:   35 |   struct B4X (base) (empty)
+// CHECK-NEXT:   20 |   (AX vbtable pointer)
+// CHECK-NEXT:   36 |   int a
+// CHECK-NEXT:   48 |   struct B0X (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=48, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct AX
+// CHECK-X64-NEXT:    0 |   struct B1X (base) (empty)
+// CHECK-X64-NEXT:   16 |   struct B2X (base) (empty)
+// CHECK-X64-NEXT:   18 |   struct B3X (base) (empty)
+// CHECK-X64-NEXT:   33 |   struct B4X (base) (empty)
+// CHECK-X64-NEXT:   24 |   (AX vbtable pointer)
+// CHECK-X64-NEXT:   36 |   int a
+// CHECK-X64-NEXT:   48 |   struct B0X (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct BX : B2X, B1X, B3X, B4X, virtual B0X {
 	int a;
-	BX() : a(0xf000000B) { printf(" B = %p\n", this); }
+	BX() : a(0x0000000B) { printf(" B = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct BX
-// CHECK:    0 |   struct B2X (base) (empty)
-// CHECK:    1 |   struct B1X (base) (empty)
-// CHECK:    2 |   struct B3X (base) (empty)
-// CHECK:   19 |   struct B4X (base) (empty)
-// CHECK:    4 |   (BX vbtable pointer)
-// CHECK:   20 |   int a
-// CHECK:   32 |   struct B0X (virtual base) (empty)
-// CHECK:      | [sizeof=32, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct BX
-// CHECK-X64:    0 |   struct B2X (base) (empty)
-// CHECK-X64:    1 |   struct B1X (base) (empty)
-// CHECK-X64:    2 |   struct B3X (base) (empty)
-// CHECK-X64:   17 |   struct B4X (base) (empty)
-// CHECK-X64:    8 |   (BX vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   32 |   struct B0X (virtual base) (empty)
-// CHECK-X64:      | [sizeof=32, align=16
-// CHECK-X64:      |  nvsize=32, nvalign=16]
+// CHECK-NEXT:    0 | struct BX
+// CHECK-NEXT:    0 |   struct B2X (base) (empty)
+// CHECK-NEXT:    1 |   struct B1X (base) (empty)
+// CHECK-NEXT:    2 |   struct B3X (base) (empty)
+// CHECK-NEXT:   19 |   struct B4X (base) (empty)
+// CHECK-NEXT:    4 |   (BX vbtable pointer)
+// CHECK-NEXT:   20 |   int a
+// CHECK-NEXT:   32 |   struct B0X (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=32, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct BX
+// CHECK-X64-NEXT:    0 |   struct B2X (base) (empty)
+// CHECK-X64-NEXT:    1 |   struct B1X (base) (empty)
+// CHECK-X64-NEXT:    2 |   struct B3X (base) (empty)
+// CHECK-X64-NEXT:   17 |   struct B4X (base) (empty)
+// CHECK-X64-NEXT:    8 |   (BX vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   32 |   struct B0X (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=32, align=16
+// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
 
 struct CX : B1X, B3X, B2X, virtual B0X {
 	int a;
-	CX() : a(0xf000000C) { printf(" C = %p\n", this); }
+	CX() : a(0x0000000C) { printf(" C = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct CX
-// CHECK:    0 |   struct B1X (base) (empty)
-// CHECK:    2 |   struct B3X (base) (empty)
-// CHECK:   32 |   struct B2X (base) (empty)
-// CHECK:    4 |   (CX vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   48 |   struct B0X (virtual base) (empty)
-// CHECK:      | [sizeof=48, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct CX
-// CHECK-X64:    0 |   struct B1X (base) (empty)
-// CHECK-X64:    2 |   struct B3X (base) (empty)
-// CHECK-X64:   32 |   struct B2X (base) (empty)
-// CHECK-X64:    8 |   (CX vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B0X (virtual base) (empty)
-// CHECK-X64:      | [sizeof=48, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct CX
+// CHECK-NEXT:    0 |   struct B1X (base) (empty)
+// CHECK-NEXT:    2 |   struct B3X (base) (empty)
+// CHECK-NEXT:   32 |   struct B2X (base) (empty)
+// CHECK-NEXT:   16 |   (CX vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   48 |   struct B0X (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=48, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct CX
+// CHECK-X64-NEXT:    0 |   struct B1X (base) (empty)
+// CHECK-X64-NEXT:    2 |   struct B3X (base) (empty)
+// CHECK-X64-NEXT:   32 |   struct B2X (base) (empty)
+// CHECK-X64-NEXT:    8 |   (CX vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B0X (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=48, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct DX : B8X, B1X, virtual B0X {
 	int a;
-	DX() : a(0xf000000D) { printf(" D = %p\n", this); }
+	DX() : a(0x0000000D) { printf(" D = %p\n", this); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct DX
-// CHECK:    0 |   struct B8X (base)
-// CHECK:    0 |     short a
-// CHECK:   10 |   struct B1X (base) (empty)
-// CHECK:    4 |   (DX vbtable pointer)
-// CHECK:   12 |   int a
-// CHECK:   16 |   struct B0X (virtual base) (empty)
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct DX
+// CHECK-NEXT:    0 |   struct B8X (base)
+// CHECK-NEXT:    0 |     short a
+// CHECK-NEXT:   10 |   struct B1X (base) (empty)
+// CHECK-NEXT:    4 |   (DX vbtable pointer)
+// CHECK-NEXT:   12 |   int a
+// CHECK-NEXT:   16 |   struct B0X (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct DX
-// CHECK-X64:    0 |   struct B8X (base)
-// CHECK-X64:    0 |     short a
-// CHECK-X64:   18 |   struct B1X (base) (empty)
-// CHECK-X64:    8 |   (DX vbtable pointer)
-// CHECK-X64:   20 |   int a
-// CHECK-X64:   24 |   struct B0X (virtual base) (empty)
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct DX
+// CHECK-X64-NEXT:    0 |   struct B8X (base)
+// CHECK-X64-NEXT:    0 |     short a
+// CHECK-X64-NEXT:   18 |   struct B1X (base) (empty)
+// CHECK-X64-NEXT:    8 |   (DX vbtable pointer)
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:   24 |   struct B0X (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 
 struct C0 {};
@@ -712,21 +746,25 @@ struct C1 : public C0 { int C1F0; };
 struct C2 : public C1, public C0 {};
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C2
-// CHECK:    0 |   struct C1 (base)
-// CHECK:    0 |     struct C0 (base) (empty)
-// CHECK:    0 |     int C1F0
-// CHECK:    5 |   struct C0 (base) (empty)
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C2
-// CHECK-X64:    0 |   struct C1 (base)
-// CHECK-X64:    0 |     struct C0 (base) (empty)
-// CHECK-X64:    0 |     int C1F0
-// CHECK-X64:    5 |   struct C0 (base) (empty)
-// CHECK-X64:      | [sizeof=8, align=4
-// CHECK-X64:      |  nvsize=8, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C2
+// CHECK-NEXT:    0 |   struct C1 (base)
+// CHECK-NEXT:    0 |     struct C0 (base) (empty)
+// CHECK-NEXT:    0 |     int C1F0
+// CHECK-NEXT:    5 |   struct C0 (base) (empty)
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C2
+// CHECK-X64-NEXT:    0 |   struct C1 (base)
+// CHECK-X64-NEXT:    0 |     struct C0 (base) (empty)
+// CHECK-X64-NEXT:    0 |     int C1F0
+// CHECK-X64-NEXT:    5 |   struct C0 (base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=8, align=4
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
 
 int a[
 sizeof(AA)+
diff --git a/test/Layout/ms-x86-misalignedarray.cpp b/test/Layout/ms-x86-misalignedarray.cpp
index f6887daf15b67c724ac9712c9714875cb80b576f..c3e664df461c206264b506867b1d1e15370c4904 100644
--- a/test/Layout/ms-x86-misalignedarray.cpp
+++ b/test/Layout/ms-x86-misalignedarray.cpp
@@ -3,21 +3,25 @@
 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
 // RUN:            | FileCheck %s -check-prefix CHECK-X64
 
-struct T0 { char c; };
-struct T2 : virtual T0 { };
-struct T3 { T2 a[1]; char c; };
+struct T0 { char c; };
+struct T2 : virtual T0 { };
+struct T3 { T2 a[1]; char c; };
 
-// CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct T3
-// CHECK:    0 |   struct T2 [1] a
-// CHECK:    5 |   char c
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
-// CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct T3
-// CHECK-X64:    0 |   struct T2 [1] a
-// CHECK-X64:   16 |   char c
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct T3
+// CHECK-NEXT:    0 |   struct T2 [1] a
+// CHECK-NEXT:    5 |   char c
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct T3
+// CHECK-X64-NEXT:    0 |   struct T2 [1] a
+// CHECK-X64-NEXT:   16 |   char c
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 int a[sizeof(T3)];
diff --git a/test/Layout/ms-x86-pack-and-align.cpp b/test/Layout/ms-x86-pack-and-align.cpp
index d9bca99b1c12f5be2a6e210eb70f9fdbad8f068b..b9d286211e42074169d746b28568d2784d710b50 100644
--- a/test/Layout/ms-x86-pack-and-align.cpp
+++ b/test/Layout/ms-x86-pack-and-align.cpp
@@ -36,21 +36,23 @@ struct X {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct X
-// CHECK:    0 |   struct B a
-// CHECK:    0 |     long long a
-// CHECK:    8 |   char b
-// CHECK:   10 |   int c
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct X
+// CHECK-NEXT:    0 |   struct B a
+// CHECK-NEXT:    0 |     long long a
+// CHECK:         8 |   char b
+// CHECK-NEXT:   10 |   int c
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct X
-// CHECK-X64:    0 |   struct B a
-// CHECK-X64:    0 |     long long a
-// CHECK-X64:    8 |   char b
-// CHECK-X64:   10 |   int c
-// CHECK-X64:      | [sizeof=16, align=4
-// CHECK-X64:      |  nvsize=16, nvalign=4]
+// CHECK-X64-NEXT:    0 | struct X
+// CHECK-X64-NEXT:    0 |   struct B a
+// CHECK-X64-NEXT:    0 |     long long a
+// CHECK-X64:         8 |   char b
+// CHECK-X64-NEXT:   10 |   int c
+// CHECK-X64-NEXT:      | [sizeof=16, align=4
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
 
 struct Y : A, B {
 	char a;
@@ -63,25 +65,27 @@ struct Y : A, B {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct Y
-// CHECK:    0 |   struct A (base)
-// CHECK:    0 |     char a
-// CHECK:    4 |   struct B (base)
-// CHECK:    4 |     long long a
-// CHECK:   12 |   char a
-// CHECK:   14 |   int b
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct Y
+// CHECK-NEXT:    0 |   struct A (base)
+// CHECK-NEXT:    0 |     char a
+// CHECK-NEXT:    4 |   struct B (base)
+// CHECK-NEXT:    4 |     long long a
+// CHECK-NEXT:   12 |   char a
+// CHECK-NEXT:   14 |   int b
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct Y
-// CHECK-X64:    0 |   struct A (base)
-// CHECK-X64:    0 |     char a
-// CHECK-X64:    4 |   struct B (base)
-// CHECK-X64:    4 |     long long a
-// CHECK-X64:   12 |   char a
-// CHECK-X64:   14 |   int b
-// CHECK-X64:      | [sizeof=20, align=4
-// CHECK-X64:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct Y
+// CHECK-X64-NEXT:    0 |   struct A (base)
+// CHECK-X64-NEXT:    0 |     char a
+// CHECK-X64-NEXT:    4 |   struct B (base)
+// CHECK-X64-NEXT:    4 |     long long a
+// CHECK-X64-NEXT:   12 |   char a
+// CHECK-X64-NEXT:   14 |   int b
+// CHECK-X64-NEXT:      | [sizeof=20, align=4
+// CHECK-X64-NEXT:      |  nvsize=20, nvalign=4]
 
 struct Z : virtual B {
 	char a;
@@ -94,23 +98,23 @@ struct Z : virtual B {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct Z
-// CHECK:    0 |   (Z vbtable pointer)
-// CHECK:    4 |   char a
-// CHECK:    6 |   int b
-// CHECK:   12 |   struct B (virtual base)
-// CHECK:   12 |     long long a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=10, nvalign=2]
+// CHECK-NEXT:    0 | struct Z
+// CHECK-NEXT:    0 |   (Z vbtable pointer)
+// CHECK-NEXT:    4 |   char a
+// CHECK-NEXT:    6 |   int b
+// CHECK-NEXT:   12 |   struct B (virtual base)
+// CHECK-NEXT:   12 |     long long a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=10, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct Z
-// CHECK-X64:    0 |   (Z vbtable pointer)
-// CHECK-X64:    8 |   char a
-// CHECK-X64:   10 |   int b
-// CHECK-X64:   16 |   struct B (virtual base)
-// CHECK-X64:   16 |     long long a
-// CHECK-X64:      | [sizeof=24, align=4
-// CHECK-X64:      |  nvsize=14, nvalign=2]
+// CHECK-X64-NEXT:    0 | struct Z
+// CHECK-X64-NEXT:    0 |   (Z vbtable pointer)
+// CHECK-X64-NEXT:    8 |   char a
+// CHECK-X64-NEXT:   10 |   int b
+// CHECK-X64-NEXT:   16 |   struct B (virtual base)
+// CHECK-X64-NEXT:   16 |     long long a
+// CHECK-X64-NEXT:      | [sizeof=24, align=4
+// CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
 
 #pragma pack(pop)
 
@@ -121,23 +125,27 @@ struct B1 : virtual A1 { char a; };
 struct C1 : B1 {};
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C1
-// CHECK:    0 |   struct B1 (base)
-// CHECK:    0 |     (B1 vbtable pointer)
-// CHECK:    4 |     char a
-// CHECK:    8 |   struct A1 (virtual base)
-// CHECK:    8 |     long long a
-// CHECK:      | [sizeof=16, align=8
-// CHECK:      |  nvsize=5, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C1
+// CHECK-NEXT:    0 |   struct B1 (base)
+// CHECK-NEXT:    0 |     (B1 vbtable pointer)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    8 |   struct A1 (virtual base)
+// CHECK-NEXT:    8 |     long long a
+// CHECK-NEXT:      | [sizeof=16, align=8
+// CHECK-NEXT:      |  nvsize=5, nvalign=8]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C1
-// CHECK-X64:    0 |   struct B1 (base)
-// CHECK-X64:    0 |     (B1 vbtable pointer)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:   16 |   struct A1 (virtual base)
-// CHECK-X64:   16 |     long long a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=9, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C1
+// CHECK-X64-NEXT:    0 |   struct B1 (base)
+// CHECK-X64-NEXT:    0 |     (B1 vbtable pointer)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:   16 |   struct A1 (virtual base)
+// CHECK-X64-NEXT:   16 |     long long a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=9, nvalign=8]
 
 struct CA0 {
 	CA0() {}
@@ -153,23 +161,27 @@ struct CA2 : public CA1, public CA0 {
 #pragma pack(pop)
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct CA2
-// CHECK:    0 |   (CA2 vftable pointer)
-// CHECK:    4 |   struct CA1 (base)
-// CHECK:    4 |     (CA1 vbtable pointer)
-// CHECK:    9 |   struct CA0 (base) (empty)
-// CHECK:    9 |   struct CA0 (virtual base) (empty)
-// CHECK:      | [sizeof=9, align=1
-// CHECK:      |  nvsize=9, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct CA2
+// CHECK-NEXT:    0 |   (CA2 vftable pointer)
+// CHECK-NEXT:    4 |   struct CA1 (base)
+// CHECK-NEXT:    4 |     (CA1 vbtable pointer)
+// CHECK-NEXT:    9 |   struct CA0 (base) (empty)
+// CHECK-NEXT:    9 |   struct CA0 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=9, align=1
+// CHECK-NEXT:      |  nvsize=9, nvalign=1]
+// CHECK-C64: *** Dumping AST Record Layout
+// CHECK-C64: *** Dumping AST Record Layout
 // CHECK-C64: *** Dumping AST Record Layout
-// CHECK-C64:    0 | struct CA2
-// CHECK-C64:    0 |   (CA2 vftable pointer)
-// CHECK-C64:    8 |   struct CA1 (base)
-// CHECK-C64:    8 |     (CA1 vbtable pointer)
-// CHECK-C64:   17 |   struct CA0 (base) (empty)
-// CHECK-C64:   17 |   struct CA0 (virtual base) (empty)
-// CHECK-C64:      | [sizeof=17, align=1
-// CHECK-C64:      |  nvsize=17, nvalign=1]
+// CHECK-C64-NEXT:    0 | struct CA2
+// CHECK-C64-NEXT:    0 |   (CA2 vftable pointer)
+// CHECK-C64-NEXT:    8 |   struct CA1 (base)
+// CHECK-C64-NEXT:    8 |     (CA1 vbtable pointer)
+// CHECK-C64-NEXT:   17 |   struct CA0 (base) (empty)
+// CHECK-C64-NEXT:   17 |   struct CA0 (virtual base) (empty)
+// CHECK-C64-NEXT:      | [sizeof=17, align=1
+// CHECK-C64-NEXT:      |  nvsize=17, nvalign=1]
 
 int a[
 sizeof(X)+
diff --git a/test/Layout/ms-x86-primary-bases.cpp b/test/Layout/ms-x86-primary-bases.cpp
index bc9b801d99c818a8b6be20429900a39dcd66d100..1597657cf7af8bbc4657ee32078129762930f11c 100644
--- a/test/Layout/ms-x86-primary-bases.cpp
+++ b/test/Layout/ms-x86-primary-bases.cpp
@@ -16,65 +16,67 @@ struct A : virtual B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     (B0 vftable pointer)
-// CHECK:    8 |     int a
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     (B0 vftable pointer)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     (B0 vftable pointer)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct B : virtual B0 {
 	virtual void f() { printf("B"); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   (B vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     (B0 vftable pointer)
-// CHECK:    8 |     int a
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   (B vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     (B0 vftable pointer)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   (B vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     (B0 vftable pointer)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct C : virtual B0 {
 	virtual void g() { printf("A"); }
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vftable pointer)
-// CHECK:    4 |   (C vbtable pointer)
-// CHECK:    8 |   struct B0 (virtual base)
-// CHECK:    8 |     (B0 vftable pointer)
-// CHECK:   12 |     int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vftable pointer)
+// CHECK-NEXT:    4 |   (C vbtable pointer)
+// CHECK-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-NEXT:    8 |     (B0 vftable pointer)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vftable pointer)
-// CHECK-X64:    8 |   (C vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (virtual base)
-// CHECK-X64:   16 |     (B0 vftable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:      | [sizeof=32, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vftable pointer)
+// CHECK-X64-NEXT:    8 |   (C vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   16 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:      | [sizeof=32, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct D : virtual B2, virtual B0 {
 	virtual void f() { printf("D"); }
@@ -82,27 +84,29 @@ struct D : virtual B2, virtual B0 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   (D vftable pointer)
-// CHECK:    4 |   (D vbtable pointer)
-// CHECK:    8 |   struct B2 (virtual base)
-// CHECK:    8 |     int a
-// CHECK:   12 |   struct B0 (virtual base)
-// CHECK:   12 |     (B0 vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   (D vftable pointer)
+// CHECK-NEXT:    4 |   (D vbtable pointer)
+// CHECK-NEXT:    8 |   struct B2 (virtual base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   12 |   struct B0 (virtual base)
+// CHECK-NEXT:   12 |     (B0 vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   (D vftable pointer)
-// CHECK-X64:    8 |   (D vbtable pointer)
-// CHECK-X64:   16 |   struct B2 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   struct B0 (virtual base)
-// CHECK-X64:   24 |     (B0 vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   (D vftable pointer)
+// CHECK-X64-NEXT:    8 |   (D vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B2 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   24 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct E : B0, virtual B1 {
 	virtual void f() { printf("E"); }
@@ -110,197 +114,206 @@ struct E : B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   struct B0 (primary base)
-// CHECK:    0 |     (B0 vftable pointer)
-// CHECK:    4 |     int a
-// CHECK:    8 |   (E vbtable pointer)
-// CHECK:   12 |   struct B1 (virtual base)
-// CHECK:   12 |     (B1 vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   struct B0 (primary base)
+// CHECK-NEXT:    0 |     (B0 vftable pointer)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   (E vbtable pointer)
+// CHECK-NEXT:   12 |   struct B1 (virtual base)
+// CHECK-NEXT:   12 |     (B1 vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   struct B0 (primary base)
-// CHECK-X64:    0 |     (B0 vftable pointer)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   (E vbtable pointer)
-// CHECK-X64:   24 |   struct B1 (virtual base)
-// CHECK-X64:   24 |     (B1 vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   struct B0 (primary base)
+// CHECK-X64-NEXT:    0 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   (E vbtable pointer)
+// CHECK-X64-NEXT:   24 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   24 |     (B1 vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct F : virtual B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   (F vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     (B0 vftable pointer)
-// CHECK:    8 |     int a
-// CHECK:   12 |   struct B1 (virtual base)
-// CHECK:   12 |     (B1 vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   (F vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     (B0 vftable pointer)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   12 |   struct B1 (virtual base)
+// CHECK-NEXT:   12 |     (B1 vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   (F vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     (B0 vftable pointer)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   24 |   struct B1 (virtual base)
-// CHECK-X64:   24 |     (B1 vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   (F vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   24 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   24 |     (B1 vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct AX
-// CHECK:    8 |   struct B0X (base)
-// CHECK:    8 |     int a
-// CHECK:    0 |   struct B1X (primary base)
-// CHECK:    0 |     (B1X vftable pointer)
-// CHECK:    4 |     int a
-// CHECK:   12 |   int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct AX
+// CHECK-NEXT:    8 |   struct B0X (base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:    0 |   struct B1X (primary base)
+// CHECK-NEXT:    0 |     (B1X vftable pointer)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:   12 |   int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct AX
-// CHECK-X64:   16 |   struct B0X (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:    0 |   struct B1X (primary base)
-// CHECK-X64:    0 |     (B1X vftable pointer)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   20 |   int a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct AX
+// CHECK-X64-NEXT:   16 |   struct B0X (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:    0 |   struct B1X (primary base)
+// CHECK-X64-NEXT:    0 |     (B1X vftable pointer)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   20 |   int a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct BX
-// CHECK:    8 |   struct B0X (base)
-// CHECK:    8 |     int a
-// CHECK:    0 |   struct B1X (primary base)
-// CHECK:    0 |     (B1X vftable pointer)
-// CHECK:    4 |     int a
-// CHECK:   12 |   int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=16, nvalign=4]
+// CHECK-NEXT:    0 | struct BX
+// CHECK-NEXT:    8 |   struct B0X (base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:    0 |   struct B1X (primary base)
+// CHECK-NEXT:    0 |     (B1X vftable pointer)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:   12 |   int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
 // CHECK-x64: *** Dumping AST Record Layout
-// CHECK-x64:    0 | struct BX
-// CHECK-x64:   16 |   struct B0X (base)
-// CHECK-x64:   16 |     int a
-// CHECK-x64:    0 |   struct B1X (primary base)
-// CHECK-x64:    0 |     (B1X vftable pointer)
-// CHECK-x64:    8 |     int a
-// CHECK-x64:   24 |   int a
-// CHECK-x64:      | [sizeof=24, align=8
-// CHECK-x64:      |  nvsize=24, nvalign=8]
+// CHECK-x64-NEXT:    0 | struct BX
+// CHECK-x64-NEXT:   16 |   struct B0X (base)
+// CHECK-x64-NEXT:   16 |     int a
+// CHECK-x64-NEXT:    0 |   struct B1X (primary base)
+// CHECK-x64-NEXT:    0 |     (B1X vftable pointer)
+// CHECK-x64-NEXT:    8 |     int a
+// CHECK-x64-NEXT:   24 |   int a
+// CHECK-x64-NEXT:      | [sizeof=24, align=8
+// CHECK-x64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct CX
-// CHECK:    0 |   (CX vftable pointer)
-// CHECK:    4 |   struct B0X (base)
-// CHECK:    4 |     int a
-// CHECK:    8 |   struct B2X (base)
-// CHECK:    8 |     (B2X vbtable pointer)
-// CHECK:   12 |     int a
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B1X (virtual base)
-// CHECK:   20 |     (B1X vftable pointer)
-// CHECK:   24 |     int a
-// CHECK:      | [sizeof=28, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct CX
+// CHECK-NEXT:    0 |   (CX vftable pointer)
+// CHECK-NEXT:    4 |   struct B0X (base)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   struct B2X (base)
+// CHECK-NEXT:    8 |     (B2X vbtable pointer)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B1X (virtual base)
+// CHECK-NEXT:   20 |     (B1X vftable pointer)
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:      | [sizeof=28, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct CX
-// CHECK-X64:    0 |   (CX vftable pointer)
-// CHECK-X64:    8 |   struct B0X (base)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   struct B2X (base)
-// CHECK-X64:   16 |     (B2X vbtable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   40 |   struct B1X (virtual base)
-// CHECK-X64:   40 |     (B1X vftable pointer)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=56, align=8
-// CHECK-X64:      |  nvsize=40, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct CX
+// CHECK-X64-NEXT:    0 |   (CX vftable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0X (base)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   struct B2X (base)
+// CHECK-X64-NEXT:   16 |     (B2X vbtable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   40 |   struct B1X (virtual base)
+// CHECK-X64-NEXT:   40 |     (B1X vftable pointer)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=56, align=8
+// CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
 
 struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct DX
-// CHECK:    0 |   (DX vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   (vtordisp for vbase B1X)
-// CHECK:   12 |   struct B1X (virtual base)
-// CHECK:   12 |     (B1X vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct DX
+// CHECK-NEXT:    0 |   (DX vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   (vtordisp for vbase B1X)
+// CHECK-NEXT:   12 |   struct B1X (virtual base)
+// CHECK-NEXT:   12 |     (B1X vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct DX
-// CHECK-X64:    0 |   (DX vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   20 |   (vtordisp for vbase B1X)
-// CHECK-X64:   24 |   struct B1X (virtual base)
-// CHECK-X64:   24 |     (B1X vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct DX
+// CHECK-X64-NEXT:    0 |   (DX vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   20 |   (vtordisp for vbase B1X)
+// CHECK-X64-NEXT:   24 |   struct B1X (virtual base)
+// CHECK-X64-NEXT:   24 |     (B1X vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct EX
-// CHECK:    0 |   (EX vftable pointer)
-// CHECK:    4 |   (EX vbtable pointer)
-// CHECK:    8 |   int a
-// CHECK:   12 |   struct B1X (virtual base)
-// CHECK:   12 |     (B1X vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:    0 | struct EX
+// CHECK-NEXT:    0 |   (EX vftable pointer)
+// CHECK-NEXT:    4 |   (EX vbtable pointer)
+// CHECK-NEXT:    8 |   int a
+// CHECK-NEXT:   12 |   struct B1X (virtual base)
+// CHECK-NEXT:   12 |     (B1X vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct EX
-// CHECK-X64:    0 |   (EX vftable pointer)
-// CHECK-X64:    8 |   (EX vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct B1X (virtual base)
-// CHECK-X64:   24 |     (B1X vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct EX
+// CHECK-X64-NEXT:    0 |   (EX vftable pointer)
+// CHECK-X64-NEXT:    8 |   (EX vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   struct B1X (virtual base)
+// CHECK-X64-NEXT:   24 |     (B1X vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct FX
-// CHECK:    0 |   (FX vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B1X (virtual base)
-// CHECK:    8 |     (B1X vftable pointer)
-// CHECK:   12 |     int a
-// CHECK:      | [sizeof=16, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct FX
+// CHECK-NEXT:    0 |   (FX vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B1X (virtual base)
+// CHECK-NEXT:    8 |     (B1X vftable pointer)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct FX
-// CHECK-X64:    0 |   (FX vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B1X (virtual base)
-// CHECK-X64:   16 |     (B1X vftable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:      | [sizeof=32, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct FX
+// CHECK-X64-NEXT:    0 |   (FX vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B1X (virtual base)
+// CHECK-X64-NEXT:   16 |     (B1X vftable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:      | [sizeof=32, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-size-alignment-fail.cpp b/test/Layout/ms-x86-size-alignment-fail.cpp
index f998ee12c8d12879dbaf970cd1f185821e046436..ad1de16dc37bc4f7953f142cd6b08be95a986cd2 100644
--- a/test/Layout/ms-x86-size-alignment-fail.cpp
+++ b/test/Layout/ms-x86-size-alignment-fail.cpp
@@ -11,108 +11,112 @@ struct __declspec(align(1)) B1 {};
 struct A : virtual B0 {};
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     char a
-// CHECK:      | [sizeof=5, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:      | [sizeof=5, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct __declspec(align(1)) B : virtual B0 {};
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   (B vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     char a
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   (B vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   (B vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct C : virtual B0 { int a; C() : a(0xC) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base)
-// CHECK:    8 |     char a
-// CHECK:      | [sizeof=9, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-NEXT:    8 |     char a
+// CHECK-NEXT:      | [sizeof=9, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct D : virtual B0 { __declspec(align(1)) int a; D() : a(0xD) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   (D vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   struct B0 (virtual base)
-// CHECK:    8 |     char a
-// CHECK:      | [sizeof=12, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   (D vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-NEXT:    8 |     char a
+// CHECK-NEXT:      | [sizeof=12, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   (D vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B0 (virtual base)
-// CHECK-X64:   16 |     char a
-// CHECK-X64:      | [sizeof=24, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   (D vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   16 |     char a
+// CHECK-X64-NEXT:      | [sizeof=24, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct E : virtual B0, virtual B1 {};
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   (E vbtable pointer)
-// CHECK:    4 |   struct B0 (virtual base)
-// CHECK:    4 |     char a
-// CHECK:    5 |   struct B1 (virtual base) (empty)
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   (E vbtable pointer)
+// CHECK-NEXT:    4 |   struct B0 (virtual base)
+// CHECK-NEXT:    4 |     char a
+// CHECK-NEXT:    5 |   struct B1 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   (E vbtable pointer)
-// CHECK-X64:    8 |   struct B0 (virtual base)
-// CHECK-X64:    8 |     char a
-// CHECK-X64:    9 |   struct B1 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:    8 |     char a
+// CHECK-X64-NEXT:    9 |   struct B1 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct F { char a; virtual ~F(); };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   (F vftable pointer)
-// CHECK:    4 |   char a
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   (F vftable pointer)
+// CHECK-NEXT:    4 |   char a
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   (F vftable pointer)
-// CHECK-X64:    8 |   char a
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   (F vftable pointer)
+// CHECK-X64-NEXT:    8 |   char a
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-vfvb-alignment.cpp b/test/Layout/ms-x86-vfvb-alignment.cpp
index 8eea20959b0ef26929562a7b9656513eb7119c00..51d46fe6ff98338690c499f77e856d55709567db 100644
--- a/test/Layout/ms-x86-vfvb-alignment.cpp
+++ b/test/Layout/ms-x86-vfvb-alignment.cpp
@@ -16,349 +16,361 @@ struct B6 { int a; B6() : a(0xf00000B6) {} virtual void f() { printf("B6"); } };
 struct A : B0, virtual B1 { __declspec(align(16)) int a; A() : a(0xf000000A) {} virtual void f() { printf("A"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vftable pointer)
-// CHECK:   16 |   struct B0 (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |   (A vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   64 |   struct B1 (virtual base)
-// CHECK:   64 |     char a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vftable pointer)
+// CHECK-NEXT:   16 |   struct B0 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |   (A vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base)
+// CHECK-NEXT:   64 |     char a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vftable pointer)
-// CHECK-X64:    8 |   struct B0 (base)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   (A vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vftable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (base)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   (A vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct B : A, B2 { int a; B() : a(0xf000000B) {} virtual void f() { printf("B"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct A (primary base)
-// CHECK:    0 |     (A vftable pointer)
-// CHECK:   16 |     struct B0 (base)
-// CHECK:   16 |       int a
-// CHECK:   20 |     (A vbtable pointer)
-// CHECK:   48 |     int a
-// CHECK:   64 |   struct B2 (base)
-// CHECK:   64 |     (B2 vbtable pointer)
-// CHECK:   68 |     int a
-// CHECK:   72 |   int a
-// CHECK:   80 |   struct B1 (virtual base)
-// CHECK:   80 |     char a
-// CHECK:      | [sizeof=96, align=16
-// CHECK:      |  nvsize=80, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct A (primary base)
+// CHECK-NEXT:    0 |     (A vftable pointer)
+// CHECK-NEXT:   16 |     struct B0 (base)
+// CHECK-NEXT:   16 |       int a
+// CHECK-NEXT:   20 |     (A vbtable pointer)
+// CHECK-NEXT:   48 |     int a
+// CHECK-NEXT:   64 |   struct B2 (base)
+// CHECK-NEXT:   64 |     (B2 vbtable pointer)
+// CHECK-NEXT:   68 |     int a
+// CHECK-NEXT:   72 |   int a
+// CHECK-NEXT:   80 |   struct B1 (virtual base)
+// CHECK-NEXT:   80 |     char a
+// CHECK-NEXT:      | [sizeof=96, align=16
+// CHECK-NEXT:      |  nvsize=80, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   struct A (primary base)
-// CHECK-X64:    0 |     (A vftable pointer)
-// CHECK-X64:    8 |     struct B0 (base)
-// CHECK-X64:    8 |       int a
-// CHECK-X64:   16 |     (A vbtable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:   48 |   struct B2 (base)
-// CHECK-X64:   48 |     (B2 vbtable pointer)
-// CHECK-X64:   56 |     int a
-// CHECK-X64:   64 |   int a
-// CHECK-X64:   80 |   struct B1 (virtual base)
-// CHECK-X64:   80 |     char a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=80, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   struct A (primary base)
+// CHECK-X64-NEXT:    0 |     (A vftable pointer)
+// CHECK-X64-NEXT:    8 |     struct B0 (base)
+// CHECK-X64-NEXT:    8 |       int a
+// CHECK-X64-NEXT:   16 |     (A vbtable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:   48 |   struct B2 (base)
+// CHECK-X64-NEXT:   48 |     (B2 vbtable pointer)
+// CHECK-X64-NEXT:   56 |     int a
+// CHECK-X64-NEXT:   64 |   int a
+// CHECK-X64-NEXT:   80 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   80 |     char a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
 
 struct C : B4 { int a; C() : a(0xf000000C) {} virtual void f() { printf("C"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vftable pointer)
-// CHECK:   16 |   struct B4 (base)
-// CHECK:   16 |     (B4 vbtable pointer)
-// CHECK:   20 |     int a
-// CHECK:   24 |   int a
-// CHECK:   32 |   struct B3 (virtual base)
-// CHECK:   32 |     int a
-// CHECK:      | [sizeof=48, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vftable pointer)
+// CHECK-NEXT:   16 |   struct B4 (base)
+// CHECK-NEXT:   16 |     (B4 vbtable pointer)
+// CHECK-NEXT:   20 |     int a
+// CHECK-NEXT:   24 |   int a
+// CHECK-NEXT:   32 |   struct B3 (virtual base)
+// CHECK-NEXT:   32 |     int a
+// CHECK-NEXT:      | [sizeof=48, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vftable pointer)
-// CHECK-X64:   16 |   struct B4 (base)
-// CHECK-X64:   16 |     (B4 vbtable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B3 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vftable pointer)
+// CHECK-X64-NEXT:   16 |   struct B4 (base)
+// CHECK-X64-NEXT:   16 |     (B4 vbtable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B3 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct D : C { int a; D() : a(0xf000000D) {} virtual void f() { printf("D"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct C (primary base)
-// CHECK:    0 |     (C vftable pointer)
-// CHECK:   16 |     struct B4 (base)
-// CHECK:   16 |       (B4 vbtable pointer)
-// CHECK:   20 |       int a
-// CHECK:   24 |     int a
-// CHECK:   32 |   int a
-// CHECK:   48 |   struct B3 (virtual base)
-// CHECK:   48 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct C (primary base)
+// CHECK-NEXT:    0 |     (C vftable pointer)
+// CHECK-NEXT:   16 |     struct B4 (base)
+// CHECK-NEXT:   16 |       (B4 vbtable pointer)
+// CHECK-NEXT:   20 |       int a
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   48 |   struct B3 (virtual base)
+// CHECK-NEXT:   48 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   struct C (primary base)
-// CHECK-X64:    0 |     (C vftable pointer)
-// CHECK-X64:   16 |     struct B4 (base)
-// CHECK-X64:   16 |       (B4 vbtable pointer)
-// CHECK-X64:   24 |       int a
-// CHECK-X64:   32 |     int a
-// CHECK-X64:   48 |   int a
-// CHECK-X64:   64 |   struct B3 (virtual base)
-// CHECK-X64:   64 |     int a
-// CHECK-X64:      | [sizeof=80, align=16
-// CHECK-X64:      |  nvsize=64, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   struct C (primary base)
+// CHECK-X64-NEXT:    0 |     (C vftable pointer)
+// CHECK-X64-NEXT:   16 |     struct B4 (base)
+// CHECK-X64-NEXT:   16 |       (B4 vbtable pointer)
+// CHECK-X64-NEXT:   24 |       int a
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:   48 |   int a
+// CHECK-X64-NEXT:   64 |   struct B3 (virtual base)
+// CHECK-X64-NEXT:   64 |     int a
+// CHECK-X64-NEXT:      | [sizeof=80, align=16
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
 
 struct E : virtual C { int a; E() : a(0xf000000E) {} virtual void f() { printf("E"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct E
-// CHECK:    0 |   (E vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:   16 |   struct B3 (virtual base)
-// CHECK:   16 |     int a
-// CHECK:   44 |   (vtordisp for vbase C)
-// CHECK:   48 |   struct C (virtual base)
-// CHECK:   48 |     (C vftable pointer)
-// CHECK:   64 |     struct B4 (base)
-// CHECK:   64 |       (B4 vbtable pointer)
-// CHECK:   68 |       int a
-// CHECK:   72 |     int a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct E
+// CHECK-NEXT:    0 |   (E vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:   16 |   struct B3 (virtual base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   44 |   (vtordisp for vbase C)
+// CHECK-NEXT:   48 |   struct C (virtual base)
+// CHECK-NEXT:   48 |     (C vftable pointer)
+// CHECK-NEXT:   64 |     struct B4 (base)
+// CHECK-NEXT:   64 |       (B4 vbtable pointer)
+// CHECK-NEXT:   68 |       int a
+// CHECK-NEXT:   72 |     int a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=8, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct E
-// CHECK-X64:    0 |   (E vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   16 |   struct B3 (virtual base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   44 |   (vtordisp for vbase C)
-// CHECK-X64:   48 |   struct C (virtual base)
-// CHECK-X64:   48 |     (C vftable pointer)
-// CHECK-X64:   64 |     struct B4 (base)
-// CHECK-X64:   64 |       (B4 vbtable pointer)
-// CHECK-X64:   72 |       int a
-// CHECK-X64:   80 |     int a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct E
+// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   16 |   struct B3 (virtual base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   44 |   (vtordisp for vbase C)
+// CHECK-X64-NEXT:   48 |   struct C (virtual base)
+// CHECK-X64-NEXT:   48 |     (C vftable pointer)
+// CHECK-X64-NEXT:   64 |     struct B4 (base)
+// CHECK-X64-NEXT:   64 |       (B4 vbtable pointer)
+// CHECK-X64-NEXT:   72 |       int a
+// CHECK-X64-NEXT:   80 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
 
 struct F : B3, virtual B0 { int a; F() : a(0xf000000F) {} virtual void f() { printf("F"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct F
-// CHECK:    0 |   (F vftable pointer)
-// CHECK:   16 |   struct B3 (base)
-// CHECK:   16 |     int a
-// CHECK:   32 |   (F vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   64 |   struct B0 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK-NEXT:    0 | struct F
+// CHECK-NEXT:    0 |   (F vftable pointer)
+// CHECK-NEXT:   16 |   struct B3 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   32 |   (F vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   64 |   struct B0 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct F
-// CHECK-X64:    0 |   (F vftable pointer)
-// CHECK-X64:   16 |   struct B3 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   (F vbtable pointer)
-// CHECK-X64:   40 |   int a
-// CHECK-X64:   48 |   struct B0 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct F
+// CHECK-X64-NEXT:    0 |   (F vftable pointer)
+// CHECK-X64-NEXT:   16 |   struct B3 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   (F vbtable pointer)
+// CHECK-X64-NEXT:   40 |   int a
+// CHECK-X64-NEXT:   48 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct G : B2, B6, virtual B1 { int a; G() : a(0xf0000010) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct G
-// CHECK:    8 |   struct B2 (base)
-// CHECK:    8 |     (B2 vbtable pointer)
-// CHECK:   12 |     int a
-// CHECK:    0 |   struct B6 (primary base)
-// CHECK:    0 |     (B6 vftable pointer)
-// CHECK:    4 |     int a
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B1 (virtual base)
-// CHECK:   20 |     char a
-// CHECK:      | [sizeof=21, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct G
+// CHECK-NEXT:    8 |   struct B2 (base)
+// CHECK-NEXT:    8 |     (B2 vbtable pointer)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:    0 |   struct B6 (primary base)
+// CHECK-NEXT:    0 |     (B6 vftable pointer)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B1 (virtual base)
+// CHECK-NEXT:   20 |     char a
+// CHECK-NEXT:      | [sizeof=21, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct G
-// CHECK-X64:   16 |   struct B2 (base)
-// CHECK-X64:   16 |     (B2 vbtable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:    0 |   struct B6 (primary base)
-// CHECK-X64:    0 |     (B6 vftable pointer)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   40 |   struct B1 (virtual base)
-// CHECK-X64:   40 |     char a
-// CHECK-X64:      | [sizeof=48, align=8
-// CHECK-X64:      |  nvsize=40, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct G
+// CHECK-X64-NEXT:   16 |   struct B2 (base)
+// CHECK-X64-NEXT:   16 |     (B2 vbtable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:    0 |   struct B6 (primary base)
+// CHECK-X64-NEXT:    0 |     (B6 vftable pointer)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   40 |     char a
+// CHECK-X64-NEXT:      | [sizeof=48, align=8
+// CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
 
 struct H : B6, B2, virtual B1 { int a; H() : a(0xf0000011) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct H
-// CHECK:    0 |   struct B6 (primary base)
-// CHECK:    0 |     (B6 vftable pointer)
-// CHECK:    4 |     int a
-// CHECK:    8 |   struct B2 (base)
-// CHECK:    8 |     (B2 vbtable pointer)
-// CHECK:   12 |     int a
-// CHECK:   16 |   int a
-// CHECK:   20 |   struct B1 (virtual base)
-// CHECK:   20 |     char a
-// CHECK:      | [sizeof=21, align=4
-// CHECK:      |  nvsize=20, nvalign=4]
+// CHECK-NEXT:    0 | struct H
+// CHECK-NEXT:    0 |   struct B6 (primary base)
+// CHECK-NEXT:    0 |     (B6 vftable pointer)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   struct B2 (base)
+// CHECK-NEXT:    8 |     (B2 vbtable pointer)
+// CHECK-NEXT:   12 |     int a
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   20 |   struct B1 (virtual base)
+// CHECK-NEXT:   20 |     char a
+// CHECK-NEXT:      | [sizeof=21, align=4
+// CHECK-NEXT:      |  nvsize=20, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct H
-// CHECK-X64:    0 |   struct B6 (primary base)
-// CHECK-X64:    0 |     (B6 vftable pointer)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   struct B2 (base)
-// CHECK-X64:   16 |     (B2 vbtable pointer)
-// CHECK-X64:   24 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   40 |   struct B1 (virtual base)
-// CHECK-X64:   40 |     char a
-// CHECK-X64:      | [sizeof=48, align=8
-// CHECK-X64:      |  nvsize=40, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct H
+// CHECK-X64-NEXT:    0 |   struct B6 (primary base)
+// CHECK-X64-NEXT:    0 |     (B6 vftable pointer)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   struct B2 (base)
+// CHECK-X64-NEXT:   16 |     (B2 vbtable pointer)
+// CHECK-X64-NEXT:   24 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   40 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   40 |     char a
+// CHECK-X64-NEXT:      | [sizeof=48, align=8
+// CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
 
 struct I : B0, virtual B1 { int a; int a1; __declspec(align(16)) int a2; I() : a(0xf0000011), a1(0xf0000011), a2(0xf0000011) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct I
-// CHECK:    0 |   struct B0 (base)
-// CHECK:    0 |     int a
-// CHECK:    4 |   (I vbtable pointer)
-// CHECK:   20 |   int a
-// CHECK:   24 |   int a1
-// CHECK:   32 |   int a2
-// CHECK:   48 |   struct B1 (virtual base)
-// CHECK:   48 |     char a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK-NEXT:    0 | struct I
+// CHECK-NEXT:    0 |   struct B0 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:    4 |   (I vbtable pointer)
+// CHECK-NEXT:   20 |   int a
+// CHECK-NEXT:   24 |   int a1
+// CHECK-NEXT:   32 |   int a2
+// CHECK-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-NEXT:   48 |     char a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct I
-// CHECK-X64:    0 |   struct B0 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:    8 |   (I vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   20 |   int a1
-// CHECK-X64:   32 |   int a2
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct I
+// CHECK-X64-NEXT:    0 |   struct B0 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:    8 |   (I vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   20 |   int a1
+// CHECK-X64-NEXT:   32 |   int a2
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct J : B0, B3, virtual B1 { int a; int a1; J() : a(0xf0000012), a1(0xf0000012) {} };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct J
-// CHECK:    0 |   struct B0 (base)
-// CHECK:    0 |     int a
-// CHECK:   16 |   struct B3 (base)
-// CHECK:   16 |     int a
-// CHECK:   32 |   (J vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   52 |   int a1
-// CHECK:   64 |   struct B1 (virtual base)
-// CHECK:   64 |     char a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK-NEXT:    0 | struct J
+// CHECK-NEXT:    0 |   struct B0 (base)
+// CHECK-NEXT:    0 |     int a
+// CHECK-NEXT:   16 |   struct B3 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   32 |   (J vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   52 |   int a1
+// CHECK-NEXT:   64 |   struct B1 (virtual base)
+// CHECK-NEXT:   64 |     char a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct J
-// CHECK-X64:    0 |   struct B0 (base)
-// CHECK-X64:    0 |     int a
-// CHECK-X64:   16 |   struct B3 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   (J vbtable pointer)
-// CHECK-X64:   40 |   int a
-// CHECK-X64:   44 |   int a1
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     char a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct J
+// CHECK-X64-NEXT:    0 |   struct B0 (base)
+// CHECK-X64-NEXT:    0 |     int a
+// CHECK-X64-NEXT:   16 |   struct B3 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   (J vbtable pointer)
+// CHECK-X64-NEXT:   40 |   int a
+// CHECK-X64-NEXT:   44 |   int a1
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     char a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct K { int a; K() : a(0xf0000013) {} virtual void f() { printf("K"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct K
-// CHECK:    0 |   (K vftable pointer)
-// CHECK:    4 |   int a
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct K
+// CHECK-NEXT:    0 |   (K vftable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct K
-// CHECK-X64:    0 |   (K vftable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct K
+// CHECK-X64-NEXT:    0 |   (K vftable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 struct L : virtual K { int a; L() : a(0xf0000014) {} virtual void g() { printf("L"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct L
-// CHECK:    0 |   (L vftable pointer)
-// CHECK:    4 |   (L vbtable pointer)
-// CHECK:    8 |   int a
-// CHECK:   12 |   struct K (virtual base)
-// CHECK:   12 |     (K vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:    0 | struct L
+// CHECK-NEXT:    0 |   (L vftable pointer)
+// CHECK-NEXT:    4 |   (L vbtable pointer)
+// CHECK-NEXT:    8 |   int a
+// CHECK-NEXT:   12 |   struct K (virtual base)
+// CHECK-NEXT:   12 |     (K vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=12, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct L
-// CHECK-X64:    0 |   (L vftable pointer)
-// CHECK-X64:    8 |   (L vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   24 |   struct K (virtual base)
-// CHECK-X64:   24 |     (K vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct L
+// CHECK-X64-NEXT:    0 |   (L vftable pointer)
+// CHECK-X64-NEXT:    8 |   (L vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   24 |   struct K (virtual base)
+// CHECK-X64-NEXT:   24 |     (K vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
 
 struct M : virtual K { int a; M() : a(0xf0000015) {} virtual void f() { printf("M"); } };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct M
-// CHECK:    0 |   (M vbtable pointer)
-// CHECK:    4 |   int a
-// CHECK:    8 |   (vtordisp for vbase K)
-// CHECK:   12 |   struct K (virtual base)
-// CHECK:   12 |     (K vftable pointer)
-// CHECK:   16 |     int a
-// CHECK:      | [sizeof=20, align=4
-// CHECK:      |  nvsize=8, nvalign=4]
+// CHECK-NEXT:    0 | struct M
+// CHECK-NEXT:    0 |   (M vbtable pointer)
+// CHECK-NEXT:    4 |   int a
+// CHECK-NEXT:    8 |   (vtordisp for vbase K)
+// CHECK-NEXT:   12 |   struct K (virtual base)
+// CHECK-NEXT:   12 |     (K vftable pointer)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:      | [sizeof=20, align=4
+// CHECK-NEXT:      |  nvsize=8, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct M
-// CHECK-X64:    0 |   (M vbtable pointer)
-// CHECK-X64:    8 |   int a
-// CHECK-X64:   20 |   (vtordisp for vbase K)
-// CHECK-X64:   24 |   struct K (virtual base)
-// CHECK-X64:   24 |     (K vftable pointer)
-// CHECK-X64:   32 |     int a
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=16, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct M
+// CHECK-X64-NEXT:    0 |   (M vbtable pointer)
+// CHECK-X64-NEXT:    8 |   int a
+// CHECK-X64-NEXT:   20 |   (vtordisp for vbase K)
+// CHECK-X64-NEXT:   24 |   struct K (virtual base)
+// CHECK-X64-NEXT:   24 |     (K vftable pointer)
+// CHECK-X64-NEXT:   32 |     int a
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-vfvb-sharing.cpp b/test/Layout/ms-x86-vfvb-sharing.cpp
index 2b3d08e44c6712ef8583ac1ce347f8a2b7a6bb1e..8deb9c0c0dda458d0e498ab7552efc705a89b195 100644
--- a/test/Layout/ms-x86-vfvb-sharing.cpp
+++ b/test/Layout/ms-x86-vfvb-sharing.cpp
@@ -18,27 +18,31 @@ struct A : B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vftable pointer)
-// CHECK:   16 |   struct B0 (base)
-// CHECK:   16 |     int a
-// CHECK:   20 |   (A vbtable pointer)
-// CHECK:   48 |   int a
-// CHECK:   64 |   struct B1 (virtual base)
-// CHECK:   64 |     int a
-// CHECK:      | [sizeof=80, align=16
-// CHECK:      |  nvsize=64, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vftable pointer)
+// CHECK-NEXT:   16 |   struct B0 (base)
+// CHECK-NEXT:   16 |     int a
+// CHECK-NEXT:   20 |   (A vbtable pointer)
+// CHECK-NEXT:   48 |   int a
+// CHECK-NEXT:   64 |   struct B1 (virtual base)
+// CHECK-NEXT:   64 |     int a
+// CHECK-NEXT:      | [sizeof=80, align=16
+// CHECK-NEXT:      |  nvsize=64, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vftable pointer)
-// CHECK-X64:    8 |   struct B0 (base)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   (A vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vftable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (base)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   (A vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct B : B2, B0, virtual B1 {
 	__declspec(align(16)) int a;
@@ -47,29 +51,31 @@ struct B : B2, B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct B
-// CHECK:    0 |   struct B2 (primary base)
-// CHECK:    0 |     (B2 vftable pointer)
-// CHECK:    4 |   struct B0 (base)
-// CHECK:    4 |     int a
-// CHECK:    8 |   (B vbtable pointer)
-// CHECK:   32 |   int a
-// CHECK:   48 |   struct B1 (virtual base)
-// CHECK:   48 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct B
+// CHECK-NEXT:    0 |   struct B2 (primary base)
+// CHECK-NEXT:    0 |     (B2 vftable pointer)
+// CHECK-NEXT:    4 |   struct B0 (base)
+// CHECK-NEXT:    4 |     int a
+// CHECK-NEXT:    8 |   (B vbtable pointer)
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-NEXT:   48 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct B
-// CHECK-X64:    0 |   struct B2 (primary base)
-// CHECK-X64:    0 |     (B2 vftable pointer)
-// CHECK-X64:    8 |   struct B0 (base)
-// CHECK-X64:    8 |     int a
-// CHECK-X64:   16 |   (B vbtable pointer)
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct B
+// CHECK-X64-NEXT:    0 |   struct B2 (primary base)
+// CHECK-X64-NEXT:    0 |     (B2 vftable pointer)
+// CHECK-X64-NEXT:    8 |   struct B0 (base)
+// CHECK-X64-NEXT:    8 |     int a
+// CHECK-X64-NEXT:   16 |   (B vbtable pointer)
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct C : B3, B0, virtual B1 {
 	__declspec(align(16)) int a;
@@ -78,29 +84,31 @@ struct C : B3, B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vftable pointer)
-// CHECK:   16 |   struct B3 (base)
-// CHECK:   16 |     (B3 vbtable pointer)
-// CHECK:   20 |   struct B0 (base)
-// CHECK:   20 |     int a
-// CHECK:   32 |   int a
-// CHECK:   48 |   struct B1 (virtual base)
-// CHECK:   48 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=48, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vftable pointer)
+// CHECK-NEXT:   16 |   struct B3 (base)
+// CHECK-NEXT:   16 |     (B3 vbtable pointer)
+// CHECK-NEXT:   20 |   struct B0 (base)
+// CHECK-NEXT:   20 |     int a
+// CHECK-NEXT:   32 |   int a
+// CHECK-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-NEXT:   48 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=48, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vftable pointer)
-// CHECK-X64:    8 |   struct B3 (base)
-// CHECK-X64:    8 |     (B3 vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vftable pointer)
+// CHECK-X64-NEXT:    8 |   struct B3 (base)
+// CHECK-X64-NEXT:    8 |     (B3 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 struct D : B4, B0, virtual B1 {
 	__declspec(align(16)) int a;
@@ -109,29 +117,31 @@ struct D : B4, B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   struct B4 (primary base)
-// CHECK:    0 |     (B4 vftable pointer)
-// CHECK:    4 |     (B4 vbtable pointer)
-// CHECK:    8 |   struct B0 (base)
-// CHECK:    8 |     int a
-// CHECK:   16 |   int a
-// CHECK:   32 |   struct B1 (virtual base)
-// CHECK:   32 |     int a
-// CHECK:      | [sizeof=48, align=16
-// CHECK:      |  nvsize=32, nvalign=16]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   struct B4 (primary base)
+// CHECK-NEXT:    0 |     (B4 vftable pointer)
+// CHECK-NEXT:    4 |     (B4 vbtable pointer)
+// CHECK-NEXT:    8 |   struct B0 (base)
+// CHECK-NEXT:    8 |     int a
+// CHECK-NEXT:   16 |   int a
+// CHECK-NEXT:   32 |   struct B1 (virtual base)
+// CHECK-NEXT:   32 |     int a
+// CHECK-NEXT:      | [sizeof=48, align=16
+// CHECK-NEXT:      |  nvsize=32, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   struct B4 (primary base)
-// CHECK-X64:    0 |     (B4 vftable pointer)
-// CHECK-X64:    8 |     (B4 vbtable pointer)
-// CHECK-X64:   16 |   struct B0 (base)
-// CHECK-X64:   16 |     int a
-// CHECK-X64:   32 |   int a
-// CHECK-X64:   48 |   struct B1 (virtual base)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:      | [sizeof=64, align=16
-// CHECK-X64:      |  nvsize=48, nvalign=16]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   struct B4 (primary base)
+// CHECK-X64-NEXT:    0 |     (B4 vftable pointer)
+// CHECK-X64-NEXT:    8 |     (B4 vbtable pointer)
+// CHECK-X64-NEXT:   16 |   struct B0 (base)
+// CHECK-X64-NEXT:   16 |     int a
+// CHECK-X64-NEXT:   32 |   int a
+// CHECK-X64-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:      | [sizeof=64, align=16
+// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
 
 int a[
 sizeof(A)+
diff --git a/test/Layout/ms-x86-vtordisp.cpp b/test/Layout/ms-x86-vtordisp.cpp
index 6a37eb1d1fce3dacb6d37b2bd3addd9c15f46460..390d671857c79417650fde78dc29c9dad165ae90 100644
--- a/test/Layout/ms-x86-vtordisp.cpp
+++ b/test/Layout/ms-x86-vtordisp.cpp
@@ -30,35 +30,39 @@ struct A : virtual B0, virtual B1 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct A
-// CHECK:    0 |   (A vftable pointer)
-// CHECK:    4 |   (A vbtable pointer)
-// CHECK:    8 |   int a
-// CHECK:   16 |   (vtordisp for vbase B0)
-// CHECK:   20 |   struct B0 (virtual base)
-// CHECK:   20 |     (B0 vftable pointer)
-// CHECK:   24 |     int a
-// CHECK:   44 |   (vtordisp for vbase B1)
-// CHECK:   48 |   struct B1 (virtual base)
-// CHECK:   48 |     (B1 vftable pointer)
-// CHECK:   52 |     int a
-// CHECK:      | [sizeof=64, align=16
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct A
+// CHECK-NEXT:    0 |   (A vftable pointer)
+// CHECK-NEXT:    4 |   (A vbtable pointer)
+// CHECK-NEXT:    8 |   int a
+// CHECK-NEXT:   16 |   (vtordisp for vbase B0)
+// CHECK-NEXT:   20 |   struct B0 (virtual base)
+// CHECK-NEXT:   20 |     (B0 vftable pointer)
+// CHECK-NEXT:   24 |     int a
+// CHECK-NEXT:   44 |   (vtordisp for vbase B1)
+// CHECK-NEXT:   48 |   struct B1 (virtual base)
+// CHECK-NEXT:   48 |     (B1 vftable pointer)
+// CHECK-NEXT:   52 |     int a
+// CHECK-NEXT:      | [sizeof=64, align=16
+// CHECK-NEXT:      |  nvsize=12, nvalign=16]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct A
-// CHECK-X64:    0 |   (A vftable pointer)
-// CHECK-X64:    8 |   (A vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   36 |   (vtordisp for vbase B0)
-// CHECK-X64:   40 |   struct B0 (virtual base)
-// CHECK-X64:   40 |     (B0 vftable pointer)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:   76 |   (vtordisp for vbase B1)
-// CHECK-X64:   80 |   struct B1 (virtual base)
-// CHECK-X64:   80 |     (B1 vftable pointer)
-// CHECK-X64:   88 |     int a
-// CHECK-X64:      | [sizeof=96, align=16
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct A
+// CHECK-X64-NEXT:    0 |   (A vftable pointer)
+// CHECK-X64-NEXT:    8 |   (A vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   36 |   (vtordisp for vbase B0)
+// CHECK-X64-NEXT:   40 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   40 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B1)
+// CHECK-X64-NEXT:   80 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   80 |     (B1 vftable pointer)
+// CHECK-X64-NEXT:   88 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=16
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
 
 struct C : virtual B0, virtual B1, VAlign32 {
 	int a;
@@ -68,39 +72,43 @@ struct C : virtual B0, virtual B1, VAlign32 {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct C
-// CHECK:    0 |   (C vftable pointer)
-// CHECK:   32 |   struct VAlign32 (base)
-// CHECK:   32 |     (VAlign32 vbtable pointer)
-// CHECK:   36 |   int a
-// CHECK:   64 |   (vtordisp for vbase B0)
-// CHECK:   68 |   struct B0 (virtual base)
-// CHECK:   68 |     (B0 vftable pointer)
-// CHECK:   72 |     int a
-// CHECK:  108 |   (vtordisp for vbase B1)
-// CHECK:  112 |   struct B1 (virtual base)
-// CHECK:  112 |     (B1 vftable pointer)
-// CHECK:  116 |     int a
-// CHECK:  128 |   struct Align32 (virtual base) (empty)
-// CHECK:      | [sizeof=128, align=32
-// CHECK:      |  nvsize=64, nvalign=32]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct C
+// CHECK-NEXT:    0 |   (C vftable pointer)
+// CHECK-NEXT:   32 |   struct VAlign32 (base)
+// CHECK-NEXT:   32 |     (VAlign32 vbtable pointer)
+// CHECK-NEXT:   36 |   int a
+// CHECK-NEXT:   64 |   (vtordisp for vbase B0)
+// CHECK-NEXT:   68 |   struct B0 (virtual base)
+// CHECK-NEXT:   68 |     (B0 vftable pointer)
+// CHECK-NEXT:   72 |     int a
+// CHECK-NEXT:  108 |   (vtordisp for vbase B1)
+// CHECK-NEXT:  112 |   struct B1 (virtual base)
+// CHECK-NEXT:  112 |     (B1 vftable pointer)
+// CHECK-NEXT:  116 |     int a
+// CHECK-NEXT:  128 |   struct Align32 (virtual base) (empty)
+// CHECK-NEXT:      | [sizeof=128, align=32
+// CHECK-NEXT:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct C
-// CHECK-X64:    0 |   (C vftable pointer)
-// CHECK-X64:   32 |   struct VAlign32 (base)
-// CHECK-X64:   32 |     (VAlign32 vbtable pointer)
-// CHECK-X64:   40 |   int a
-// CHECK-X64:   68 |   (vtordisp for vbase B0)
-// CHECK-X64:   72 |   struct B0 (virtual base)
-// CHECK-X64:   72 |     (B0 vftable pointer)
-// CHECK-X64:   80 |     int a
-// CHECK-X64:  108 |   (vtordisp for vbase B1)
-// CHECK-X64:  112 |   struct B1 (virtual base)
-// CHECK-X64:  112 |     (B1 vftable pointer)
-// CHECK-X64:  120 |     int a
-// CHECK-X64:  128 |   struct Align32 (virtual base) (empty)
-// CHECK-X64:      | [sizeof=128, align=32
-// CHECK-X64:      |  nvsize=64, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct C
+// CHECK-X64-NEXT:    0 |   (C vftable pointer)
+// CHECK-X64-NEXT:   32 |   struct VAlign32 (base)
+// CHECK-X64-NEXT:   32 |     (VAlign32 vbtable pointer)
+// CHECK-X64-NEXT:   40 |   int a
+// CHECK-X64-NEXT:   68 |   (vtordisp for vbase B0)
+// CHECK-X64-NEXT:   72 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   72 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   80 |     int a
+// CHECK-X64-NEXT:  108 |   (vtordisp for vbase B1)
+// CHECK-X64-NEXT:  112 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:  112 |     (B1 vftable pointer)
+// CHECK-X64-NEXT:  120 |     int a
+// CHECK-X64-NEXT:  128 |   struct Align32 (virtual base) (empty)
+// CHECK-X64-NEXT:      | [sizeof=128, align=32
+// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
 
 struct __declspec(align(32)) D : virtual B0, virtual B1  {
 	int a;
@@ -110,35 +118,35 @@ struct __declspec(align(32)) D : virtual B0, virtual B1  {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct D
-// CHECK:    0 |   (D vftable pointer)
-// CHECK:    4 |   (D vbtable pointer)
-// CHECK:    8 |   int a
-// CHECK:   32 |   (vtordisp for vbase B0)
-// CHECK:   36 |   struct B0 (virtual base)
-// CHECK:   36 |     (B0 vftable pointer)
-// CHECK:   40 |     int a
-// CHECK:   76 |   (vtordisp for vbase B1)
-// CHECK:   80 |   struct B1 (virtual base)
-// CHECK:   80 |     (B1 vftable pointer)
-// CHECK:   84 |     int a
-// CHECK:      | [sizeof=96, align=32
-// CHECK:      |  nvsize=12, nvalign=4]
+// CHECK-NEXT:    0 | struct D
+// CHECK-NEXT:    0 |   (D vftable pointer)
+// CHECK-NEXT:    4 |   (D vbtable pointer)
+// CHECK-NEXT:    8 |   int a
+// CHECK-NEXT:   32 |   (vtordisp for vbase B0)
+// CHECK-NEXT:   36 |   struct B0 (virtual base)
+// CHECK-NEXT:   36 |     (B0 vftable pointer)
+// CHECK-NEXT:   40 |     int a
+// CHECK-NEXT:   76 |   (vtordisp for vbase B1)
+// CHECK-NEXT:   80 |   struct B1 (virtual base)
+// CHECK-NEXT:   80 |     (B1 vftable pointer)
+// CHECK-NEXT:   84 |     int a
+// CHECK-NEXT:      | [sizeof=96, align=32
+// CHECK-NEXT:      |  nvsize=12, nvalign=32]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct D
-// CHECK-X64:    0 |   (D vftable pointer)
-// CHECK-X64:    8 |   (D vbtable pointer)
-// CHECK-X64:   16 |   int a
-// CHECK-X64:   36 |   (vtordisp for vbase B0)
-// CHECK-X64:   40 |   struct B0 (virtual base)
-// CHECK-X64:   40 |     (B0 vftable pointer)
-// CHECK-X64:   48 |     int a
-// CHECK-X64:   76 |   (vtordisp for vbase B1)
-// CHECK-X64:   80 |   struct B1 (virtual base)
-// CHECK-X64:   80 |     (B1 vftable pointer)
-// CHECK-X64:   88 |     int a
-// CHECK-X64:      | [sizeof=96, align=32
-// CHECK-X64:      |  nvsize=24, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct D
+// CHECK-X64-NEXT:    0 |   (D vftable pointer)
+// CHECK-X64-NEXT:    8 |   (D vbtable pointer)
+// CHECK-X64-NEXT:   16 |   int a
+// CHECK-X64-NEXT:   36 |   (vtordisp for vbase B0)
+// CHECK-X64-NEXT:   40 |   struct B0 (virtual base)
+// CHECK-X64-NEXT:   40 |     (B0 vftable pointer)
+// CHECK-X64-NEXT:   48 |     int a
+// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B1)
+// CHECK-X64-NEXT:   80 |   struct B1 (virtual base)
+// CHECK-X64-NEXT:   80 |     (B1 vftable pointer)
+// CHECK-X64-NEXT:   88 |     int a
+// CHECK-X64-NEXT:      | [sizeof=96, align=32
+// CHECK-X64-NEXT:      |  nvsize=24, nvalign=32]
 
 struct AT {
 	virtual ~AT(){}
@@ -149,19 +157,21 @@ struct CT : virtual AT {
 CT::~CT(){}
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct CT
-// CHECK:    0 |   (CT vbtable pointer)
-// CHECK:    4 |   struct AT (virtual base)
-// CHECK:    4 |     (AT vftable pointer)
-// CHECK:      | [sizeof=8, align=4
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct CT
+// CHECK-NEXT:    0 |   (CT vbtable pointer)
+// CHECK-NEXT:    4 |   struct AT (virtual base)
+// CHECK-NEXT:    4 |     (AT vftable pointer)
+// CHECK-NEXT:      | [sizeof=8, align=4
+// CHECK-NEXT:      |  nvsize=4, nvalign=4]
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct CT
-// CHECK-X64:    0 |   (CT vbtable pointer)
-// CHECK-X64:    8 |   struct AT (virtual base)
-// CHECK-X64:    8 |     (AT vftable pointer)
-// CHECK-X64:      | [sizeof=16, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct CT
+// CHECK-X64-NEXT:    0 |   (CT vbtable pointer)
+// CHECK-X64-NEXT:    8 |   struct AT (virtual base)
+// CHECK-X64-NEXT:    8 |     (AT vftable pointer)
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 struct XA {
 	XA() { printf("XA"); }
@@ -178,27 +188,31 @@ struct XC : virtual XB {
 };
 
 // CHECK: *** Dumping AST Record Layout
-// CHECK:    0 | struct XC
-// CHECK:    0 |   (XC vbtable pointer)
-// CHECK:    4 |   (vtordisp for vbase XB)
-// CHECK:    8 |   struct XB (virtual base)
-// CHECK:    8 |     (XB vftable pointer)
-// CHECK:   16 |     struct XA (base)
-// CHECK:   16 |       long long ll
-// CHECK:   24 |     int b
-// CHECK:      | [sizeof=32, align=8
-// CHECK:      |  nvsize=4, nvalign=4]
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct XC
+// CHECK-NEXT:    0 |   (XC vbtable pointer)
+// CHECK-NEXT:    4 |   (vtordisp for vbase XB)
+// CHECK-NEXT:    8 |   struct XB (virtual base)
+// CHECK-NEXT:    8 |     (XB vftable pointer)
+// CHECK-NEXT:   16 |     struct XA (base)
+// CHECK-NEXT:   16 |       long long ll
+// CHECK-NEXT:   24 |     int b
+// CHECK-NEXT:      | [sizeof=32, align=8
+// CHECK-NEXT:      |  nvsize=4, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
 // CHECK-X64: *** Dumping AST Record Layout
-// CHECK-X64:    0 | struct XC
-// CHECK-X64:    0 |   (XC vbtable pointer)
-// CHECK-X64:   12 |   (vtordisp for vbase XB)
-// CHECK-X64:   16 |   struct XB (virtual base)
-// CHECK-X64:   16 |     (XB vftable pointer)
-// CHECK-X64:   24 |     struct XA (base)
-// CHECK-X64:   24 |       long long ll
-// CHECK-X64:   32 |     int b
-// CHECK-X64:      | [sizeof=40, align=8
-// CHECK-X64:      |  nvsize=8, nvalign=8]
+// CHECK-X64-NEXT:    0 | struct XC
+// CHECK-X64-NEXT:    0 |   (XC vbtable pointer)
+// CHECK-X64-NEXT:   12 |   (vtordisp for vbase XB)
+// CHECK-X64-NEXT:   16 |   struct XB (virtual base)
+// CHECK-X64-NEXT:   16 |     (XB vftable pointer)
+// CHECK-X64-NEXT:   24 |     struct XA (base)
+// CHECK-X64-NEXT:   24 |       long long ll
+// CHECK-X64-NEXT:   32 |     int b
+// CHECK-X64-NEXT:      | [sizeof=40, align=8
+// CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
 
 int a[
 sizeof(A)+