147 lines · cpp
1// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -fstrict-enums -std=c++11 -o - | FileCheck %s2// RUN: %clang_cc1 %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -std=c++11 -o - | FileCheck --check-prefix=NO-STRICT-ENUMS %s3 4bool f(bool *x) {5 return *x;6}7// CHECK-LABEL: define{{.*}} zeroext i1 @_Z1fPb8// CHECK: load i8, ptr %{{[^ ]*}}, align 1, !range [[RANGE_i8_0_2:![0-9]+]], !noundef [[NOUNDEF:![0-9]+]]9 10// Only enum-tests follow. Ensure that after the bool test, no further range11// metadata shows up when strict enums are disabled.12// NO-STRICT-ENUMS-LABEL: define{{.*}} zeroext i1 @_Z1fPb13// NO-STRICT-ENUMS: load i8, ptr %{{[^ ]*}}, align 1, !range14// NO-STRICT-ENUMS-NOT: !range15 16enum e1 { };17e1 g1(e1 *x) {18 return *x;19}20// CHECK-LABEL: define{{.*}} i32 @_Z2g1P2e121// CHECK: ret i32 %022 23enum e2 { e2_a = 0 };24e2 g2(e2 *x) {25 return *x;26}27// CHECK-LABEL: define{{.*}} i32 @_Z2g2P2e228// CHECK: ret i32 %029 30enum e3 { e3_a = 16 };31e3 g3(e3 *x) {32 return *x;33}34// CHECK-LABEL: define{{.*}} i32 @_Z2g3P2e335// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_0_32:![0-9]+]], !noundef [[NOUNDEF]]36 37enum e4 { e4_a = -16};38e4 g4(e4 *x) {39 return *x;40}41// CHECK-LABEL: define{{.*}} i32 @_Z2g4P2e442// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m16_16:![0-9]+]], !noundef [[NOUNDEF]]43 44enum e5 { e5_a = -16, e5_b = 16};45e5 g5(e5 *x) {46 return *x;47}48// CHECK-LABEL: define{{.*}} i32 @_Z2g5P2e549// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m32_32:![0-9]+]], !noundef [[NOUNDEF]]50 51enum e6 { e6_a = -1 };52e6 g6(e6 *x) {53 return *x;54}55// CHECK-LABEL: define{{.*}} i32 @_Z2g6P2e656// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m1_1:![0-9]+]], !noundef [[NOUNDEF]]57 58enum e7 { e7_a = -16, e7_b = 2};59e7 g7(e7 *x) {60 return *x;61}62// CHECK-LABEL: define{{.*}} i32 @_Z2g7P2e763// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m16_16]], !noundef [[NOUNDEF]]64 65enum e8 { e8_a = -17};66e8 g8(e8 *x) {67 return *x;68}69// CHECK-LABEL: define{{.*}} i32 @_Z2g8P2e870// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m32_32:![0-9]+]], !noundef [[NOUNDEF]]71 72enum e9 { e9_a = 17};73e9 g9(e9 *x) {74 return *x;75}76// CHECK-LABEL: define{{.*}} i32 @_Z2g9P2e977// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_0_32]], !noundef [[NOUNDEF]]78 79enum e10 { e10_a = -16, e10_b = 32};80e10 g10(e10 *x) {81 return *x;82}83// CHECK-LABEL: define{{.*}} i32 @_Z3g10P3e1084// CHECK: load i32, ptr %x, align 4, !range [[RANGE_i32_m64_64:![0-9]+]], !noundef [[NOUNDEF]]85 86enum e11 {e11_a = 4294967296 };87enum e11 g11(enum e11 *x) {88 return *x;89}90// CHECK-LABEL: define{{.*}} i64 @_Z3g11P3e1191// CHECK: load i64, ptr %x, align {{[84]}}, !range [[RANGE_i64_0_2pow33:![0-9]+]], !noundef [[NOUNDEF]]92 93enum e12 {e12_a = 9223372036854775808U };94enum e12 g12(enum e12 *x) {95 return *x;96}97// CHECK-LABEL: define{{.*}} i64 @_Z3g12P3e1298// CHECK: load i64, ptr %x, align {{[84]}}99// CHECK-NOT: range100// CHECK: ret101 102enum e13 : char {e13_a = -1 };103e13 g13(e13 *x) {104 return *x;105}106// CHECK-LABEL: define{{.*}} signext i8 @_Z3g13P3e13107// CHECK: load i8, ptr %x, align 1108// CHECK-NOT: range109// CHECK: ret110 111enum class e14 {e14_a = 1};112e14 g14(e14 *x) {113 return *x;114}115// CHECK-LABEL: define{{.*}} i32 @_Z3g14P3e14116// CHECK: load i32, ptr %x, align 4117// CHECK-NOT: range118// CHECK: ret119 120enum e15 { e15_a = 2147483648 };121e15 g15(e15 *x) {122 return *x;123}124// CHECK-LABEL: define{{.*}} i32 @_Z3g15P3e15125// CHECK: load i32, ptr %x, align 4126// CHECK-NOT: range127// CHECK: ret128 129enum e16 { e16_a = -2147483648 };130e16 g16(e16 *x) {131 return *x;132}133// CHECK-LABEL: define{{.*}} i32 @_Z3g16P3e16134// CHECK: load i32, ptr %x, align 4135// CHECK-NOT: range136// CHECK: ret137 138 139// CHECK: [[RANGE_i8_0_2]] = !{i8 0, i8 2}140// CHECK: [[NOUNDEF]] = !{}141// CHECK: [[RANGE_i32_0_32]] = !{i32 0, i32 32}142// CHECK: [[RANGE_i32_m16_16]] = !{i32 -16, i32 16}143// CHECK: [[RANGE_i32_m32_32]] = !{i32 -32, i32 32}144// CHECK: [[RANGE_i32_m1_1]] = !{i32 -1, i32 1}145// CHECK: [[RANGE_i32_m64_64]] = !{i32 -64, i32 64}146// CHECK: [[RANGE_i64_0_2pow33]] = !{i64 0, i64 8589934592}147