// RUN: %clang_cc1 -no-opaque-pointers %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -fstrict-enums -std=c++11 -o - | FileCheck %s
// RUN: %clang_cc1 -no-opaque-pointers %s -triple i386-unknown-unknown -emit-llvm -O1 -relaxed-aliasing -std=c++11 -o - | FileCheck --check-prefix=NO-STRICT-ENUMS %s
bool
// CHECK-LABEL: define{{.*}} zeroext i1 @_Z1fPb
// CHECK: load i8, i8* %{{[^ ]*}}, align 1, !range [[RANGE_i8_0_2:![^ ]*]]
// Only enum-tests follow. Ensure that after the bool test, no further range
// metadata shows up when strict enums are disabled.
// NO-STRICT-ENUMS-LABEL: define{{.*}} zeroext i1 @_Z1fPb
// NO-STRICT-ENUMS: load i8, i8* %{{[^ ]*}}, align 1, !range
// NO-STRICT-ENUMS-NOT: !range
;
e1
// CHECK-LABEL: define{{.*}} i32 @_Z2g1P2e1
// CHECK: ret i32 %0
;
e2
// CHECK-LABEL: define{{.*}} i32 @_Z2g2P2e2
// CHECK: ret i32 %0
;
e3
// CHECK-LABEL: define{{.*}} i32 @_Z2g3P2e3
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32:![^ ]*]]
;
e4
// CHECK-LABEL: define{{.*}} i32 @_Z2g4P2e4
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16:![^ ]*]]
;
e5
// CHECK-LABEL: define{{.*}} i32 @_Z2g5P2e5
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
;
e6
// CHECK-LABEL: define{{.*}} i32 @_Z2g6P2e6
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m1_1:![^ ]*]]
;
e7
// CHECK-LABEL: define{{.*}} i32 @_Z2g7P2e7
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m16_16]]
;
e8
// CHECK-LABEL: define{{.*}} i32 @_Z2g8P2e8
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m32_32:![^ ]*]]
;
e9
// CHECK-LABEL: define{{.*}} i32 @_Z2g9P2e9
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_0_32]]
;
e10
// CHECK-LABEL: define{{.*}} i32 @_Z3g10P3e10
// CHECK: load i32, i32* %x, align 4, !range [[RANGE_i32_m64_64:![^ ]*]]
;
enum e11
// CHECK-LABEL: define{{.*}} i64 @_Z3g11P3e11
// CHECK: load i64, i64* %x, align {{[84]}}, !range [[RANGE_i64_0_2pow33:![^ ]*]]
;
enum e12
// CHECK-LABEL: define{{.*}} i64 @_Z3g12P3e12
// CHECK: load i64, i64* %x, align {{[84]}}
// CHECK-NOT: range
// CHECK: ret
;
e13
// CHECK-LABEL: define{{.*}} signext i8 @_Z3g13P3e13
// CHECK: load i8, i8* %x, align 1
// CHECK-NOT: range
// CHECK: ret
;
e14
// CHECK-LABEL: define{{.*}} i32 @_Z3g14P3e14
// CHECK: load i32, i32* %x, align 4
// CHECK-NOT: range
// CHECK: ret
;
e15
// CHECK-LABEL: define{{.*}} i32 @_Z3g15P3e15
// CHECK: load i32, i32* %x, align 4
// CHECK-NOT: range
// CHECK: ret
;
e16
// CHECK-LABEL: define{{.*}} i32 @_Z3g16P3e16
// CHECK: load i32, i32* %x, align 4
// CHECK-NOT: range
// CHECK: ret
// CHECK: [[RANGE_i8_0_2]] = !{i8 0, i8 2}
// CHECK: [[RANGE_i32_0_32]] = !{i32 0, i32 32}
// CHECK: [[RANGE_i32_m16_16]] = !{i32 -16, i32 16}
// CHECK: [[RANGE_i32_m32_32]] = !{i32 -32, i32 32}
// CHECK: [[RANGE_i32_m1_1]] = !{i32 -1, i32 1}
// CHECK: [[RANGE_i32_m64_64]] = !{i32 -64, i32 64}
// CHECK: [[RANGE_i64_0_2pow33]] = !{i64 0, i64 8589934592}