@@ -1521,11 +1521,11 @@ void CXXRecordDecl::setCaptures(ASTContext &Context,
1521
1521
auto *ToCapture = (LambdaCapture *)Context.Allocate (sizeof (LambdaCapture) *
1522
1522
Captures.size ());
1523
1523
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 ())
1526
1526
++Data.NumExplicitCaptures ;
1527
1527
1528
- new (ToCapture) LambdaCapture (Captures[I] );
1528
+ new (ToCapture) LambdaCapture (C );
1529
1529
ToCapture++;
1530
1530
}
1531
1531
@@ -2056,40 +2056,39 @@ void CXXRecordDecl::completeDefinition() {
2056
2056
completeDefinition (nullptr );
2057
2057
}
2058
2058
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
+
2059
2080
void CXXRecordDecl::completeDefinition (CXXFinalOverriderMap *FinalOverriders) {
2060
2081
RecordDecl::completeDefinition ();
2061
2082
2062
2083
// If the class may be abstract (but hasn't been marked as such), check for
2063
2084
// 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 ();
2093
2092
2094
2093
// Set access bits correctly on the directly-declared conversions.
2095
2094
for (conversion_iterator I = conversion_begin (), E = conversion_end ();
0 commit comments