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 // RUN: %clang_cc1 %s -triple=x86_64-unknown-unknown -emit-llvm -o - -O3 -std=c++11 | FileCheck -check-prefix=CHECK -check-prefix=CHECK-LP64 %s
6 
7 // CHECK-LP64: %union.Test1 = type { i32, [4 x i8] }
8 union Test1 {
9   int a;
10   int b: 39;
11 };
12 Test1 t1;
13 
14 // CHECK-LP64: %union.Test2 = type { i8 }
15 union Test2 {
16   int : 6;
17 } t2;
18 
19 // CHECK-LP64: %union.Test3 = type { i16 }
20 union Test3 {
21   int : 9;
22 } t3;
23 
24 // CHECK: %union.Test4 = type { i8, i8 }
25 union Test4 {
26   char val : 16;
27 };
28 Test4 t4;
29 
30 #define CHECK(x) if (!(x)) return __LINE__
31 
32 // CHECK: define{{.*}} i32 @_Z11test_assignv()
test_assign()33 int test_assign() {
34   struct {
35     int a;
36 
37     unsigned long long b : 65;
38 
39     int c;
40   } c;
41 
42   c.a = 0;
43   c.b = (unsigned long long)-1;
44   c.c = 0;
45 
46   CHECK(c.a == 0);
47   CHECK(c.b == (unsigned long long)-1);
48   CHECK(c.c == 0);
49 
50   Test1 u1;
51   Test4 u2;
52 
53   u1.b = 1;
54   u2.val = 42;
55 
56   CHECK(u1.b == 1);
57   CHECK(u2.val == 42);
58 
59   // CHECK: ret i32 0
60   return 0;
61 }
62 
63 // CHECK: define{{.*}} i32 @_Z9test_initv()
test_init()64 int test_init() {
65   struct S {
66     int a;
67 
68     unsigned long long b : 65;
69 
70     int c;
71   };
72   S s1 = {1, 42, 0};
73 
74   CHECK(s1.a == 1);
75   CHECK(s1.b == (unsigned long long)42);
76   CHECK(s1.c == 0);
77 
78   Test1 u1 = {1};
79   Test4 u2 = {42};
80 
81   CHECK(u1.a == 1);
82   CHECK(u1.b == 1);
83   CHECK(u2.val == 42);
84 
85   // CHECK: ret i32 0
86   return 0;
87 }
88 
89 extern "C" {
test_trunc_int()90 int test_trunc_int() {
91   union {
92     int i : 4; // truncated to 0b1111 == -1
93   } const U = {15};  // 0b00001111
94   return U.i;
95 }
96 // CHECK: define{{.*}} i32 @test_trunc_int()
97 // CHECK: ret i32 -1
98 
test_trunc_three_bits()99 int test_trunc_three_bits() {
100   union {
101     int i : 3; // truncated to 0b111 == -1
102   } const U = {15};  // 0b00001111
103   return U.i;
104 }
105 // CHECK: define{{.*}} i32 @test_trunc_three_bits()
106 // CHECK: ret i32 -1
107 
test_trunc_1()108 int test_trunc_1() {
109   union {
110     int i : 1; // truncated to 0b1 == -1
111   } const U = {15};  // 0b00001111
112   return U.i;
113 }
114 // CHECK: define{{.*}} i32 @test_trunc_1()
115 // CHECK: ret i32 -1
116 
test_trunc_zero()117 int test_trunc_zero() {
118   union {
119     int i : 4; // truncated to 0b0000 == 0
120   } const U = {80};  // 0b01010000
121   return U.i;
122 }
123 // CHECK: define{{.*}} i32 @test_trunc_zero()
124 // CHECK: ret i32 0
125 
test_constexpr()126 int test_constexpr() {
127   union {
128     int i : 3;           // truncated to 0b111 == -1
129   } const U = {1 + 2 + 4 + 8}; // 0b00001111
130   return U.i;
131 }
132 // CHECK: define{{.*}} i32 @test_constexpr()
133 // CHECK: ret i32 -1
134 
test_notrunc()135 int test_notrunc() {
136   union {
137     int i : 12;          // not truncated
138   } const U = {1 + 2 + 4 + 8}; // 0b00001111
139   return U.i;
140 }
141 // CHECK: define{{.*}} i32 @test_notrunc()
142 // CHECK: ret i32 15
143 
test_trunc_long_long()144 long long test_trunc_long_long() {
145   union {
146     long long i : 14; // truncated to 0b00111101001101 ==
147   } const U = {0b0100111101001101};
148   return U.i;
149 }
150 // CHECK: define{{.*}} i64 @test_trunc_long_long()
151 // CHECK: ret i64 3917
152 }
153