@@ -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 }
@@ -1395,23 +1374,12 @@ class ClangRecordLowering {
13951374 void collectBases (const clang::RecordDecl *decl) {
13961375 auto &layout = decl->getASTContext ().getASTRecordLayout (decl);
13971376 if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(decl)) {
1398- for (auto base : cxxRecord->bases ()) {
1399- if (base.isVirtual ())
1400- continue ;
1401-
1402- auto baseType = base.getType ().getCanonicalType ();
1403-
1404- auto baseRecord = cast<clang::RecordType>(baseType)->getDecl ();
1405- auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
1406-
1407- if (baseCxxRecord->isEmpty ())
1408- continue ;
1409-
1410- auto baseOffset = Size (layout.getBaseClassOffset (baseCxxRecord).getQuantity ());
1411- SubobjectAdjustment += baseOffset;
1412- collectBases (baseCxxRecord);
1413- collectStructFields (baseCxxRecord);
1414- SubobjectAdjustment -= baseOffset;
1377+ auto bases = getBasesAndOffsets (cxxRecord);
1378+ for (auto base : bases) {
1379+ SubobjectAdjustment += base.offset ;
1380+ collectBases (base.decl );
1381+ collectStructFields (base.decl );
1382+ SubobjectAdjustment -= base.offset ;
14151383 }
14161384 }
14171385 }
0 commit comments