132 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=signed-integer-overflow,unsigned-integer-overflow | FileCheck %s2 3typedef unsigned char uchar;4typedef unsigned short ushort;5typedef int int4 __attribute__((ext_vector_type(4)));6 7enum E1 : int {8 a9};10 11enum E2 : char {12 b13};14 15// CHECK-LABEL: define{{.*}} signext i8 @_Z4add116// CHECK-NOT: sadd.with.overflow17char add1(char c) { return c + c; }18 19// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4add220// CHECK-NOT: uadd.with.overflow21uchar add2(uchar uc) { return uc + uc; }22 23// CHECK-LABEL: define{{.*}} i32 @_Z4add324// CHECK: sadd.with.overflow25int add3(E1 e) { return e + a; }26 27// CHECK-LABEL: define{{.*}} signext i8 @_Z4add428// CHECK-NOT: sadd.with.overflow29char add4(E2 e) { return e + b; }30 31// CHECK-LABEL: define{{.*}} signext i8 @_Z4sub132// CHECK-NOT: ssub.with.overflow33char sub1(char c) { return c - c; }34 35// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4sub236// CHECK-NOT: usub.with.overflow37uchar sub2(uchar uc) { return uc - uc; }38 39// CHECK-LABEL: define{{.*}} signext i8 @_Z4sub340// CHECK-NOT: ssub.with.overflow41char sub3(char c) { return -c; }42 43// Note: -INT_MIN can overflow.44//45// CHECK-LABEL: define{{.*}} i32 @_Z4sub446// CHECK: ssub.with.overflow47int sub4(int i) { return -i; }48 49// CHECK-LABEL: define{{.*}} signext i8 @_Z4mul150// CHECK-NOT: smul.with.overflow51char mul1(char c) { return c * c; }52 53// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4mul254// CHECK-NOT: smul.with.overflow55uchar mul2(uchar uc) { return uc * uc; }56 57// Note: USHRT_MAX * USHRT_MAX can overflow.58//59// CHECK-LABEL: define{{.*}} zeroext i16 @_Z4mul360// CHECK: smul.with.overflow61ushort mul3(ushort us) { return us * us; }62 63// CHECK-LABEL: define{{.*}} i32 @_Z4mul464// CHECK: smul.with.overflow65int mul4(int i, char c) { return i * c; }66 67// CHECK-LABEL: define{{.*}} i32 @_Z4mul568// CHECK: smul.with.overflow69int mul5(int i, char c) { return c * i; }70 71// CHECK-LABEL: define{{.*}} signext i16 @_Z4mul672// CHECK-NOT: smul.with.overflow73short mul6(short s) { return s * s; }74 75// CHECK-LABEL: define{{.*}} signext i8 @_Z4div176// CHECK-NOT: ubsan_handle_divrem_overflow77char div1(char c) { return c / c; }78 79// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4div280// CHECK-NOT: ubsan_handle_divrem_overflow81uchar div2(uchar uc) { return uc / uc; }82 83// CHECK-LABEL: define{{.*}} signext i8 @_Z4div384// CHECK-NOT: ubsan_handle_divrem_overflow85char div3(char c, int i) { return c / i; }86 87// CHECK-LABEL: define{{.*}} signext i8 @_Z4div488// CHECK: ubsan_handle_divrem_overflow89char div4(int i, char c) { return i / c; }90 91// Note: INT_MIN / -1 can overflow.92//93// CHECK-LABEL: define{{.*}} signext i8 @_Z4div594// CHECK: ubsan_handle_divrem_overflow95char div5(int i, char c) { return i / c; }96 97// CHECK-LABEL: define{{.*}} signext i8 @_Z4rem198// CHECK-NOT: ubsan_handle_divrem_overflow99char rem1(char c) { return c % c; }100 101// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4rem2102// CHECK-NOT: ubsan_handle_divrem_overflow103uchar rem2(uchar uc) { return uc % uc; }104 105// CHECK-LABEL: define{{.*}} signext i8 @_Z4rem3106// CHECK: ubsan_handle_divrem_overflow107char rem3(int i, char c) { return i % c; }108 109// CHECK-LABEL: define{{.*}} signext i8 @_Z4rem4110// CHECK-NOT: ubsan_handle_divrem_overflow111char rem4(char c, int i) { return c % i; }112 113// CHECK-LABEL: define{{.*}} signext i8 @_Z4inc1114// CHECK-NOT: sadd.with.overflow115char inc1(char c) { return c++ + (char)0; }116 117// CHECK-LABEL: define{{.*}} zeroext i8 @_Z4inc2118// CHECK-NOT: uadd.with.overflow119uchar inc2(uchar uc) { return uc++ + (uchar)0; }120 121// CHECK-LABEL: define{{.*}} void @_Z4inc3122// CHECK-NOT: sadd.with.overflow123void inc3(char c) { c++; }124 125// CHECK-LABEL: define{{.*}} void @_Z4inc4126// CHECK-NOT: uadd.with.overflow127void inc4(uchar uc) { uc++; }128 129// CHECK-LABEL: define{{.*}} <4 x i32> @_Z4vremDv4_iS_130// CHECK-NOT: ubsan_handle_divrem_overflow131int4 vrem(int4 a, int4 b) { return a % b; }132