Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit c3aad30

Browse files
committed
[C++11] Replacing CXXRecordDecl iterators vbases_begin() and vbases_end() with iterator_range vbases(). Updating all of the usages of the iterators with range-based for loops.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203808 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 07ca0a2 commit c3aad30

13 files changed

+93
-145
lines changed

Diff for: include/clang/AST/DeclCXX.h

+7
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,13 @@ class CXXRecordDecl : public RecordDecl {
689689
/// \brief Retrieves the number of virtual base classes of this class.
690690
unsigned getNumVBases() const { return data().NumVBases; }
691691

692+
base_class_range vbases() {
693+
return base_class_range(vbases_begin(), vbases_end());
694+
}
695+
base_class_const_range vbases() const {
696+
return base_class_const_range(vbases_begin(), vbases_end());
697+
}
698+
692699
base_class_iterator vbases_begin() { return data().getVBases(); }
693700
base_class_const_iterator vbases_begin() const { return data().getVBases(); }
694701
base_class_iterator vbases_end() { return vbases_begin() + data().NumVBases; }

Diff for: lib/AST/ASTContext.cpp

+5-8
Original file line numberDiff line numberDiff line change
@@ -496,11 +496,10 @@ comments::FullComment *ASTContext::getCommentForDecl(
496496
}
497497
}
498498
// Check virtual bases.
499-
for (CXXRecordDecl::base_class_const_iterator I =
500-
RD->vbases_begin(), E = RD->vbases_end(); I != E; ++I) {
501-
if (I->getAccessSpecifier() != AS_public)
499+
for (const auto &I : RD->vbases()) {
500+
if (I.getAccessSpecifier() != AS_public)
502501
continue;
503-
QualType Ty = I->getType();
502+
QualType Ty = I.getType();
504503
if (Ty.isNull())
505504
continue;
506505
if (const CXXRecordDecl *VirtualBase = Ty->getAsCXXRecordDecl()) {
@@ -5617,10 +5616,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
56175616
}
56185617

56195618
if (CXXRec && includeVBases) {
5620-
for (CXXRecordDecl::base_class_iterator
5621-
BI = CXXRec->vbases_begin(),
5622-
BE = CXXRec->vbases_end(); BI != BE; ++BI) {
5623-
CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
5619+
for (const auto &BI : CXXRec->vbases()) {
5620+
CXXRecordDecl *base = BI.getType()->getAsCXXRecordDecl();
56245621
if (base->isEmpty())
56255622
continue;
56265623
uint64_t offs = toBits(layout.getVBaseClassOffset(base));

Diff for: lib/AST/DeclCXX.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -202,19 +202,17 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
202202
data().HasNonLiteralTypeFieldsOrBases = true;
203203

204204
// Now go through all virtual bases of this base and add them.
205-
for (CXXRecordDecl::base_class_iterator VBase =
206-
BaseClassDecl->vbases_begin(),
207-
E = BaseClassDecl->vbases_end(); VBase != E; ++VBase) {
205+
for (const auto &VBase : BaseClassDecl->vbases()) {
208206
// Add this base if it's not already in the list.
209-
if (SeenVBaseTypes.insert(C.getCanonicalType(VBase->getType()))) {
210-
VBases.push_back(VBase);
207+
if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType()))) {
208+
VBases.push_back(&VBase);
211209

212210
// C++11 [class.copy]p8:
213211
// The implicitly-declared copy constructor for a class X will have
214212
// the form 'X::X(const X&)' if each [...] virtual base class B of X
215213
// has a copy constructor whose first parameter is of type
216214
// 'const B&' or 'const volatile B&' [...]
217-
if (CXXRecordDecl *VBaseDecl = VBase->getType()->getAsCXXRecordDecl())
215+
if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
218216
if (!VBaseDecl->hasCopyConstructorWithConstParam())
219217
data().ImplicitCopyConstructorHasConstParam = false;
220218
}

Diff for: lib/AST/RecordLayoutBuilder.cpp

+17-29
Original file line numberDiff line numberDiff line change
@@ -359,10 +359,9 @@ EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
359359

360360
if (RD == Class) {
361361
// This is the most derived class, traverse virtual bases as well.
362-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
363-
E = RD->vbases_end(); I != E; ++I) {
362+
for (const auto &I : RD->vbases()) {
364363
const CXXRecordDecl *VBaseDecl =
365-
cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
364+
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
366365

367366
CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);
368367
if (!CanPlaceFieldSubobjectAtOffset(VBaseDecl, Class, VBaseOffset))
@@ -469,10 +468,9 @@ void EmptySubobjectMap::UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
469468

470469
if (RD == Class) {
471470
// This is the most derived class, traverse virtual bases as well.
472-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
473-
E = RD->vbases_end(); I != E; ++I) {
471+
for (const auto &I : RD->vbases()) {
474472
const CXXRecordDecl *VBaseDecl =
475-
cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
473+
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
476474

477475
CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBaseDecl);
478476
UpdateEmptyFieldSubobjects(VBaseDecl, Class, VBaseOffset);
@@ -1324,10 +1322,9 @@ void RecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {
13241322
}
13251323

13261324
// And all virtual bases.
1327-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
1328-
E = RD->vbases_end(); I != E; ++I) {
1325+
for (const auto &I : RD->vbases()) {
13291326
const CXXRecordDecl *BaseDecl =
1330-
cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
1327+
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
13311328

13321329
assert(VBases.count(BaseDecl) && "Did not find base offset!");
13331330
}
@@ -2658,10 +2655,8 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
26582655
// The alignment of the vtordisp is at least the required alignment of the
26592656
// entire record. This requirement may be present to support vtordisp
26602657
// injection.
2661-
for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
2662-
e = RD->vbases_end();
2663-
i != e; ++i) {
2664-
const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
2658+
for (const auto &I : RD->vbases()) {
2659+
const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();
26652660
const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);
26662661
RequiredAlignment =
26672662
std::max(RequiredAlignment, BaseLayout.getRequiredAlignment());
@@ -2672,10 +2667,8 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
26722667
computeVtorDispSet(RD);
26732668
// Iterate through the virtual bases and lay them out.
26742669
const ASTRecordLayout* PreviousBaseLayout = 0;
2675-
for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
2676-
e = RD->vbases_end();
2677-
i != e; ++i) {
2678-
const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
2670+
for (const auto &I : RD->vbases()) {
2671+
const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();
26792672
const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl);
26802673
bool HasVtordisp = HasVtordispSet.count(BaseDecl);
26812674
// If the last field we laid out was a non-zero length bitfield then add
@@ -2747,10 +2740,8 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) {
27472740
// /vd2 or #pragma vtordisp(2): Always use vtordisps for virtual bases with
27482741
// vftables.
27492742
if (RD->getMSVtorDispMode() == MSVtorDispAttr::ForVFTable) {
2750-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
2751-
E = RD->vbases_end();
2752-
I != E; ++I) {
2753-
const CXXRecordDecl *BaseDecl = I->getType()->getAsCXXRecordDecl();
2743+
for (const auto &I : RD->vbases()) {
2744+
const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();
27542745
const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);
27552746
if (Layout.hasExtendableVFPtr())
27562747
HasVtordispSet.insert(BaseDecl);
@@ -2806,10 +2797,8 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) {
28062797
}
28072798
// Re-check all of our vbases for vtordisp requirements (in case their
28082799
// non-virtual bases have vtordisp requirements).
2809-
for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
2810-
e = RD->vbases_end();
2811-
i != e; ++i) {
2812-
const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl();
2800+
for (const auto &I : RD->vbases()) {
2801+
const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl();
28132802
if (!HasVtordispSet.count(BaseDecl) &&
28142803
RequiresVtordisp(HasVtordispSet, BaseDecl))
28152804
HasVtordispSet.insert(BaseDecl);
@@ -3134,11 +3123,10 @@ static void DumpCXXRecordLayout(raw_ostream &OS,
31343123
// Dump virtual bases.
31353124
const ASTRecordLayout::VBaseOffsetsMapTy &vtordisps =
31363125
Layout.getVBaseOffsetsMap();
3137-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
3138-
E = RD->vbases_end(); I != E; ++I) {
3139-
assert(I->isVirtual() && "Found non-virtual class!");
3126+
for (const auto &I : RD->vbases()) {
3127+
assert(I.isVirtual() && "Found non-virtual class!");
31403128
const CXXRecordDecl *VBase =
3141-
cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
3129+
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
31423130

31433131
CharUnits VBaseOffset = Offset + Layout.getVBaseClassOffset(VBase);
31443132

Diff for: lib/AST/VTableBuilder.cpp

+4-8
Original file line numberDiff line numberDiff line change
@@ -3221,10 +3221,8 @@ void MicrosoftVTableContext::computeVTablePaths(bool ForVBTables,
32213221

32223222
// After visiting any direct base, we've transitively visited all of its
32233223
// morally virtual bases.
3224-
for (CXXRecordDecl::base_class_const_iterator II = Base->vbases_begin(),
3225-
EE = Base->vbases_end();
3226-
II != EE; ++II)
3227-
VBasesSeen.insert(II->getType()->getAsCXXRecordDecl());
3224+
for (const auto &I : Base->vbases())
3225+
VBasesSeen.insert(I.getType()->getAsCXXRecordDecl());
32283226
}
32293227

32303228
// Sort the paths into buckets, and if any of them are ambiguous, extend all
@@ -3407,10 +3405,8 @@ const VirtualBaseInfo *MicrosoftVTableContext::computeVBTableRelatedInformation(
34073405
// New vbases are added to the end of the vbtable.
34083406
// Skip the self entry and vbases visited in the non-virtual base, if any.
34093407
unsigned VBTableIndex = 1 + VBI->VBTableIndices.size();
3410-
for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
3411-
E = RD->vbases_end();
3412-
I != E; ++I) {
3413-
const CXXRecordDecl *CurVBase = I->getType()->getAsCXXRecordDecl();
3408+
for (const auto &I : RD->vbases()) {
3409+
const CXXRecordDecl *CurVBase = I.getType()->getAsCXXRecordDecl();
34143410
if (!VBI->VBTableIndices.count(CurVBase))
34153411
VBI->VBTableIndices[CurVBase] = VBTableIndex++;
34163412
}

Diff for: lib/Analysis/CFG.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -880,12 +880,11 @@ void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) {
880880
const CXXRecordDecl *RD = DD->getParent();
881881

882882
// At the end destroy virtual base objects.
883-
for (CXXRecordDecl::base_class_const_iterator VI = RD->vbases_begin(),
884-
VE = RD->vbases_end(); VI != VE; ++VI) {
885-
const CXXRecordDecl *CD = VI->getType()->getAsCXXRecordDecl();
883+
for (const auto &VI : RD->vbases()) {
884+
const CXXRecordDecl *CD = VI.getType()->getAsCXXRecordDecl();
886885
if (!CD->hasTrivialDestructor()) {
887886
autoCreateBlock();
888-
appendBaseDtor(Block, VI);
887+
appendBaseDtor(Block, &VI);
889888
}
890889
}
891890

Diff for: lib/CodeGen/CGClass.cpp

+3-8
Original file line numberDiff line numberDiff line change
@@ -1213,11 +1213,9 @@ HasTrivialDestructorBody(ASTContext &Context,
12131213

12141214
if (BaseClassDecl == MostDerivedClassDecl) {
12151215
// Check virtual bases.
1216-
for (CXXRecordDecl::base_class_const_iterator I =
1217-
BaseClassDecl->vbases_begin(), E = BaseClassDecl->vbases_end();
1218-
I != E; ++I) {
1216+
for (const auto &I : BaseClassDecl->vbases()) {
12191217
const CXXRecordDecl *VirtualBase =
1220-
cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
1218+
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
12211219
if (!HasTrivialDestructorBody(Context, VirtualBase,
12221220
MostDerivedClassDecl))
12231221
return false;
@@ -1460,10 +1458,7 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD,
14601458

14611459
// We push them in the forward order so that they'll be popped in
14621460
// the reverse order.
1463-
for (CXXRecordDecl::base_class_const_iterator I =
1464-
ClassDecl->vbases_begin(), E = ClassDecl->vbases_end();
1465-
I != E; ++I) {
1466-
const CXXBaseSpecifier &Base = *I;
1461+
for (const auto &Base : ClassDecl->vbases()) {
14671462
CXXRecordDecl *BaseClassDecl
14681463
= cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
14691464

Diff for: lib/CodeGen/CGExprConstant.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1372,10 +1372,9 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
13721372

13731373
// Fill in the virtual bases, if we're working with the complete object.
13741374
if (asCompleteObject) {
1375-
for (CXXRecordDecl::base_class_const_iterator
1376-
I = record->vbases_begin(), E = record->vbases_end(); I != E; ++I) {
1375+
for (const auto &I : record->vbases()) {
13771376
const CXXRecordDecl *base =
1378-
cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl());
1377+
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
13791378

13801379
// Ignore empty bases.
13811380
if (base->isEmpty())

Diff for: lib/CodeGen/CGRecordLayoutBuilder.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,8 @@ void CGRecordLowering::accumulateVPtrs() {
442442
void CGRecordLowering::accumulateVBases() {
443443
Members.push_back(MemberInfo(Layout.getNonVirtualSize(),
444444
MemberInfo::Scissor, 0, RD));
445-
for (CXXRecordDecl::base_class_const_iterator Base = RD->vbases_begin(),
446-
BaseEnd = RD->vbases_end();
447-
Base != BaseEnd; ++Base) {
448-
const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl();
445+
for (const auto &Base : RD->vbases()) {
446+
const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
449447
if (BaseDecl->isEmpty())
450448
continue;
451449
CharUnits Offset = Layout.getVBaseClassOffset(BaseDecl);

Diff for: lib/CodeGen/MicrosoftCXXABI.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -1118,10 +1118,8 @@ void MicrosoftCXXABI::emitVBTableDefinition(const VPtrInfo &VBT,
11181118
Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity());
11191119

11201120
MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
1121-
for (CXXRecordDecl::base_class_const_iterator I = ReusingBase->vbases_begin(),
1122-
E = ReusingBase->vbases_end();
1123-
I != E; ++I) {
1124-
const CXXRecordDecl *VBase = I->getType()->getAsCXXRecordDecl();
1121+
for (const auto &I : ReusingBase->vbases()) {
1122+
const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl();
11251123
CharUnits Offset = DerivedLayout.getVBaseClassOffset(VBase);
11261124
assert(!Offset.isNegative());
11271125

Diff for: lib/Sema/SemaCodeComplete.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -4266,21 +4266,19 @@ void Sema::CodeCompleteConstructorInitializer(
42664266
}
42674267

42684268
// Add completions for virtual base classes.
4269-
for (CXXRecordDecl::base_class_iterator Base = ClassDecl->vbases_begin(),
4270-
BaseEnd = ClassDecl->vbases_end();
4271-
Base != BaseEnd; ++Base) {
4272-
if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {
4269+
for (const auto &Base : ClassDecl->vbases()) {
4270+
if (!InitializedBases.insert(Context.getCanonicalType(Base.getType()))) {
42734271
SawLastInitializer
42744272
= !Initializers.empty() &&
42754273
Initializers.back()->isBaseInitializer() &&
4276-
Context.hasSameUnqualifiedType(Base->getType(),
4274+
Context.hasSameUnqualifiedType(Base.getType(),
42774275
QualType(Initializers.back()->getBaseClass(), 0));
42784276
continue;
42794277
}
42804278

42814279
Builder.AddTypedTextChunk(
42824280
Builder.getAllocator().CopyString(
4283-
Base->getType().getAsString(Policy)));
4281+
Base.getType().getAsString(Policy)));
42844282
Builder.AddChunk(CodeCompletionString::CK_LeftParen);
42854283
Builder.AddPlaceholderChunk("args");
42864284
Builder.AddChunk(CodeCompletionString::CK_RightParen);

0 commit comments

Comments
 (0)