@@ -171,38 +171,39 @@ static void initBase(Block *B, std::byte *Ptr, bool IsConst, bool IsMutable,
171
171
unsigned FieldOffset, bool IsVirtualBase) {
172
172
assert (D);
173
173
assert (D->ElemRecord );
174
+ assert (!D->ElemRecord ->isUnion ()); // Unions cannot be base classes.
174
175
175
- bool IsUnion = D->ElemRecord ->isUnion ();
176
176
auto *Desc = reinterpret_cast <InlineDescriptor *>(Ptr + FieldOffset) - 1 ;
177
177
Desc->Offset = FieldOffset;
178
178
Desc->Desc = D;
179
179
Desc->IsInitialized = D->IsArray ;
180
180
Desc->IsBase = true ;
181
181
Desc->IsVirtualBase = IsVirtualBase;
182
- Desc->IsActive = IsActive && !IsUnion ;
182
+ Desc->IsActive = IsActive && !InUnion ;
183
183
Desc->IsConst = IsConst || D->IsConst ;
184
184
Desc->IsFieldMutable = IsMutable || D->IsMutable ;
185
+ Desc->InUnion = InUnion;
185
186
186
187
for (const auto &V : D->ElemRecord ->bases ())
187
188
initBase (B, Ptr + FieldOffset, IsConst, IsMutable, IsActive, InUnion,
188
189
V.Desc , V.Offset , false );
189
190
for (const auto &F : D->ElemRecord ->fields ())
190
191
initField (B, Ptr + FieldOffset, IsConst, IsMutable, IsActive, InUnion,
191
- IsUnion , F.Desc , F.Offset );
192
+ InUnion , F.Desc , F.Offset );
192
193
}
193
194
194
195
static void ctorRecord (Block *B, std::byte *Ptr, bool IsConst, bool IsMutable,
195
196
bool IsActive, bool InUnion, const Descriptor *D) {
196
197
for (const auto &V : D->ElemRecord ->bases ())
197
- initBase (B, Ptr, IsConst, IsMutable, IsActive, false , V.Desc , V.Offset ,
198
+ initBase (B, Ptr, IsConst, IsMutable, IsActive, InUnion , V.Desc , V.Offset ,
198
199
false );
199
200
for (const auto &F : D->ElemRecord ->fields ()) {
200
201
bool IsUnionField = D->isUnion ();
201
202
initField (B, Ptr, IsConst, IsMutable, IsActive, IsUnionField,
202
203
InUnion || IsUnionField, F.Desc , F.Offset );
203
204
}
204
205
for (const auto &V : D->ElemRecord ->virtual_bases ())
205
- initBase (B, Ptr, IsConst, IsMutable, IsActive, false , V.Desc , V.Offset ,
206
+ initBase (B, Ptr, IsConst, IsMutable, IsActive, InUnion , V.Desc , V.Offset ,
206
207
true );
207
208
}
208
209
0 commit comments