// clang-format off
// REQUIRES: lld, x86
// Test various interesting cases for AST reconstruction.
// 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/bitfields.lldbinit 2>&1 | FileCheck %s
// Test trivial versions of each tag type.
struct Struct {
int A : 5 = 6;
int B : 7 = 8;
unsigned C : 3 = 2;
unsigned D : 15 = 12345;
char E : 1 = 0;
char F : 2 = 1;
char G : 3 = 2;
// H should be at offset 0 of a new byte.
char H : 3 = 3;
};
constexpr Struct TheStruct;
int main(int argc, char **argv) {
return TheStruct.A;
}
// CHECK: (lldb) target variable -T TheStruct
// CHECK: (const Struct) TheStruct = {
// CHECK: (int:5) A = 6
// CHECK: (int:7) B = 8
// CHECK: (unsigned int:3) C = 2
// CHECK: (unsigned int:15) D = 12345
// CHECK: (char:1) E = '\0'
// CHECK: (char:2) F = '\x01'
// CHECK: (char:3) G = '\x02'
// CHECK: (char:3) H = '\x03'
// CHECK: }
//
// CHECK: target modules dump ast
// CHECK: Dumping clang ast for 1 modules.
// CHECK: TranslationUnitDecl {{.*}}
// CHECK: |-CXXRecordDecl {{.*}} struct Struct definition
// CHECK: | |-FieldDecl {{.*}} A 'int'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 5
// CHECK: | |-FieldDecl {{.*}} B 'int'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 7
// CHECK: | |-FieldDecl {{.*}} C 'unsigned int'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3
// CHECK: | |-FieldDecl {{.*}} D 'unsigned int'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 15
// CHECK: | |-FieldDecl {{.*}} E 'char'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 1
// CHECK: | |-FieldDecl {{.*}} F 'char'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 2
// CHECK: | |-FieldDecl {{.*}} G 'char'
// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3
// CHECK: | `-FieldDecl {{.*}} H 'char'
// CHECK: | `-IntegerLiteral {{.*}} 'int' 3