199451b44SJordan Rupprecht #include <stdint.h>
299451b44SJordan Rupprecht 
399451b44SJordan Rupprecht int main(int argc, char const *argv[]) {
499451b44SJordan Rupprecht   struct LargeBitsA {
599451b44SJordan Rupprecht     unsigned int : 30, a : 20;
699451b44SJordan Rupprecht   } lba;
799451b44SJordan Rupprecht 
899451b44SJordan Rupprecht   struct LargeBitsB {
999451b44SJordan Rupprecht     unsigned int a : 1, : 11, : 12, b : 20;
1099451b44SJordan Rupprecht   } lbb;
1199451b44SJordan Rupprecht 
1299451b44SJordan Rupprecht   struct LargeBitsC {
1399451b44SJordan Rupprecht     unsigned int : 13, : 9, a : 1, b : 1, c : 5, d : 1, e : 20;
1499451b44SJordan Rupprecht   } lbc;
1599451b44SJordan Rupprecht 
1699451b44SJordan Rupprecht   struct LargeBitsD {
1799451b44SJordan Rupprecht     char arr[3];
1899451b44SJordan Rupprecht     unsigned int : 30, a : 20;
1999451b44SJordan Rupprecht   } lbd;
2099451b44SJordan Rupprecht 
2199451b44SJordan Rupprecht   // This case came up when debugging clang and models RecordDeclBits
2299451b44SJordan Rupprecht   struct BitExampleFromClangDeclContext {
2399451b44SJordan Rupprecht     class fields {
2499451b44SJordan Rupprecht       uint64_t : 13;
2599451b44SJordan Rupprecht       uint64_t : 9;
2699451b44SJordan Rupprecht 
2799451b44SJordan Rupprecht       uint64_t a: 1;
2899451b44SJordan Rupprecht       uint64_t b: 1;
2999451b44SJordan Rupprecht       uint64_t c: 1;
3099451b44SJordan Rupprecht       uint64_t d: 1;
3199451b44SJordan Rupprecht       uint64_t e: 1;
3299451b44SJordan Rupprecht       uint64_t f: 1;
3399451b44SJordan Rupprecht       uint64_t g: 1;
3499451b44SJordan Rupprecht       uint64_t h: 1;
3599451b44SJordan Rupprecht       uint64_t i: 1;
3699451b44SJordan Rupprecht       uint64_t j: 1;
3799451b44SJordan Rupprecht       uint64_t k: 1;
3899451b44SJordan Rupprecht 
3999451b44SJordan Rupprecht       // In order to reproduce the crash for this case we need the
4099451b44SJordan Rupprecht       // members of fields to stay private :-(
4199451b44SJordan Rupprecht       friend struct BitExampleFromClangDeclContext;
4299451b44SJordan Rupprecht     };
4399451b44SJordan Rupprecht 
4499451b44SJordan Rupprecht     union {
4599451b44SJordan Rupprecht       struct fields f;
4699451b44SJordan Rupprecht     };
4799451b44SJordan Rupprecht 
4899451b44SJordan Rupprecht     BitExampleFromClangDeclContext() {
4999451b44SJordan Rupprecht   f.a = 1;
5099451b44SJordan Rupprecht   f.b = 0;
5199451b44SJordan Rupprecht   f.c = 1;
5299451b44SJordan Rupprecht   f.d = 0;
5399451b44SJordan Rupprecht   f.e = 1;
5499451b44SJordan Rupprecht   f.f = 0;
5599451b44SJordan Rupprecht   f.g = 1;
5699451b44SJordan Rupprecht   f.h = 0;
5799451b44SJordan Rupprecht   f.i = 1;
5899451b44SJordan Rupprecht   f.j = 0;
5999451b44SJordan Rupprecht   f.k = 1;
6099451b44SJordan Rupprecht     }
6199451b44SJordan Rupprecht   } clang_example;
6299451b44SJordan Rupprecht 
6300c8120aSshafik   class B {
6400c8120aSshafik   public:
6500c8120aSshafik     uint32_t b_a;
6600c8120aSshafik   };
6700c8120aSshafik 
6800c8120aSshafik   class D : public B {
6900c8120aSshafik   public:
7000c8120aSshafik     uint32_t d_a : 1;
7100c8120aSshafik   } derived;
7200c8120aSshafik 
73*bae9aedbSshafik   union union_with_bitfields {
74*bae9aedbSshafik       unsigned int a : 8;
75*bae9aedbSshafik       unsigned int b : 16;
76*bae9aedbSshafik       unsigned int c : 32;
77*bae9aedbSshafik       unsigned int x;
78*bae9aedbSshafik   } uwbf;
79*bae9aedbSshafik 
80*bae9aedbSshafik   union union_with_unnamed_bitfield {
81*bae9aedbSshafik    unsigned int : 16, a : 24;
82*bae9aedbSshafik    unsigned int x;
83*bae9aedbSshafik   } uwubf;
84*bae9aedbSshafik 
8599451b44SJordan Rupprecht   lba.a = 2;
8699451b44SJordan Rupprecht 
8799451b44SJordan Rupprecht   lbb.a = 1;
8899451b44SJordan Rupprecht   lbb.b = 3;
8999451b44SJordan Rupprecht 
9099451b44SJordan Rupprecht   lbc.a = 1;
9199451b44SJordan Rupprecht   lbc.b = 0;
9299451b44SJordan Rupprecht   lbc.c = 4;
9399451b44SJordan Rupprecht   lbc.d = 1;
9499451b44SJordan Rupprecht   lbc.e = 20;
9599451b44SJordan Rupprecht 
9699451b44SJordan Rupprecht   lbd.arr[0] = 'a';
9799451b44SJordan Rupprecht   lbd.arr[1] = 'b';
9899451b44SJordan Rupprecht   lbd.arr[2] = '\0';
9999451b44SJordan Rupprecht   lbd.a = 5;
10099451b44SJordan Rupprecht 
10100c8120aSshafik   derived.b_a = 2;
10200c8120aSshafik   derived.d_a = 1;
10399451b44SJordan Rupprecht 
104*bae9aedbSshafik   uwbf.x = 0xFFFFFFFF;
105*bae9aedbSshafik   uwubf.x = 0xFFFFFFFF;
106*bae9aedbSshafik 
10799451b44SJordan Rupprecht   return 0; // Set break point at this line.
10899451b44SJordan Rupprecht }
109