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