1*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -fstrict-enums -std=c++11 -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -std=c++11 -o - | FileCheck --check-prefix=NO-STRICT-ENUMS %s
3*67e74705SXin Li
f(bool * x)4*67e74705SXin Li bool f(bool *x) {
5*67e74705SXin Li return *x;
6*67e74705SXin Li }
7*67e74705SXin Li // CHECK-LABEL: define zeroext i1 @_Z1fPb
8*67e74705SXin Li // CHECK: load i8, i8* %{{[^ ]*}}, align 1, !range [[RANGE_i8_0_2:![^ ]*]]
9*67e74705SXin Li
10*67e74705SXin Li // Only enum-tests follow. Ensure that after the bool test, no further range
11*67e74705SXin Li // metadata shows up when strict enums are disabled.
12*67e74705SXin Li // NO-STRICT-ENUMS-LABEL: define zeroext i1 @_Z1fPb
13*67e74705SXin Li // NO-STRICT-ENUMS: load i8, i8* %{{[^ ]*}}, align 1, !range
14*67e74705SXin Li // NO-STRICT-ENUMS-NOT: !range
15*67e74705SXin Li
16*67e74705SXin Li enum e1 { };
g1(e1 * x)17*67e74705SXin Li e1 g1(e1 *x) {
18*67e74705SXin Li return *x;
19*67e74705SXin Li }
20*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g1P2e1
21*67e74705SXin Li // CHECK: ret i32 0
22*67e74705SXin Li
23*67e74705SXin Li enum e2 { e2_a = 0 };
g2(e2 * x)24*67e74705SXin Li e2 g2(e2 *x) {
25*67e74705SXin Li return *x;
26*67e74705SXin Li }
27*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g2P2e2
28*67e74705SXin Li // CHECK: ret i32 0
29*67e74705SXin Li
30*67e74705SXin Li enum e3 { e3_a = 16 };
g3(e3 * x)31*67e74705SXin Li e3 g3(e3 *x) {
32*67e74705SXin Li return *x;
33*67e74705SXin Li }
34*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g3P2e3
35*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32:![^ ]*]]
36*67e74705SXin Li
37*67e74705SXin Li enum e4 { e4_a = -16};
g4(e4 * x)38*67e74705SXin Li e4 g4(e4 *x) {
39*67e74705SXin Li return *x;
40*67e74705SXin Li }
41*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g4P2e4
42*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16:![^ ]*]]
43*67e74705SXin Li
44*67e74705SXin Li enum e5 { e5_a = -16, e5_b = 16};
g5(e5 * x)45*67e74705SXin Li e5 g5(e5 *x) {
46*67e74705SXin Li return *x;
47*67e74705SXin Li }
48*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g5P2e5
49*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
50*67e74705SXin Li
51*67e74705SXin Li enum e6 { e6_a = -1 };
g6(e6 * x)52*67e74705SXin Li e6 g6(e6 *x) {
53*67e74705SXin Li return *x;
54*67e74705SXin Li }
55*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g6P2e6
56*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m1_1:![^ ]*]]
57*67e74705SXin Li
58*67e74705SXin Li enum e7 { e7_a = -16, e7_b = 2};
g7(e7 * x)59*67e74705SXin Li e7 g7(e7 *x) {
60*67e74705SXin Li return *x;
61*67e74705SXin Li }
62*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g7P2e7
63*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16]]
64*67e74705SXin Li
65*67e74705SXin Li enum e8 { e8_a = -17};
g8(e8 * x)66*67e74705SXin Li e8 g8(e8 *x) {
67*67e74705SXin Li return *x;
68*67e74705SXin Li }
69*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g8P2e8
70*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
71*67e74705SXin Li
72*67e74705SXin Li enum e9 { e9_a = 17};
g9(e9 * x)73*67e74705SXin Li e9 g9(e9 *x) {
74*67e74705SXin Li return *x;
75*67e74705SXin Li }
76*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2g9P2e9
77*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32]]
78*67e74705SXin Li
79*67e74705SXin Li enum e10 { e10_a = -16, e10_b = 32};
g10(e10 * x)80*67e74705SXin Li e10 g10(e10 *x) {
81*67e74705SXin Li return *x;
82*67e74705SXin Li }
83*67e74705SXin Li // CHECK-LABEL: define i32 @_Z3g10P3e10
84*67e74705SXin Li // CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m64_64:![^ ]*]]
85*67e74705SXin Li
86*67e74705SXin Li enum e11 {e11_a = 4294967296 };
g11(enum e11 * x)87*67e74705SXin Li enum e11 g11(enum e11 *x) {
88*67e74705SXin Li return *x;
89*67e74705SXin Li }
90*67e74705SXin Li // CHECK-LABEL: define i64 @_Z3g11P3e11
91*67e74705SXin Li // CHECK: load i64, i64* %x, align {{[84]}}, !range [[RANGE_i64_0_2pow33:![^ ]*]]
92*67e74705SXin Li
93*67e74705SXin Li enum e12 {e12_a = 9223372036854775808U };
g12(enum e12 * x)94*67e74705SXin Li enum e12 g12(enum e12 *x) {
95*67e74705SXin Li return *x;
96*67e74705SXin Li }
97*67e74705SXin Li // CHECK-LABEL: define i64 @_Z3g12P3e12
98*67e74705SXin Li // CHECK: load i64, i64* %x, align {{[84]}}
99*67e74705SXin Li // CHECK-NOT: range
100*67e74705SXin Li // CHECK: ret
101*67e74705SXin Li
102*67e74705SXin Li enum e13 : char {e13_a = -1 };
g13(e13 * x)103*67e74705SXin Li e13 g13(e13 *x) {
104*67e74705SXin Li return *x;
105*67e74705SXin Li }
106*67e74705SXin Li // CHECK-LABEL: define signext i8 @_Z3g13P3e13
107*67e74705SXin Li // CHECK: load i8, i8* %x, align 1
108*67e74705SXin Li // CHECK-NOT: range
109*67e74705SXin Li // CHECK: ret
110*67e74705SXin Li
111*67e74705SXin Li enum class e14 {e14_a = 1};
g14(e14 * x)112*67e74705SXin Li e14 g14(e14 *x) {
113*67e74705SXin Li return *x;
114*67e74705SXin Li }
115*67e74705SXin Li // CHECK-LABEL: define i32 @_Z3g14P3e14
116*67e74705SXin Li // CHECK: load i32, i32* %x, align 4
117*67e74705SXin Li // CHECK-NOT: range
118*67e74705SXin Li // CHECK: ret
119*67e74705SXin Li
120*67e74705SXin Li enum e15 { e15_a = 2147483648 };
g15(e15 * x)121*67e74705SXin Li e15 g15(e15 *x) {
122*67e74705SXin Li return *x;
123*67e74705SXin Li }
124*67e74705SXin Li // CHECK-LABEL: define i32 @_Z3g15P3e15
125*67e74705SXin Li // CHECK: load i32, i32* %x, align 4
126*67e74705SXin Li // CHECK-NOT: range
127*67e74705SXin Li // CHECK: ret
128*67e74705SXin Li
129*67e74705SXin Li enum e16 { e16_a = -2147483648 };
g16(e16 * x)130*67e74705SXin Li e16 g16(e16 *x) {
131*67e74705SXin Li return *x;
132*67e74705SXin Li }
133*67e74705SXin Li // CHECK-LABEL: define i32 @_Z3g16P3e16
134*67e74705SXin Li // CHECK: load i32, i32* %x, align 4
135*67e74705SXin Li // CHECK-NOT: range
136*67e74705SXin Li // CHECK: ret
137*67e74705SXin Li
138*67e74705SXin Li
139*67e74705SXin Li // CHECK: [[RANGE_i8_0_2]] = !{i8 0, i8 2}
140*67e74705SXin Li // CHECK: [[RANGE_i32_0_32]] = !{i32 0, i32 32}
141*67e74705SXin Li // CHECK: [[RANGE_i32_m16_16]] = !{i32 -16, i32 16}
142*67e74705SXin Li // CHECK: [[RANGE_i32_m32_32]] = !{i32 -32, i32 32}
143*67e74705SXin Li // CHECK: [[RANGE_i32_m1_1]] = !{i32 -1, i32 1}
144*67e74705SXin Li // CHECK: [[RANGE_i32_m64_64]] = !{i32 -64, i32 64}
145*67e74705SXin Li // CHECK: [[RANGE_i64_0_2pow33]] = !{i64 0, i64 8589934592}
146