@@ -138,9 +138,9 @@ class EmptySubobjectMap {
138
138
return Offset <= MaxEmptyClassOffset;
139
139
}
140
140
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 () );
144
144
assert (FieldOffset % CharWidth == 0 &&
145
145
" Field offset not at char boundary!" );
146
146
@@ -298,14 +298,12 @@ EmptySubobjectMap::CanPlaceBaseSubobjectAtOffset(const BaseSubobjectInfo *Info,
298
298
}
299
299
300
300
// 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 ())
305
303
continue ;
306
304
307
- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo );
308
- if (!CanPlaceFieldSubobjectAtOffset (*I , FieldOffset))
305
+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field );
306
+ if (!CanPlaceFieldSubobjectAtOffset (Field , FieldOffset))
309
307
return false ;
310
308
}
311
309
@@ -345,14 +343,12 @@ void EmptySubobjectMap::UpdateEmptyBaseSubobjects(const BaseSubobjectInfo *Info,
345
343
}
346
344
347
345
// 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 ())
352
348
continue ;
353
349
354
- CharUnits FieldOffset = Offset + getFieldOffset (Layout, FieldNo );
355
- UpdateEmptyFieldSubobjects (*I , FieldOffset, PlacingEmptyBase);
350
+ CharUnits FieldOffset = Offset + getFieldOffset (Layout, Field );
351
+ UpdateEmptyFieldSubobjects (Field , FieldOffset, PlacingEmptyBase);
356
352
}
357
353
}
358
354
@@ -410,15 +406,12 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
410
406
}
411
407
412
408
// 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 ())
417
411
continue ;
418
412
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))
422
415
return false ;
423
416
}
424
417
@@ -465,9 +458,8 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const FieldDecl *FD,
465
458
return true ;
466
459
}
467
460
468
- bool
469
- EmptySubobjectMap::CanPlaceFieldAtOffset (const FieldDecl *FD,
470
- CharUnits Offset) {
461
+ bool EmptySubobjectMap::CanPlaceFieldAtOffset (const FieldDecl *FD,
462
+ CharUnits Offset) {
471
463
if (!CanPlaceFieldSubobjectAtOffset (FD, Offset))
472
464
return false ;
473
465
@@ -521,15 +513,12 @@ void EmptySubobjectMap::UpdateEmptyFieldSubobjects(
521
513
}
522
514
523
515
// 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 ())
528
518
continue ;
529
519
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);
533
522
}
534
523
}
535
524
@@ -1455,10 +1444,8 @@ void ItaniumRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
1455
1444
bool InsertExtraPadding = D->mayInsertExtraPadding (/* EmitRemark=*/ true );
1456
1445
bool HasFlexibleArrayMember = D->hasFlexibleArrayMember ();
1457
1446
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));
1462
1449
}
1463
1450
}
1464
1451
@@ -3672,35 +3659,33 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
3672
3659
}
3673
3660
3674
3661
// 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 ());
3680
3665
CharUnits FieldOffset =
3681
3666
Offset + C.toCharUnitsFromBits (LocalFieldOffsetInBits);
3682
3667
3683
3668
// Recursively dump fields of record type.
3684
- if (auto RT = Field. getType ()->getAs <RecordType>()) {
3669
+ if (auto RT = Field-> getType ()->getAs <RecordType>()) {
3685
3670
DumpRecordLayout (OS, RT->getDecl (), C, FieldOffset, IndentLevel,
3686
- Field. getName ().data (),
3671
+ Field-> getName ().data (),
3687
3672
/* PrintSizeInfo=*/ false ,
3688
3673
/* IncludeVirtualBases=*/ true );
3689
3674
continue ;
3690
3675
}
3691
3676
3692
- if (Field. isBitField ()) {
3677
+ if (Field-> isBitField ()) {
3693
3678
uint64_t LocalFieldByteOffsetInBits = C.toBits (FieldOffset - Offset);
3694
3679
unsigned Begin = LocalFieldOffsetInBits - LocalFieldByteOffsetInBits;
3695
- unsigned Width = Field. getBitWidthValue (C);
3680
+ unsigned Width = Field-> getBitWidthValue (C);
3696
3681
PrintBitFieldOffset (OS, FieldOffset, Begin, Width, IndentLevel);
3697
3682
} else {
3698
3683
PrintOffset (OS, FieldOffset, IndentLevel);
3699
3684
}
3700
3685
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 ' ;
3704
3689
}
3705
3690
3706
3691
// Dump virtual bases.
0 commit comments