| // RUN: %clangxx --target=x86_64-apple-macosx -c -gdwarf -o %t %s | |
| // RUN: %lldb %t \ | |
| // RUN: -o "target var global" \ | |
| // RUN: -o "target var global2" \ | |
| // RUN: -o "target var global3" \ | |
| // RUN: -o "target var global4" \ | |
| // RUN: -o "target var global5" \ | |
| // RUN: -o "image dump ast" \ | |
| // RUN: -o exit | FileCheck %s | |
| // CHECK: (lldb) image dump ast | |
| // CHECK: CXXRecordDecl {{.*}} struct Foo definition | |
| // CHECK: |-FieldDecl {{.*}} data 'char[5]' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} padding 'Empty' | |
| // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' | |
| // CHECK-NEXT: `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: |-value: Int 1 | |
| // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 | |
| struct Empty {}; | |
| struct Empty2 {}; | |
| struct Empty3 {}; | |
| struct Foo { | |
| char data[5]; | |
| [[no_unique_address]] Empty padding; | |
| unsigned long flag : 1; | |
| }; | |
| Foo global; | |
| // CHECK: CXXRecordDecl {{.*}} struct ConsecutiveOverlap definition | |
| // CHECK: |-FieldDecl {{.*}} data 'char[5]' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p3 'Empty3' | |
| // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' | |
| // CHECK-NEXT: `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: |-value: Int 1 | |
| // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 | |
| struct ConsecutiveOverlap { | |
| char data[5]; | |
| [[no_unique_address]] Empty p1; | |
| [[no_unique_address]] Empty2 p2; | |
| [[no_unique_address]] Empty3 p3; | |
| unsigned long flag : 1; | |
| }; | |
| ConsecutiveOverlap global2; | |
| // FIXME: we fail to deduce the unnamed bitfields here. | |
| // | |
| // CHECK: CXXRecordDecl {{.*}} struct MultipleAtOffsetZero definition | |
| // CHECK: |-FieldDecl {{.*}} data 'char[5]' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 1 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' | |
| // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 1 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 | |
| struct MultipleAtOffsetZero { | |
| char data[5]; | |
| [[no_unique_address]] Empty p1; | |
| int : 4; | |
| unsigned long f1 : 1; | |
| [[no_unique_address]] Empty2 p2; | |
| int : 4; | |
| unsigned long f2 : 1; | |
| }; | |
| MultipleAtOffsetZero global3; | |
| // FIXME: we fail to deduce the unnamed bitfields here. | |
| // | |
| // CHECK: CXXRecordDecl {{.*}} struct MultipleEmpty definition | |
| // CHECK: |-FieldDecl {{.*}} data 'char[5]' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 1 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty' | |
| // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 1 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 | |
| struct MultipleEmpty { | |
| char data[5]; | |
| [[no_unique_address]] Empty p1; | |
| int : 4; | |
| unsigned long f1 : 1; | |
| [[no_unique_address]] Empty p2; | |
| int : 4; | |
| unsigned long f2 : 1; | |
| }; | |
| MultipleEmpty global4; | |
| // CHECK: CXXRecordDecl {{.*}} struct FieldBitfieldOverlap definition | |
| // CHECK: |-FieldDecl {{.*}} a 'int' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 3 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 3 | |
| // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' | |
| // CHECK-NEXT: |-FieldDecl {{.*}} b 'int' | |
| // CHECK-NEXT: | `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: | |-value: Int 6 | |
| // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 6 | |
| // CHECK-NEXT: `-FieldDecl {{.*}} c 'int' | |
| // CHECK-NEXT: `-ConstantExpr {{.*}} | |
| // CHECK-NEXT: |-value: Int 1 | |
| // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 | |
| struct FieldBitfieldOverlap { | |
| int a : 3; | |
| [[no_unique_address]] Empty p1; | |
| int b : 6; | |
| int c : 1; | |
| }; | |
| FieldBitfieldOverlap global5; |