================
@@ -2306,18 +2306,17 @@ MakeAddressPointIndices(const 
VTableLayout::AddressPointsMapTy &addressPoints,
   return indexMap;
 }
 
-VTableLayout::VTableLayout(ArrayRef<size_t> VTableIndices,
+VTableLayout::VTableLayout(VTableIndicesTy VTableIndices,
                            ArrayRef<VTableComponent> VTableComponents,
                            ArrayRef<VTableThunkTy> VTableThunks,
                            const AddressPointsMapTy &AddressPoints)
-    : VTableComponents(VTableComponents), VTableThunks(VTableThunks),
-      AddressPoints(AddressPoints), 
AddressPointIndices(MakeAddressPointIndices(
-                                        AddressPoints, VTableIndices.size())) {
-  if (VTableIndices.size() <= 1)
-    assert(VTableIndices.size() == 1 && VTableIndices[0] == 0);
-  else
-    this->VTableIndices = OwningArrayRef<size_t>(VTableIndices);
-
+    : VTableIndices(std::move(VTableIndices)),
+      VTableComponents(VTableComponents), VTableThunks(VTableThunks),
+      AddressPoints(AddressPoints),
+      AddressPointIndices(
+          MakeAddressPointIndices(AddressPoints, this->VTableIndices.size())) {
+  assert(!this->VTableIndices.empty() &&
+         "VTableLayout requires at least one index.");
----------------
davidstone wrote:

Good question. My understanding is that the old code asserted the contents 
because it was representing the set of indexes `{0}` as an empty set, so if 
that weren't the case we would theoretically have wrong data. Now that we just 
store the actual data passed in, that potential discrepancy is impossible. We 
still assert `!empty()` because other parts of the code assume you can at least 
index into the first element of the array so we would have undefined behavior 
if the size is not at least 1.

That being said, it is true that the first VTable index is 0, and you can prove 
that by looking at the code just in this file: the first index either comes 
from a manually defined set of `{0}` (line 3732) or from 
`ItaniumVTableBuilder::VTableIndices` (line 2417), which has 
`Components.size()` as its first element (line 1695), and `Components` is 
guaranteed to be empty the first time `LayoutPrimaryAndSecondaryVTables` is 
called. However, none of the code actually depends on this truth as far as I 
can tell (even though it would be really weird to have the first element at a 
different index!), and the original code didn't assert that the first index is 
always `0` for other sizes despite that being an identity that seems equally 
important regardless of the size of `VTableIndices`.

So we have three options here, as I see it:
1. Add the assertion back in for just the `size() == 1` case (to match the 
previous assertion)
2. Add an assert that the first index is always `0`, regardless of size (there 
isn't anything special about `size() == 1` anymore so it's kind of weird to 
assert only in that case)
3. Leave out the assertion since nothing appears to depend on it being true 
even though it is true

I don't have super strong feelings about any of these options.

https://github.com/llvm/llvm-project/pull/168768
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to