Skip to content

Commit a662750

Browse files
[Clang] [NFC] Use range-based for loops (#96831)
Use range-based for loops. In addition, extracted a loop from `CXXRecordDecl::completeDefinition` to eliminate the `Done` flag, and only construct `MyFinalOverriders` when `FinalOverriders` is null.
1 parent 154c8a0 commit a662750

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

clang/lib/AST/DeclCXX.cpp

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,11 +1521,11 @@ void CXXRecordDecl::setCaptures(ASTContext &Context,
15211521
auto *ToCapture = (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) *
15221522
Captures.size());
15231523
Data.AddCaptureList(Context, ToCapture);
1524-
for (unsigned I = 0, N = Captures.size(); I != N; ++I) {
1525-
if (Captures[I].isExplicit())
1524+
for (const LambdaCapture &C : Captures) {
1525+
if (C.isExplicit())
15261526
++Data.NumExplicitCaptures;
15271527

1528-
new (ToCapture) LambdaCapture(Captures[I]);
1528+
new (ToCapture) LambdaCapture(C);
15291529
ToCapture++;
15301530
}
15311531

@@ -2056,40 +2056,39 @@ void CXXRecordDecl::completeDefinition() {
20562056
completeDefinition(nullptr);
20572057
}
20582058

2059+
static bool hasPureVirtualFinalOverrider(
2060+
const CXXRecordDecl &RD, const CXXFinalOverriderMap *FinalOverriders) {
2061+
if (!FinalOverriders) {
2062+
CXXFinalOverriderMap MyFinalOverriders;
2063+
RD.getFinalOverriders(MyFinalOverriders);
2064+
return hasPureVirtualFinalOverrider(RD, &MyFinalOverriders);
2065+
}
2066+
2067+
for (const CXXFinalOverriderMap::value_type &
2068+
OverridingMethodsEntry : *FinalOverriders) {
2069+
for (const auto &[_, SubobjOverrides] : OverridingMethodsEntry.second) {
2070+
assert(SubobjOverrides.size() > 0 &&
2071+
"All virtual functions have overriding virtual functions");
2072+
2073+
if (SubobjOverrides.front().Method->isPureVirtual())
2074+
return true;
2075+
}
2076+
}
2077+
return false;
2078+
}
2079+
20592080
void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
20602081
RecordDecl::completeDefinition();
20612082

20622083
// If the class may be abstract (but hasn't been marked as such), check for
20632084
// any pure final overriders.
2064-
if (mayBeAbstract()) {
2065-
CXXFinalOverriderMap MyFinalOverriders;
2066-
if (!FinalOverriders) {
2067-
getFinalOverriders(MyFinalOverriders);
2068-
FinalOverriders = &MyFinalOverriders;
2069-
}
2070-
2071-
bool Done = false;
2072-
for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
2073-
MEnd = FinalOverriders->end();
2074-
M != MEnd && !Done; ++M) {
2075-
for (OverridingMethods::iterator SO = M->second.begin(),
2076-
SOEnd = M->second.end();
2077-
SO != SOEnd && !Done; ++SO) {
2078-
assert(SO->second.size() > 0 &&
2079-
"All virtual functions have overriding virtual functions");
2080-
2081-
// C++ [class.abstract]p4:
2082-
// A class is abstract if it contains or inherits at least one
2083-
// pure virtual function for which the final overrider is pure
2084-
// virtual.
2085-
if (SO->second.front().Method->isPureVirtual()) {
2086-
data().Abstract = true;
2087-
Done = true;
2088-
break;
2089-
}
2090-
}
2091-
}
2092-
}
2085+
//
2086+
// C++ [class.abstract]p4:
2087+
// A class is abstract if it contains or inherits at least one
2088+
// pure virtual function for which the final overrider is pure
2089+
// virtual.
2090+
if (mayBeAbstract() && hasPureVirtualFinalOverrider(*this, FinalOverriders))
2091+
markAbstract();
20932092

20942093
// Set access bits correctly on the directly-declared conversions.
20952094
for (conversion_iterator I = conversion_begin(), E = conversion_end();

0 commit comments

Comments
 (0)