xref: /llvm-project/clang/test/CodeGenCXX/bitfield-layout.cpp (revision e3b64eb31c0e9a9f1ac4891b834d71532e545cad)
1 // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -O3 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-LP64 %s
2 // RUN: %clang_cc1 %s -triple=i386-apple-darwin10 -emit-llvm -o - -O3 | FileCheck %s
3 // RUN: %clang_cc1 %s -triple=aarch64_be-none-eabi -emit-llvm -o - -O3 | FileCheck %s
4 // RUN: %clang_cc1 %s -triple=thumbv7_be-none-eabi -emit-llvm -o - -O3 | FileCheck %s
5 
6 // CHECK-LP64: %union.Test1 = type { i32, [4 x i8] }
7 union Test1 {
8   int a;
9   int b: 39;
10 };
11 Test1 t1;
12 
13 // CHECK-LP64: %union.Test2 = type { i8 }
14 union Test2 {
15   int : 6;
16 } t2;
17 
18 // CHECK-LP64: %union.Test3 = type { i16 }
19 union Test3 {
20   int : 9;
21 } t3;
22 
23 // CHECK: %union.Test4 = type { i8, i8 }
24 union Test4 {
25   char val : 16;
26 };
27 Test4 t4;
28 
29 #define CHECK(x) if (!(x)) return __LINE__
30 
31 // CHECK: define i32 @_Z11test_assignv()
32 int test_assign() {
33   struct {
34     int a;
35 
36     unsigned long long b : 65;
37 
38     int c;
39   } c;
40 
41   c.a = 0;
42   c.b = (unsigned long long)-1;
43   c.c = 0;
44 
45   CHECK(c.a == 0);
46   CHECK(c.b == (unsigned long long)-1);
47   CHECK(c.c == 0);
48 
49   Test1 u1;
50   Test4 u2;
51 
52   u1.b = 1;
53   u2.val = 42;
54 
55   CHECK(u1.b == 1);
56   CHECK(u2.val == 42);
57 
58   // CHECK: ret i32 0
59   return 0;
60 }
61 
62 // CHECK: define i32 @_Z9test_initv()
63 int test_init() {
64   struct S {
65     int a;
66 
67     unsigned long long b : 65;
68 
69     int c;
70   };
71   S s1 = {1, 42, 0};
72 
73   CHECK(s1.a == 1);
74   CHECK(s1.b == (unsigned long long)42);
75   CHECK(s1.c == 0);
76 
77   Test1 u1 = {1};
78   Test4 u2 = {42};
79 
80   CHECK(u1.a == 1);
81   CHECK(u1.b == 1);
82   CHECK(u2.val == 42);
83 
84   // CHECK: ret i32 0
85   return 0;
86 }
87