blob: 49e61cae3756f8ac17229b961a429489f2c918a3 [file] [log] [blame]
Ulrich Weigand92309972012-10-24 12:22:56 +00001// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -fstrict-enums -std=c++11 -o - | FileCheck %s
2// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -std=c++11 -o - | FileCheck --check-prefix=NO-STRICT-ENUMS %s
Rafael Espindolac3f89552012-03-24 16:50:34 +00003
4bool f(bool *x) {
5 return *x;
6}
Stephen Lin93ab6bf2013-08-15 06:47:53 +00007// CHECK-LABEL: define zeroext i1 @_Z1fPb
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07008// CHECK: load i8, i8* %{{[^ ]*}}, align 1, !range [[RANGE_i8_0_2:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +00009
Chandler Carruth82fe6ae2012-03-27 23:58:37 +000010// Only enum-tests follow. Ensure that after the bool test, no further range
11// metadata shows up when strict enums are disabled.
Stephen Lin93ab6bf2013-08-15 06:47:53 +000012// NO-STRICT-ENUMS-LABEL: define zeroext i1 @_Z1fPb
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070013// NO-STRICT-ENUMS: load i8, i8* %{{[^ ]*}}, align 1, !range
Chandler Carruth82fe6ae2012-03-27 23:58:37 +000014// NO-STRICT-ENUMS-NOT: !range
15
Rafael Espindolac3f89552012-03-24 16:50:34 +000016enum e1 { };
17e1 g1(e1 *x) {
18 return *x;
19}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000020// CHECK-LABEL: define i32 @_Z2g1P2e1
Stephen Hines176edba2014-12-01 14:53:08 -080021// CHECK: ret i32 0
Rafael Espindolac3f89552012-03-24 16:50:34 +000022
23enum e2 { e2_a = 0 };
24e2 g2(e2 *x) {
25 return *x;
26}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000027// CHECK-LABEL: define i32 @_Z2g2P2e2
Stephen Hines176edba2014-12-01 14:53:08 -080028// CHECK: ret i32 0
Rafael Espindolac3f89552012-03-24 16:50:34 +000029
30enum e3 { e3_a = 16 };
31e3 g3(e3 *x) {
32 return *x;
33}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000034// CHECK-LABEL: define i32 @_Z2g3P2e3
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070035// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000036
37enum e4 { e4_a = -16};
38e4 g4(e4 *x) {
39 return *x;
40}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000041// CHECK-LABEL: define i32 @_Z2g4P2e4
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070042// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000043
44enum e5 { e5_a = -16, e5_b = 16};
45e5 g5(e5 *x) {
46 return *x;
47}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000048// CHECK-LABEL: define i32 @_Z2g5P2e5
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070049// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000050
51enum e6 { e6_a = -1 };
52e6 g6(e6 *x) {
53 return *x;
54}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000055// CHECK-LABEL: define i32 @_Z2g6P2e6
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070056// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m1_1:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000057
58enum e7 { e7_a = -16, e7_b = 2};
59e7 g7(e7 *x) {
60 return *x;
61}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000062// CHECK-LABEL: define i32 @_Z2g7P2e7
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070063// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000064
65enum e8 { e8_a = -17};
66e8 g8(e8 *x) {
67 return *x;
68}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000069// CHECK-LABEL: define i32 @_Z2g8P2e8
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070070// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000071
72enum e9 { e9_a = 17};
73e9 g9(e9 *x) {
74 return *x;
75}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000076// CHECK-LABEL: define i32 @_Z2g9P2e9
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070077// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000078
79enum e10 { e10_a = -16, e10_b = 32};
80e10 g10(e10 *x) {
81 return *x;
82}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000083// CHECK-LABEL: define i32 @_Z3g10P3e10
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070084// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m64_64:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000085
86enum e11 {e11_a = 4294967296 };
87enum e11 g11(enum e11 *x) {
88 return *x;
89}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000090// CHECK-LABEL: define i64 @_Z3g11P3e11
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070091// CHECK: load i64, i64* %x, align {{[84]}}, !range [[RANGE_i64_0_2pow33:![^ ]*]]
Rafael Espindolac3f89552012-03-24 16:50:34 +000092
93enum e12 {e12_a = 9223372036854775808U };
94enum e12 g12(enum e12 *x) {
95 return *x;
96}
Stephen Lin93ab6bf2013-08-15 06:47:53 +000097// CHECK-LABEL: define i64 @_Z3g12P3e12
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070098// CHECK: load i64, i64* %x, align {{[84]}}
Rafael Espindolac3f89552012-03-24 16:50:34 +000099// CHECK-NOT: range
100// CHECK: ret
101
102enum e13 : char {e13_a = -1 };
103e13 g13(e13 *x) {
104 return *x;
105}
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000106// CHECK-LABEL: define signext i8 @_Z3g13P3e13
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700107// CHECK: load i8, i8* %x, align 1
Rafael Espindolac3f89552012-03-24 16:50:34 +0000108// CHECK-NOT: range
109// CHECK: ret
110
111enum class e14 {e14_a = 1};
112e14 g14(e14 *x) {
113 return *x;
114}
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000115// CHECK-LABEL: define i32 @_Z3g14P3e14
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700116// CHECK: load i32, i32* %x, align 4
Rafael Espindolac3f89552012-03-24 16:50:34 +0000117// CHECK-NOT: range
118// CHECK: ret
119
120enum e15 { e15_a = 2147483648 };
121e15 g15(e15 *x) {
122 return *x;
123}
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000124// CHECK-LABEL: define i32 @_Z3g15P3e15
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700125// CHECK: load i32, i32* %x, align 4
Rafael Espindolac3f89552012-03-24 16:50:34 +0000126// CHECK-NOT: range
127// CHECK: ret
128
129enum e16 { e16_a = -2147483648 };
130e16 g16(e16 *x) {
131 return *x;
132}
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000133// CHECK-LABEL: define i32 @_Z3g16P3e16
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700134// CHECK: load i32, i32* %x, align 4
Rafael Espindolac3f89552012-03-24 16:50:34 +0000135// CHECK-NOT: range
136// CHECK: ret
137
138
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700139// CHECK: [[RANGE_i8_0_2]] = !{i8 0, i8 2}
140// CHECK: [[RANGE_i32_0_32]] = !{i32 0, i32 32}
141// CHECK: [[RANGE_i32_m16_16]] = !{i32 -16, i32 16}
142// CHECK: [[RANGE_i32_m32_32]] = !{i32 -32, i32 32}
143// CHECK: [[RANGE_i32_m1_1]] = !{i32 -1, i32 1}
144// CHECK: [[RANGE_i32_m64_64]] = !{i32 -64, i32 64}
145// CHECK: [[RANGE_i64_0_2pow33]] = !{i64 0, i64 8589934592}