================
@@ -5459,31 +5462,53 @@ static bool handleDefaultInitValue(QualType T, APValue
&Result) {
Result = APValue((const FieldDecl *)nullptr);
return true;
}
- Result =
- APValue(APValue::UninitStruct(), RD->getNumBases(),
RD->getNumFields());
+
+ // bases() includes directly specified virtual bases as well.
+ unsigned NonVirtualBases =
+ llvm::count_if(RD->bases(), [](auto &B) { return !B.isVirtual(); });
+ Result = APValue(APValue::UninitStruct(), NonVirtualBases,
+ RD->getNumFields(), Toplevel ? RD->getNumVBases() : 0);
unsigned Index = 0;
- for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
+ for (CXXRecordDecl::base_class_const_iterator B = RD->bases_begin(),
End = RD->bases_end();
- I != End; ++I, ++Index)
- Success &=
- handleDefaultInitValue(I->getType(), Result.getStructBase(Index));
+ B != End; ++B) {
+ if (B->isVirtual())
+ continue;
+ Success &= handleDefaultInitValue(B->getType(),
+ Result.getStructBase(Index), false);
+ ++Index;
+ }
for (const auto *I : RD->fields()) {
if (I->isUnnamedBitField())
continue;
Success &= handleDefaultInitValue(
- I->getType(), Result.getStructField(I->getFieldIndex()));
+ I->getType(), Result.getStructField(I->getFieldIndex()), false);
----------------
efriedma-quic wrote:
Fields/array elements should be "toplevel" in the sense you care about here?
https://github.com/llvm/llvm-project/pull/204289
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits