Clang Project

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