Skip to content

Commit 8207a5f

Browse files
committed
fix: handle unions as well
1 parent 2e0b691 commit 8207a5f

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,12 +467,19 @@ void UdtRecordCompleter::Record::ConstructRecord() {
467467
if (iter->second.empty())
468468
continue;
469469

470-
// For structs, if the new fields come after the already added ones
471-
// without overlap, go back to the root struct.
472-
if (iter->first <= offset && record.kind == Member::Struct &&
473-
is_last_end_offset(iter))
474-
parent = &record;
475-
else {
470+
// If the new fields come after the already added ones
471+
// without overlap, go back to the root.
472+
if (iter->first <= offset && is_last_end_offset(iter)) {
473+
if (record.kind == Member::Struct)
474+
parent = &record;
475+
else {
476+
lldbassert(record.kind == Member::Union &&
477+
"Current record must be a union");
478+
lldbassert(!record.fields.empty());
479+
// For unions, append the field to the last struct
480+
parent = record.fields.back().get();
481+
}
482+
} else {
476483
parent = iter->second.back();
477484
iter->second.pop_back();
478485
}

lldb/unittests/SymbolFile/NativePDB/UdtRecordCompleterTests.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -275,24 +275,21 @@ TEST_F(UdtRecordCompleterRecordTests, TestNestedStructInUnionInStructInUnion) {
275275
// m4;
276276
// union {
277277
// m5;
278-
// struct {
279-
// m6;
280-
// m7;
281-
// };
278+
// m6;
282279
// };
280+
// m7;
283281
// };
284282
// };
285283
Record record;
286284
record.start_offset = 0;
287285
AddField(&record.record, "m1", 0, 4, Member::Field);
288286
AddField(&record.record, "m2", 0, 2, Member::Field);
289-
Member *s1 = AddField(&record.record, "", 0, 0, Member::Struct);
290-
AddField(s1, "m3", 0, 2, Member::Field);
291-
AddField(s1, "m4", 2, 4, Member::Field);
292-
Member *u1 = AddField(s1, "", 6, 0, Member::Union);
293-
AddField(u1, "m5", 6, 2, Member::Field);
294-
Member *s2 = AddField(u1, "", 0, 0, Member::Struct, 6);
295-
AddField(s2, "m6", 6, 2, Member::Field);
296-
AddField(s2, "m7", 8, 2, Member::Field);
287+
Member *s = AddField(&record.record, "", 0, 0, Member::Struct);
288+
AddField(s, "m3", 0, 2, Member::Field);
289+
AddField(s, "m4", 2, 4, Member::Field);
290+
Member *u = AddField(s, "", 6, 0, Member::Union);
291+
AddField(u, "m5", 6, 2, Member::Field);
292+
AddField(u, "m6", 6, 2, Member::Field);
293+
AddField(s, "m7", 8, 2, Member::Field);
297294
EXPECT_EQ(WrappedRecord(this->record), WrappedRecord(record));
298295
}

0 commit comments

Comments
 (0)