xref: /llvm-project/lldb/test/Shell/SymbolFile/DWARF/x86/no_unique_address-with-bitfields.cpp (revision cfe26358e3051755961fb1f3b46328dc2c326895)
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