================
@@ -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

Reply via email to