xref: /llvm-project/lldb/test/API/lang/cpp/bitfields/main.cpp (revision 3c30f224005e3749c89e00592bd2a43aba2aaf75)
199451b44SJordan Rupprecht #include <stdint.h>
299451b44SJordan Rupprecht 
399451b44SJordan Rupprecht struct LargeBitsA {
499451b44SJordan Rupprecht   unsigned int : 30, a : 20;
599451b44SJordan Rupprecht } lba;
699451b44SJordan Rupprecht 
799451b44SJordan Rupprecht struct LargeBitsB {
899451b44SJordan Rupprecht   unsigned int a : 1, : 11, : 12, b : 20;
999451b44SJordan Rupprecht } lbb;
1099451b44SJordan Rupprecht 
1199451b44SJordan Rupprecht struct LargeBitsC {
1299451b44SJordan Rupprecht   unsigned int : 13, : 9, a : 1, b : 1, c : 5, d : 1, e : 20;
1399451b44SJordan Rupprecht } lbc;
1499451b44SJordan Rupprecht 
1599451b44SJordan Rupprecht struct LargeBitsD {
1699451b44SJordan Rupprecht   char arr[3];
1799451b44SJordan Rupprecht   unsigned int : 30, a : 20;
1899451b44SJordan Rupprecht } lbd;
1999451b44SJordan Rupprecht 
20974c2f5eSRaphael Isemann struct BitfieldsInStructInUnion {
2199451b44SJordan Rupprecht   class fields {
2299451b44SJordan Rupprecht     uint64_t : 13;
2399451b44SJordan Rupprecht     uint64_t : 9;
2499451b44SJordan Rupprecht 
2599451b44SJordan Rupprecht     uint64_t a : 1;
2699451b44SJordan Rupprecht     uint64_t b : 1;
2799451b44SJordan Rupprecht     uint64_t c : 1;
2899451b44SJordan Rupprecht     uint64_t d : 1;
2999451b44SJordan Rupprecht     uint64_t e : 1;
3099451b44SJordan Rupprecht     uint64_t f : 1;
3199451b44SJordan Rupprecht     uint64_t g : 1;
3299451b44SJordan Rupprecht     uint64_t h : 1;
3399451b44SJordan Rupprecht     uint64_t i : 1;
3499451b44SJordan Rupprecht     uint64_t j : 1;
3599451b44SJordan Rupprecht     uint64_t k : 1;
3699451b44SJordan Rupprecht 
3799451b44SJordan Rupprecht     // In order to reproduce the crash for this case we need the
3899451b44SJordan Rupprecht     // members of fields to stay private :-(
39974c2f5eSRaphael Isemann     friend struct BitfieldsInStructInUnion;
4099451b44SJordan Rupprecht   };
4199451b44SJordan Rupprecht 
4299451b44SJordan Rupprecht   union {
4399451b44SJordan Rupprecht     struct fields f;
4499451b44SJordan Rupprecht   };
4599451b44SJordan Rupprecht 
BitfieldsInStructInUnionBitfieldsInStructInUnion46974c2f5eSRaphael Isemann   BitfieldsInStructInUnion() {
4799451b44SJordan Rupprecht     f.a = 1;
4899451b44SJordan Rupprecht     f.b = 0;
4999451b44SJordan Rupprecht     f.c = 1;
5099451b44SJordan Rupprecht     f.d = 0;
5199451b44SJordan Rupprecht     f.e = 1;
5299451b44SJordan Rupprecht     f.f = 0;
5399451b44SJordan Rupprecht     f.g = 1;
5499451b44SJordan Rupprecht     f.h = 0;
5599451b44SJordan Rupprecht     f.i = 1;
5699451b44SJordan Rupprecht     f.j = 0;
5799451b44SJordan Rupprecht     f.k = 1;
5899451b44SJordan Rupprecht   }
59974c2f5eSRaphael Isemann } bitfields_in_struct_in_union;
6099451b44SJordan Rupprecht 
61974c2f5eSRaphael Isemann class Base {
6200c8120aSshafik public:
6300c8120aSshafik   uint32_t b_a;
6400c8120aSshafik };
6500c8120aSshafik 
66974c2f5eSRaphael Isemann class Derived : public Base {
6700c8120aSshafik public:
6800c8120aSshafik   uint32_t d_a : 1;
6900c8120aSshafik } derived;
7000c8120aSshafik 
71974c2f5eSRaphael Isemann union UnionWithBitfields {
72bae9aedbSshafik   unsigned int a : 8;
73bae9aedbSshafik   unsigned int b : 16;
74bae9aedbSshafik   unsigned int c : 32;
75bae9aedbSshafik   unsigned int x;
76bae9aedbSshafik } uwbf;
77bae9aedbSshafik 
78974c2f5eSRaphael Isemann union UnionWithUnnamedBitfield {
79bae9aedbSshafik   unsigned int : 16, a : 24;
80bae9aedbSshafik   unsigned int x;
81bae9aedbSshafik } uwubf;
82bae9aedbSshafik 
83974c2f5eSRaphael Isemann struct BoolBits {
84974c2f5eSRaphael Isemann   bool a : 1;
85974c2f5eSRaphael Isemann   bool b : 1;
86974c2f5eSRaphael Isemann   bool c : 2;
87974c2f5eSRaphael Isemann   bool d : 2;
88974c2f5eSRaphael Isemann };
89974c2f5eSRaphael Isemann 
90974c2f5eSRaphael Isemann struct WithVTable {
~WithVTableWithVTable91974c2f5eSRaphael Isemann   virtual ~WithVTable() {}
92974c2f5eSRaphael Isemann   unsigned a : 4;
93974c2f5eSRaphael Isemann   unsigned b : 4;
94974c2f5eSRaphael Isemann   unsigned c : 4;
95974c2f5eSRaphael Isemann };
96974c2f5eSRaphael Isemann WithVTable with_vtable;
97974c2f5eSRaphael Isemann 
98974c2f5eSRaphael Isemann struct WithVTableAndUnnamed {
~WithVTableAndUnnamedWithVTableAndUnnamed99974c2f5eSRaphael Isemann   virtual ~WithVTableAndUnnamed() {}
100e2ede171SRaphael Isemann   unsigned : 4;
101974c2f5eSRaphael Isemann   unsigned b : 4;
102974c2f5eSRaphael Isemann   unsigned c : 4;
103974c2f5eSRaphael Isemann };
104974c2f5eSRaphael Isemann WithVTableAndUnnamed with_vtable_and_unnamed;
105974c2f5eSRaphael Isemann 
106974c2f5eSRaphael Isemann struct BaseWithVTable {
~BaseWithVTableBaseWithVTable107974c2f5eSRaphael Isemann   virtual ~BaseWithVTable() {}
108974c2f5eSRaphael Isemann };
109974c2f5eSRaphael Isemann struct HasBaseWithVTable : BaseWithVTable {
110974c2f5eSRaphael Isemann   unsigned a : 4;
111974c2f5eSRaphael Isemann   unsigned b : 4;
112974c2f5eSRaphael Isemann   unsigned c : 4;
113974c2f5eSRaphael Isemann };
114974c2f5eSRaphael Isemann HasBaseWithVTable base_with_vtable;
115974c2f5eSRaphael Isemann 
116*3c30f224SMichael Buch struct DerivedWithVTable : public Base {
~DerivedWithVTableDerivedWithVTable117*3c30f224SMichael Buch   virtual ~DerivedWithVTable() {}
118*3c30f224SMichael Buch   unsigned a : 1;
119*3c30f224SMichael Buch };
120*3c30f224SMichael Buch DerivedWithVTable derived_with_vtable;
121*3c30f224SMichael Buch 
main(int argc,char const * argv[])122974c2f5eSRaphael Isemann int main(int argc, char const *argv[]) {
12399451b44SJordan Rupprecht   lba.a = 2;
12499451b44SJordan Rupprecht 
12599451b44SJordan Rupprecht   lbb.a = 1;
12699451b44SJordan Rupprecht   lbb.b = 3;
12799451b44SJordan Rupprecht 
12899451b44SJordan Rupprecht   lbc.a = 1;
12999451b44SJordan Rupprecht   lbc.b = 0;
13099451b44SJordan Rupprecht   lbc.c = 4;
13199451b44SJordan Rupprecht   lbc.d = 1;
13299451b44SJordan Rupprecht   lbc.e = 20;
13399451b44SJordan Rupprecht 
13499451b44SJordan Rupprecht   lbd.arr[0] = 'a';
13599451b44SJordan Rupprecht   lbd.arr[1] = 'b';
13699451b44SJordan Rupprecht   lbd.arr[2] = '\0';
13799451b44SJordan Rupprecht   lbd.a = 5;
13899451b44SJordan Rupprecht 
13900c8120aSshafik   derived.b_a = 2;
14000c8120aSshafik   derived.d_a = 1;
14199451b44SJordan Rupprecht 
142bae9aedbSshafik   uwbf.x = 0xFFFFFFFF;
143bae9aedbSshafik   uwubf.x = 0xFFFFFFFF;
144bae9aedbSshafik 
145974c2f5eSRaphael Isemann   BoolBits bb;
1460bab7b26SAndy Yankovsky   bb.a = 0b1;
1470bab7b26SAndy Yankovsky   bb.b = 0b0;
1480bab7b26SAndy Yankovsky   bb.c = 0b11;
1490bab7b26SAndy Yankovsky   bb.d = 0b01;
1500bab7b26SAndy Yankovsky 
151974c2f5eSRaphael Isemann   with_vtable.a = 5;
152974c2f5eSRaphael Isemann   with_vtable.b = 0;
153974c2f5eSRaphael Isemann   with_vtable.c = 5;
154974c2f5eSRaphael Isemann 
155974c2f5eSRaphael Isemann   with_vtable_and_unnamed.b = 0;
156974c2f5eSRaphael Isemann   with_vtable_and_unnamed.c = 5;
157974c2f5eSRaphael Isemann 
158974c2f5eSRaphael Isemann   base_with_vtable.a = 5;
159974c2f5eSRaphael Isemann   base_with_vtable.b = 0;
160974c2f5eSRaphael Isemann   base_with_vtable.c = 5;
161974c2f5eSRaphael Isemann 
162*3c30f224SMichael Buch   derived_with_vtable.b_a = 2;
163*3c30f224SMichael Buch   derived_with_vtable.a = 1;
164*3c30f224SMichael Buch 
165974c2f5eSRaphael Isemann   return 0; // break here
16699451b44SJordan Rupprecht }
167