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 
20*974c2f5eSRaphael 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 :-(
39*974c2f5eSRaphael Isemann     friend struct BitfieldsInStructInUnion;
4099451b44SJordan Rupprecht   };
4199451b44SJordan Rupprecht 
4299451b44SJordan Rupprecht   union {
4399451b44SJordan Rupprecht     struct fields f;
4499451b44SJordan Rupprecht   };
4599451b44SJordan Rupprecht 
46*974c2f5eSRaphael 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   }
59*974c2f5eSRaphael Isemann } bitfields_in_struct_in_union;
6099451b44SJordan Rupprecht 
61*974c2f5eSRaphael Isemann class Base {
6200c8120aSshafik public:
6300c8120aSshafik   uint32_t b_a;
6400c8120aSshafik };
6500c8120aSshafik 
66*974c2f5eSRaphael Isemann class Derived : public Base {
6700c8120aSshafik public:
6800c8120aSshafik   uint32_t d_a : 1;
6900c8120aSshafik } derived;
7000c8120aSshafik 
71*974c2f5eSRaphael 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 
78*974c2f5eSRaphael Isemann union UnionWithUnnamedBitfield {
79bae9aedbSshafik   unsigned int : 16, a : 24;
80bae9aedbSshafik   unsigned int x;
81bae9aedbSshafik } uwubf;
82bae9aedbSshafik 
83*974c2f5eSRaphael Isemann struct BoolBits {
84*974c2f5eSRaphael Isemann   bool a : 1;
85*974c2f5eSRaphael Isemann   bool b : 1;
86*974c2f5eSRaphael Isemann   bool c : 2;
87*974c2f5eSRaphael Isemann   bool d : 2;
88*974c2f5eSRaphael Isemann };
89*974c2f5eSRaphael Isemann 
90*974c2f5eSRaphael Isemann struct WithVTable {
91*974c2f5eSRaphael Isemann   virtual ~WithVTable() {}
92*974c2f5eSRaphael Isemann   unsigned a : 4;
93*974c2f5eSRaphael Isemann   unsigned b : 4;
94*974c2f5eSRaphael Isemann   unsigned c : 4;
95*974c2f5eSRaphael Isemann };
96*974c2f5eSRaphael Isemann WithVTable with_vtable;
97*974c2f5eSRaphael Isemann 
98*974c2f5eSRaphael Isemann struct WithVTableAndUnnamed {
99*974c2f5eSRaphael Isemann   virtual ~WithVTableAndUnnamed() {}
100*974c2f5eSRaphael Isemann   unsigned a : 4;
101*974c2f5eSRaphael Isemann   unsigned b : 4;
102*974c2f5eSRaphael Isemann   unsigned c : 4;
103*974c2f5eSRaphael Isemann };
104*974c2f5eSRaphael Isemann WithVTableAndUnnamed with_vtable_and_unnamed;
105*974c2f5eSRaphael Isemann 
106*974c2f5eSRaphael Isemann struct BaseWithVTable {
107*974c2f5eSRaphael Isemann   virtual ~BaseWithVTable() {}
108*974c2f5eSRaphael Isemann };
109*974c2f5eSRaphael Isemann struct HasBaseWithVTable : BaseWithVTable {
110*974c2f5eSRaphael Isemann   unsigned a : 4;
111*974c2f5eSRaphael Isemann   unsigned b : 4;
112*974c2f5eSRaphael Isemann   unsigned c : 4;
113*974c2f5eSRaphael Isemann };
114*974c2f5eSRaphael Isemann HasBaseWithVTable base_with_vtable;
115*974c2f5eSRaphael Isemann 
116*974c2f5eSRaphael Isemann int main(int argc, char const *argv[]) {
11799451b44SJordan Rupprecht   lba.a = 2;
11899451b44SJordan Rupprecht 
11999451b44SJordan Rupprecht   lbb.a = 1;
12099451b44SJordan Rupprecht   lbb.b = 3;
12199451b44SJordan Rupprecht 
12299451b44SJordan Rupprecht   lbc.a = 1;
12399451b44SJordan Rupprecht   lbc.b = 0;
12499451b44SJordan Rupprecht   lbc.c = 4;
12599451b44SJordan Rupprecht   lbc.d = 1;
12699451b44SJordan Rupprecht   lbc.e = 20;
12799451b44SJordan Rupprecht 
12899451b44SJordan Rupprecht   lbd.arr[0] = 'a';
12999451b44SJordan Rupprecht   lbd.arr[1] = 'b';
13099451b44SJordan Rupprecht   lbd.arr[2] = '\0';
13199451b44SJordan Rupprecht   lbd.a = 5;
13299451b44SJordan Rupprecht 
13300c8120aSshafik   derived.b_a = 2;
13400c8120aSshafik   derived.d_a = 1;
13599451b44SJordan Rupprecht 
136bae9aedbSshafik   uwbf.x = 0xFFFFFFFF;
137bae9aedbSshafik   uwubf.x = 0xFFFFFFFF;
138bae9aedbSshafik 
139*974c2f5eSRaphael Isemann   BoolBits bb;
1400bab7b26SAndy Yankovsky   bb.a = 0b1;
1410bab7b26SAndy Yankovsky   bb.b = 0b0;
1420bab7b26SAndy Yankovsky   bb.c = 0b11;
1430bab7b26SAndy Yankovsky   bb.d = 0b01;
1440bab7b26SAndy Yankovsky 
145*974c2f5eSRaphael Isemann   with_vtable.a = 5;
146*974c2f5eSRaphael Isemann   with_vtable.b = 0;
147*974c2f5eSRaphael Isemann   with_vtable.c = 5;
148*974c2f5eSRaphael Isemann 
149*974c2f5eSRaphael Isemann   with_vtable_and_unnamed.a = 5;
150*974c2f5eSRaphael Isemann   with_vtable_and_unnamed.b = 0;
151*974c2f5eSRaphael Isemann   with_vtable_and_unnamed.c = 5;
152*974c2f5eSRaphael Isemann 
153*974c2f5eSRaphael Isemann   base_with_vtable.a = 5;
154*974c2f5eSRaphael Isemann   base_with_vtable.b = 0;
155*974c2f5eSRaphael Isemann   base_with_vtable.c = 5;
156*974c2f5eSRaphael Isemann 
157*974c2f5eSRaphael Isemann   return 0; // break here
15899451b44SJordan Rupprecht }
159