@@ -138,9 +138,9 @@ class EmptySubobjectMap {
138138 return Offset <= MaxEmptyClassOffset;
139139 }
140140
141- CharUnits
142- getFieldOffset ( const ASTRecordLayout &Layout, unsigned FieldNo ) const {
143- uint64_t FieldOffset = Layout.getFieldOffset (FieldNo );
141+ CharUnits getFieldOffset ( const ASTRecordLayout &Layout,
142+ const FieldDecl *Field ) const {
143+ uint64_t FieldOffset = Layout.getFieldOffset (Field-> getFieldIndex () );
144144 assert (FieldOffset % CharWidth == 0 &&
145145 " Field offset not at char boundary!" );
146146
@@ -298,14 +298,12 @@ EmptySubobjectMap::CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,
298298 }
299299
300300 // Traverse all member variables.
301- unsigned FieldNo = 0 ;
302- for (CXXRecordDecl::field_iterator I = Info->Class ->field_begin (),
303- E = Info->Class ->field_end (); I != E; ++I, ++FieldNo) {
304- if (I->isBitField ())
301+ for (const FieldDecl *Field : Info->Class ->fields ()) {
302+ if (Field->isBitField ())
305303 continue ;
306304
307- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo );
308- if (!CanPlaceFieldSubobjectAtOffset (*I , FieldOffset))
305+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field );
306+ if (!CanPlaceFieldSubobjectAtOffset (Field , FieldOffset))
309307 return false ;
310308 }
311309
@@ -345,14 +343,12 @@ void EmptySubobjectMap::UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,
345343 }
346344
347345 // Traverse all member variables.
348- unsigned FieldNo = 0 ;
349- for (CXXRecordDecl::field_iterator I = Info->Class ->field_begin (),
350- E = Info->Class ->field_end (); I != E; ++I, ++FieldNo) {
351- if (I->isBitField ())
346+ for (const FieldDecl *Field : Info->Class ->fields ()) {
347+ if (Field->isBitField ())
352348 continue ;
353349
354- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo );
355- UpdateEmptyFieldSubobjects (*I , FieldOffset, PlacingEmptyBase);
350+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field );
351+ UpdateEmptyFieldSubobjects (Field , FieldOffset, PlacingEmptyBase);
356352 }
357353}
358354
@@ -410,15 +406,12 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
410406 }
411407
412408 // Traverse all member variables.
413- unsigned FieldNo = 0 ;
414- for (CXXRecordDecl::field_iterator I = RD->field_begin (), E = RD->field_end ();
415- I != E; ++I, ++FieldNo) {
416- if (I->isBitField ())
409+ for (const FieldDecl *Field : RD->fields ()) {
410+ if (Field->isBitField ())
417411 continue ;
418412
419- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo);
420-
421- if (!CanPlaceFieldSubobjectAtOffset (*I, FieldOffset))
413+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field);
414+ if (!CanPlaceFieldSubobjectAtOffset (Field, FieldOffset))
422415 return false ;
423416 }
424417
@@ -465,9 +458,8 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,
465458 return true ;
466459}
467460
468- bool
469- EmptySubobjectMap::CanPlaceFieldAtOffset (const FieldDecl *FD,
470- CharUnits Offset) {
461+ bool EmptySubobjectMap::CanPlaceFieldAtOffset (const FieldDecl *FD,
462+ CharUnits Offset) {
471463 if (!CanPlaceFieldSubobjectAtOffset (FD, Offset))
472464 return false ;
473465
@@ -521,15 +513,12 @@ void EmptySubobjectMap::UpdateEmptyFieldSubobjects(
521513 }
522514
523515 // Traverse all member variables.
524- unsigned FieldNo = 0 ;
525- for (CXXRecordDecl::field_iterator I = RD->field_begin (), E = RD->field_end ();
526- I != E; ++I, ++FieldNo) {
527- if (I->isBitField ())
516+ for (const FieldDecl *Field : RD->fields ()) {
517+ if (Field->isBitField ())
528518 continue ;
529519
530- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo);
531-
532- UpdateEmptyFieldSubobjects (*I, FieldOffset, PlacingOverlappingField);
520+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field);
521+ UpdateEmptyFieldSubobjects (Field, FieldOffset, PlacingOverlappingField);
533522 }
534523}
535524
@@ -1455,10 +1444,8 @@ void ItaniumRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
14551444 bool InsertExtraPadding = D->mayInsertExtraPadding (/* EmitRemark=*/ true );
14561445 bool HasFlexibleArrayMember = D->hasFlexibleArrayMember ();
14571446 for (auto I = D->field_begin (), End = D->field_end (); I != End; ++I) {
1458- auto Next (I);
1459- ++Next;
1460- LayoutField (*I,
1461- InsertExtraPadding && (Next != End || !HasFlexibleArrayMember));
1447+ LayoutField (*I, InsertExtraPadding &&
1448+ (std::next (I) != End || !HasFlexibleArrayMember));
14621449 }
14631450}
14641451
@@ -3672,35 +3659,33 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
36723659 }
36733660
36743661 // Dump fields.
3675- uint64_t FieldNo = 0 ;
3676- for (RecordDecl::field_iterator I = RD->field_begin (),
3677- E = RD->field_end (); I != E; ++I, ++FieldNo) {
3678- const FieldDecl &Field = **I;
3679- uint64_t LocalFieldOffsetInBits = Layout.getFieldOffset (FieldNo);
3662+ for (const FieldDecl *Field : RD->fields ()) {
3663+ uint64_t LocalFieldOffsetInBits =
3664+ Layout.getFieldOffset (Field->getFieldIndex ());
36803665 CharUnits FieldOffset =
36813666 Offset + C.toCharUnitsFromBits (LocalFieldOffsetInBits);
36823667
36833668 // Recursively dump fields of record type.
3684- if (auto RT = Field. getType ()->getAs <RecordType>()) {
3669+ if (auto RT = Field-> getType ()->getAs <RecordType>()) {
36853670 DumpRecordLayout (OS, RT->getDecl (), C, FieldOffset, IndentLevel,
3686- Field. getName ().data (),
3671+ Field-> getName ().data (),
36873672 /* PrintSizeInfo=*/ false ,
36883673 /* IncludeVirtualBases=*/ true );
36893674 continue ;
36903675 }
36913676
3692- if (Field. isBitField ()) {
3677+ if (Field-> isBitField ()) {
36933678 uint64_t LocalFieldByteOffsetInBits = C.toBits (FieldOffset - Offset);
36943679 unsigned Begin = LocalFieldOffsetInBits - LocalFieldByteOffsetInBits;
3695- unsigned Width = Field. getBitWidthValue (C);
3680+ unsigned Width = Field-> getBitWidthValue (C);
36963681 PrintBitFieldOffset (OS, FieldOffset, Begin, Width, IndentLevel);
36973682 } else {
36983683 PrintOffset (OS, FieldOffset, IndentLevel);
36993684 }
37003685 const QualType &FieldType = C.getLangOpts ().DumpRecordLayoutsCanonical
3701- ? Field. getType ().getCanonicalType ()
3702- : Field. getType ();
3703- OS << FieldType << ' ' << Field << ' \n ' ;
3686+ ? Field-> getType ().getCanonicalType ()
3687+ : Field-> getType ();
3688+ OS << FieldType << ' ' << * Field << ' \n ' ;
37043689 }
37053690
37063691 // Dump virtual bases.
0 commit comments