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