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