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