1 // RUN: %clang --target=x86_64-apple-macosx -c -gdwarf -o %t %s 2 // RUN: %lldb %t \ 3 // RUN: -o "target var global" \ 4 // RUN: -o "target var global2" \ 5 // RUN: -o "target var global3" \ 6 // RUN: -o "target var global4" \ 7 // RUN: -o "target var global5" \ 8 // RUN: -o "image dump ast" \ 9 // RUN: -o exit | FileCheck %s 10 11 // CHECK: (lldb) image dump ast 12 // CHECK: CXXRecordDecl {{.*}} struct Foo definition 13 // CHECK: |-FieldDecl {{.*}} data 'char[5]' 14 // CHECK-NEXT: |-FieldDecl {{.*}} padding 'Empty' 15 // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' 16 // CHECK-NEXT: `-ConstantExpr {{.*}} 17 // CHECK-NEXT: |-value: Int 1 18 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 19 20 struct Empty {}; 21 struct Empty2 {}; 22 struct Empty3 {}; 23 24 struct Foo { 25 char data[5]; 26 [[no_unique_address]] Empty padding; 27 unsigned long flag : 1; 28 }; 29 30 Foo global; 31 32 // CHECK: CXXRecordDecl {{.*}} struct ConsecutiveOverlap definition 33 // CHECK: |-FieldDecl {{.*}} data 'char[5]' 34 // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' 35 // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' 36 // CHECK-NEXT: |-FieldDecl {{.*}} p3 'Empty3' 37 // CHECK-NEXT: `-FieldDecl {{.*}} flag 'unsigned long' 38 // CHECK-NEXT: `-ConstantExpr {{.*}} 39 // CHECK-NEXT: |-value: Int 1 40 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 41 42 struct ConsecutiveOverlap { 43 char data[5]; 44 [[no_unique_address]] Empty p1; 45 [[no_unique_address]] Empty2 p2; 46 [[no_unique_address]] Empty3 p3; 47 unsigned long flag : 1; 48 }; 49 50 ConsecutiveOverlap global2; 51 52 // FIXME: we fail to deduce the unnamed bitfields here. 53 // 54 // CHECK: CXXRecordDecl {{.*}} struct MultipleAtOffsetZero definition 55 // CHECK: |-FieldDecl {{.*}} data 'char[5]' 56 // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' 57 // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' 58 // CHECK-NEXT: | `-ConstantExpr {{.*}} 59 // CHECK-NEXT: | |-value: Int 1 60 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 61 // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty2' 62 // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' 63 // CHECK-NEXT: | `-ConstantExpr {{.*}} 64 // CHECK-NEXT: | |-value: Int 1 65 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 66 67 struct MultipleAtOffsetZero { 68 char data[5]; 69 [[no_unique_address]] Empty p1; 70 int : 4; 71 unsigned long f1 : 1; 72 [[no_unique_address]] Empty2 p2; 73 int : 4; 74 unsigned long f2 : 1; 75 }; 76 77 MultipleAtOffsetZero global3; 78 79 // FIXME: we fail to deduce the unnamed bitfields here. 80 // 81 // CHECK: CXXRecordDecl {{.*}} struct MultipleEmpty definition 82 // CHECK: |-FieldDecl {{.*}} data 'char[5]' 83 // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' 84 // CHECK-NEXT: |-FieldDecl {{.*}} f1 'unsigned long' 85 // CHECK-NEXT: | `-ConstantExpr {{.*}} 86 // CHECK-NEXT: | |-value: Int 1 87 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 88 // CHECK-NEXT: |-FieldDecl {{.*}} p2 'Empty' 89 // CHECK-NEXT: `-FieldDecl {{.*}} f2 'unsigned long' 90 // CHECK-NEXT: | `-ConstantExpr {{.*}} 91 // CHECK-NEXT: | |-value: Int 1 92 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1 93 94 struct MultipleEmpty { 95 char data[5]; 96 [[no_unique_address]] Empty p1; 97 int : 4; 98 unsigned long f1 : 1; 99 [[no_unique_address]] Empty p2; 100 int : 4; 101 unsigned long f2 : 1; 102 }; 103 104 MultipleEmpty global4; 105 106 // CHECK: CXXRecordDecl {{.*}} struct FieldBitfieldOverlap definition 107 // CHECK: |-FieldDecl {{.*}} a 'int' 108 // CHECK-NEXT: | `-ConstantExpr {{.*}} 109 // CHECK-NEXT: | |-value: Int 3 110 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 3 111 // CHECK-NEXT: |-FieldDecl {{.*}} p1 'Empty' 112 // CHECK-NEXT: |-FieldDecl {{.*}} b 'int' 113 // CHECK-NEXT: | `-ConstantExpr {{.*}} 114 // CHECK-NEXT: | |-value: Int 6 115 // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 6 116 // CHECK-NEXT: `-FieldDecl {{.*}} c 'int' 117 // CHECK-NEXT: `-ConstantExpr {{.*}} 118 // CHECK-NEXT: |-value: Int 1 119 // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 120 121 struct FieldBitfieldOverlap { 122 int a : 3; 123 [[no_unique_address]] Empty p1; 124 int b : 6; 125 int c : 1; 126 }; 127 128 FieldBitfieldOverlap global5; 129