// clang-format off // REQUIRES: lld, x86 // Make sure class layout is correct. // RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -c /Fo%t.obj -- %s // RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ // RUN: %p/Inputs/class_layout.lldbinit 2>&1 | FileCheck %s // CHECK: (lldb) expr a // CHECK-NEXT: (A) $0 = (d1 = 'a', d2 = 1, d3 = 2, d4 = 'b') // CHECK-NEXT: (lldb) expr b.c // CHECK-NEXT: (char) $1 = 'a' // CHECK-NEXT: (lldb) expr b.u.c // CHECK-NEXT: (char[2]) $2 = "b" // CHECK-NEXT: (lldb) expr b.u.i // CHECK-NEXT: (int) $3 = 98 // CHECK-NEXT: (lldb) expr c // CHECK-NEXT: (C) $4 = { // CHECK-NEXT: c = 'a' // CHECK-NEXT: x = 65 // CHECK-NEXT: = { // CHECK-NEXT: = { // CHECK-NEXT: c1 = 'b' // CHECK-NEXT: = { // CHECK-NEXT: = { // CHECK-NEXT: s3 = { // CHECK-NEXT: x = ([0] = 66, [1] = 67, [2] = 68) // CHECK-NEXT: } // CHECK-NEXT: c3 = 'c' // CHECK-NEXT: } // CHECK-NEXT: = { // CHECK-NEXT: c4 = 'B' // CHECK-NEXT: s4 = { // CHECK-NEXT: x = ([0] = 67, [1] = 68, [2] = 99) // CHECK-NEXT: } // CHECK-NEXT: s1 = { // CHECK-NEXT: x = ([0] = 69, [1] = 70, [2] = 71) // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: = { // CHECK-NEXT: s2 = { // CHECK-NEXT: x = ([0] = 98, [1] = 66, [2] = 67) // CHECK-NEXT: } // CHECK-NEXT: c2 = 'D' // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: (lldb) type lookup C // CHECK-NEXT: struct C { // CHECK-NEXT: char c; // CHECK-NEXT: int x; // CHECK-NEXT: union { // CHECK-NEXT: struct { // CHECK-NEXT: char c1; // CHECK-NEXT: union { // CHECK-NEXT: struct { // CHECK-NEXT: S3 s3; // CHECK-NEXT: char c3; // CHECK-NEXT: }; // CHECK-NEXT: struct { // CHECK-NEXT: char c4; // CHECK-NEXT: S3 s4; // CHECK-NEXT: S3 s1; // CHECK-NEXT: }; // CHECK-NEXT: }; // CHECK-NEXT: }; // CHECK-NEXT: struct { // CHECK-NEXT: S3 s2; // CHECK-NEXT: char c2; // CHECK-NEXT: }; // CHECK-NEXT: }; // CHECK-NEXT: } // Test packed stuct layout. struct __attribute__((packed, aligned(1))) A { char d1; int d2; int d3; char d4; }; struct __attribute__((packed, aligned(1))) B { char c; union { char c[2]; int i; } u; }; // Test struct layout with anonymous union/struct. struct S3 { short x[3]; }; struct C { char c; int x; union { struct { char c1; union { struct { S3 s3; char c3; }; struct { char c4; S3 s4; }; }; S3 s1; }; struct { S3 s2; char c2; }; }; }; A a = {'a', 1, 2, 'b'}; B b = {'a', {"b"}}; C c = {.c = 'a', .x = 65, .c1 = 'b', .s3 = {66, 67, 68}, .c3 = 'c', .s1={69, 70, 71}}; int main() { return 0; }