130 lines · plain
1# REQUIRES: target-windows2 3# Test UDT layout reconstruction4# RUN: split-file %s %t5# RUN: %build --compiler=clang-cl -o %t.exe -- %t/main.cpp6# RUN: %lldb -f %t.exe -s %t/commands.input 2>&1 | FileCheck %s7 8#--- main.cpp9 10// this is from the DIA plugin (UdtLayoutTest.cpp)11struct A {12 explicit A(int u) { _u._u3 = u; }13 A(const A &) = default;14 virtual ~A() = default;15 16private:17 union U {18 char _u1;19 short _u2;20 int _u3;21 };22 23 A::U _u;24};25 26#pragma pack(push, 1)27template <int I> struct B : public virtual A {28 B(char a, unsigned short b, int c) : A(a + b + c), _a(a), _b(b), _c(c) {}29 30private:31 char _a;32 unsigned short : 3;33 unsigned short _b : 6;34 unsigned short : 4;35 int _c;36};37#pragma pack(pop)38 39#pragma pack(push, 16)40class C : private virtual B<0>, public virtual B<1>, private B<2>, public B<3> {41public:42 C(char x, char y, char z)43 : A(x - y + z), B<0>(x, y, z), B<1>(x * 2, y * 2, z * 2),44 B<2>(x * 3, y * 3, z * 3), B<3>(x * 4, y * 4, z * 4), _x(x * 5),45 _y(y * 5), _z(z * 5) {}46 47 static int abc;48 49private:50 int _x;51 short _y;52 char _z;53};54int C::abc = 123;55#pragma pack(pop)56 57class List {58public:59 List() = default;60 List(List *p, List *n, C v) : Prev(p), Next(n), Value(v) {}61 62private:63 List *Prev = nullptr;64 List *Next = nullptr;65 C Value{1, 2, 3};66};67 68int main() {69 List ls[16];70 return 0; // break here71}72 73#--- commands.input74 75settings set target.max-children-depth 1076br set -p "break here"77run78target variable79frame variable80quit81 82# CHECK: (int) ::C::abc = 12383 84# CHECK: (List[16]) ls = {85# CHECK: [15] = {86# CHECK-NEXT: Prev = nullptr87# CHECK-NEXT: Next = nullptr88# CHECK-NEXT: Value = {89# CHECK-NEXT: B<2> = {90# CHECK-NEXT: A = {91# CHECK-NEXT: _u = (_u1 = '\x02', _u2 = 2, _u3 = 2)92# CHECK-NEXT: }93# CHECK-NEXT: _a = '\x03'94# CHECK-NEXT: _b = 695# CHECK-NEXT: _c = 996# CHECK-NEXT: }97# CHECK-NEXT: B<3> = {98# CHECK-NEXT: A = {99# CHECK-NEXT: _u = (_u1 = '\x02', _u2 = 2, _u3 = 2)100# CHECK-NEXT: }101# CHECK-NEXT: _a = '\x04'102# CHECK-NEXT: _b = 8103# CHECK-NEXT: _c = 12104# CHECK-NEXT: }105# CHECK-NEXT: A = {106# CHECK-NEXT: _u = (_u1 = '\x02', _u2 = 2, _u3 = 2)107# CHECK-NEXT: }108# CHECK-NEXT: B<0> = {109# CHECK-NEXT: A = {110# CHECK-NEXT: _u = (_u1 = '\x02', _u2 = 2, _u3 = 2)111# CHECK-NEXT: }112# CHECK-NEXT: _a = '\x01'113# CHECK-NEXT: _b = 2114# CHECK-NEXT: _c = 3115# CHECK-NEXT: }116# CHECK-NEXT: B<1> = {117# CHECK-NEXT: A = {118# CHECK-NEXT: _u = (_u1 = '\x02', _u2 = 2, _u3 = 2)119# CHECK-NEXT: }120# CHECK-NEXT: _a = '\x02'121# CHECK-NEXT: _b = 4122# CHECK-NEXT: _c = 6123# CHECK-NEXT: }124# CHECK-NEXT: _x = 5125# CHECK-NEXT: _y = 10126# CHECK-NEXT: _z = '\x0f'127# CHECK-NEXT: }128# CHECK-NEXT: }129# CHECK-NEXT: }130