@@ -368,28 +368,6 @@ namespace {
368368 ClangFieldInfo> {
369369 const clang::RecordDecl *ClangDecl;
370370
371- template <class Fn >
372- void forEachNonEmptyBase (Fn fn) const {
373- auto &layout = ClangDecl->getASTContext ().getASTRecordLayout (ClangDecl);
374-
375- if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(ClangDecl)) {
376- for (auto base : cxxRecord->bases ()) {
377- auto baseType = base.getType ().getCanonicalType ();
378-
379- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
380- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
381-
382- if (baseCxxRecord->isEmpty ())
383- continue ;
384-
385- auto offset = layout.getBaseClassOffset (baseCxxRecord);
386- auto size =
387- ClangDecl->getASTContext ().getTypeSizeInChars (baseType);
388- fn (baseType, offset, size);
389- }
390- }
391- }
392-
393371 public:
394372 LoadableClangRecordTypeInfo (ArrayRef<ClangFieldInfo> fields,
395373 unsigned explosionSize, llvm::Type *storageType,
@@ -446,10 +424,11 @@ namespace {
446424
447425 void addToAggLowering (IRGenModule &IGM, SwiftAggLowering &lowering,
448426 Size offset) const override {
449- forEachNonEmptyBase ([&](clang::QualType type, clang::CharUnits offset,
450- clang::CharUnits) {
451- lowering.addTypedData (type, offset);
452- });
427+ if (auto cxxRecordDecl = dyn_cast<clang::CXXRecordDecl>(ClangDecl)) {
428+ for (auto base : getBasesAndOffsets (cxxRecordDecl)) {
429+ lowering.addTypedData (base.decl , base.offset .asCharUnits ());
430+ }
431+ }
453432
454433 lowering.addTypedData (ClangDecl, offset.asCharUnits ());
455434 }
@@ -1384,23 +1363,12 @@ class ClangRecordLowering {
13841363 void collectBases (const clang::RecordDecl *decl) {
13851364 auto &layout = decl->getASTContext ().getASTRecordLayout (decl);
13861365 if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(decl)) {
1387- for (auto base : cxxRecord->bases ()) {
1388- if (base.isVirtual ())
1389- continue ;
1390-
1391- auto baseType = base.getType ().getCanonicalType ();
1392-
1393- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
1394- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
1395-
1396- if (baseCxxRecord->isEmpty ())
1397- continue ;
1398-
1399- auto baseOffset = Size (layout.getBaseClassOffset (baseCxxRecord).getQuantity ());
1400- SubobjectAdjustment += baseOffset;
1401- collectBases (baseCxxRecord);
1402- collectStructFields (baseCxxRecord);
1403- SubobjectAdjustment -= baseOffset;
1366+ auto bases = getBasesAndOffsets (cxxRecord);
1367+ for (auto base : bases) {
1368+ SubobjectAdjustment += base.offset ;
1369+ collectBases (base.decl );
1370+ collectStructFields (base.decl );
1371+ SubobjectAdjustment -= base.offset ;
14041372 }
14051373 }
14061374 }
0 commit comments