1 // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=signed-integer-overflow,unsigned-integer-overflow | FileCheck %s 2 3 typedef unsigned char uchar; 4 typedef unsigned short ushort; 5 typedef int int4 __attribute__((ext_vector_type(4))); 6 7 enum E1 : int { 8 a 9 }; 10 11 enum E2 : char { 12 b 13 }; 14 15 // CHECK-LABEL: define{{.*}} signext i8 @_Z4add1 16 // CHECK-NOT: sadd.with.overflow 17 char add1(char c) { return c + c; } 18 19 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4add2 20 // CHECK-NOT: uadd.with.overflow 21 uchar add2(uchar uc) { return uc + uc; } 22 23 // CHECK-LABEL: define{{.*}} i32 @_Z4add3 24 // CHECK: sadd.with.overflow 25 int add3(E1 e) { return e + a; } 26 27 // CHECK-LABEL: define{{.*}} signext i8 @_Z4add4 28 // CHECK-NOT: sadd.with.overflow 29 char add4(E2 e) { return e + b; } 30 31 // CHECK-LABEL: define{{.*}} signext i8 @_Z4sub1 32 // CHECK-NOT: ssub.with.overflow 33 char sub1(char c) { return c - c; } 34 35 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4sub2 36 // CHECK-NOT: usub.with.overflow 37 uchar sub2(uchar uc) { return uc - uc; } 38 39 // CHECK-LABEL: define{{.*}} signext i8 @_Z4sub3 40 // CHECK-NOT: ssub.with.overflow 41 char sub3(char c) { return -c; } 42 43 // Note: -INT_MIN can overflow. 44 // 45 // CHECK-LABEL: define{{.*}} i32 @_Z4sub4 46 // CHECK: ssub.with.overflow 47 int sub4(int i) { return -i; } 48 49 // CHECK-LABEL: define{{.*}} signext i8 @_Z4mul1 50 // CHECK-NOT: smul.with.overflow 51 char mul1(char c) { return c * c; } 52 53 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4mul2 54 // CHECK-NOT: smul.with.overflow 55 uchar mul2(uchar uc) { return uc * uc; } 56 57 // Note: USHRT_MAX * USHRT_MAX can overflow. 58 // 59 // CHECK-LABEL: define{{.*}} zeroext i16 @_Z4mul3 60 // CHECK: smul.with.overflow 61 ushort mul3(ushort us) { return us * us; } 62 63 // CHECK-LABEL: define{{.*}} i32 @_Z4mul4 64 // CHECK: smul.with.overflow 65 int mul4(int i, char c) { return i * c; } 66 67 // CHECK-LABEL: define{{.*}} i32 @_Z4mul5 68 // CHECK: smul.with.overflow 69 int mul5(int i, char c) { return c * i; } 70 71 // CHECK-LABEL: define{{.*}} signext i16 @_Z4mul6 72 // CHECK-NOT: smul.with.overflow 73 short mul6(short s) { return s * s; } 74 75 // CHECK-LABEL: define{{.*}} signext i8 @_Z4div1 76 // CHECK-NOT: ubsan_handle_divrem_overflow 77 char div1(char c) { return c / c; } 78 79 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4div2 80 // CHECK-NOT: ubsan_handle_divrem_overflow 81 uchar div2(uchar uc) { return uc / uc; } 82 83 // CHECK-LABEL: define{{.*}} signext i8 @_Z4div3 84 // CHECK-NOT: ubsan_handle_divrem_overflow 85 char div3(char c, int i) { return c / i; } 86 87 // CHECK-LABEL: define{{.*}} signext i8 @_Z4div4 88 // CHECK: ubsan_handle_divrem_overflow 89 char div4(int i, char c) { return i / c; } 90 91 // Note: INT_MIN / -1 can overflow. 92 // 93 // CHECK-LABEL: define{{.*}} signext i8 @_Z4div5 94 // CHECK: ubsan_handle_divrem_overflow 95 char div5(int i, char c) { return i / c; } 96 97 // CHECK-LABEL: define{{.*}} signext i8 @_Z4rem1 98 // CHECK-NOT: ubsan_handle_divrem_overflow 99 char rem1(char c) { return c % c; } 100 101 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4rem2 102 // CHECK-NOT: ubsan_handle_divrem_overflow 103 uchar rem2(uchar uc) { return uc % uc; } 104 105 // CHECK-LABEL: define{{.*}} signext i8 @_Z4rem3 106 // CHECK: ubsan_handle_divrem_overflow 107 char rem3(int i, char c) { return i % c; } 108 109 // CHECK-LABEL: define{{.*}} signext i8 @_Z4rem4 110 // CHECK-NOT: ubsan_handle_divrem_overflow 111 char rem4(char c, int i) { return c % i; } 112 113 // CHECK-LABEL: define{{.*}} signext i8 @_Z4inc1 114 // CHECK-NOT: sadd.with.overflow 115 char inc1(char c) { return c++ + (char)0; } 116 117 // CHECK-LABEL: define{{.*}} zeroext i8 @_Z4inc2 118 // CHECK-NOT: uadd.with.overflow 119 uchar inc2(uchar uc) { return uc++ + (uchar)0; } 120 121 // CHECK-LABEL: define{{.*}} void @_Z4inc3 122 // CHECK-NOT: sadd.with.overflow 123 void inc3(char c) { c++; } 124 125 // CHECK-LABEL: define{{.*}} void @_Z4inc4 126 // CHECK-NOT: uadd.with.overflow 127 void inc4(uchar uc) { uc++; } 128 129 // CHECK-LABEL: define{{.*}} <4 x i32> @_Z4vremDv4_iS_ 130 // CHECK-NOT: ubsan_handle_divrem_overflow 131 int4 vrem(int4 a, int4 b) { return a % b; } 132