Skip to content

Commit 8766a83

Browse files
committed
Two more test cases which have been long uncommitted.
llvm-svn: 133842
1 parent 1c382d7 commit 8766a83

File tree

2 files changed

+219
-0
lines changed

2 files changed

+219
-0
lines changed
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2+
3+
// rdar://problem/9246208
4+
5+
// CHECK: [[OVR_T:%.*]] = type { i32, i1 }
6+
7+
// Basic test.
8+
namespace test0 {
9+
struct A {
10+
A();
11+
int x;
12+
};
13+
14+
typedef A elt;
15+
16+
// CHECK: define [[A:%.*]]* @_ZN5test04testEs(i16 signext
17+
// CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
18+
// CHECK-NEXT: [[T0:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
19+
// CHECK-NEXT: [[T1:%.*]] = extractvalue [[OVR_T]] [[T0]], 1
20+
// CHECK-NEXT: [[T2:%.*]] = extractvalue [[OVR_T]] [[T0]], 0
21+
// CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
22+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T3]])
23+
// CHECK: icmp ult i32 {{.*}}, [[N]]
24+
elt *test(short s) {
25+
return new elt[s];
26+
}
27+
}
28+
29+
// test0 with a nested array.
30+
namespace test1 {
31+
struct A {
32+
A();
33+
int x;
34+
};
35+
36+
typedef A elt[100];
37+
38+
// CHECK: define [100 x [[A:%.*]]]* @_ZN5test14testEs(i16 signext
39+
// CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
40+
// CHECK-NEXT: [[T0:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
41+
// CHECK-NEXT: [[T1:%.*]] = extractvalue [[OVR_T]] [[T0]], 1
42+
// CHECK-NEXT: [[T2:%.*]] = extractvalue [[OVR_T]] [[T0]], 0
43+
// CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
44+
// CHECK-NEXT: [[T4:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
45+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T4]])
46+
// CHECK: icmp ult i32 {{.*}}, [[T3]]
47+
elt *test(short s) {
48+
return new elt[s];
49+
}
50+
}
51+
52+
// test1 with an array cookie.
53+
namespace test2 {
54+
struct A {
55+
A();
56+
~A();
57+
int x;
58+
};
59+
60+
typedef A elt[100];
61+
62+
// CHECK: define [100 x [[A:%.*]]]* @_ZN5test24testEs(i16 signext
63+
// CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
64+
// CHECK-NEXT: [[T0:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
65+
// CHECK-NEXT: [[T1:%.*]] = extractvalue [[OVR_T]] [[T0]], 1
66+
// CHECK-NEXT: [[T2:%.*]] = extractvalue [[OVR_T]] [[T0]], 0
67+
// CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
68+
// CHECK-NEXT: [[T4:%.*]] = call [[OVR_T]] @llvm.uadd.with.overflow.i32(i32 [[T2]], i32 4)
69+
// CHECK-NEXT: [[T5:%.*]] = extractvalue [[OVR_T]] [[T4]], 1
70+
// CHECK-NEXT: [[T6:%.*]] = or i1 [[T1]], [[T5]]
71+
// CHECK-NEXT: [[T7:%.*]] = extractvalue [[OVR_T]] [[T4]], 0
72+
// CHECK-NEXT: [[T8:%.*]] = select i1 [[T6]], i32 -1, i32 [[T7]]
73+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T8]])
74+
// CHECK: icmp ult i32 {{.*}}, [[T3]]
75+
elt *test(short s) {
76+
return new elt[s];
77+
}
78+
}
79+
80+
// test0 with a 1-byte element.
81+
namespace test4 {
82+
struct A {
83+
A();
84+
};
85+
86+
typedef A elt;
87+
88+
// CHECK: define [[A:%.*]]* @_ZN5test44testEs(i16 signext
89+
// CHECK: [[N:%.*]] = sext i16 {{%.*}} to i32
90+
// CHECK-NEXT: [[T0:%.*]] = icmp slt i32 [[N]], 0
91+
// CHECK-NEXT: [[T1:%.*]] = select i1 [[T0]], i32 -1, i32 [[N]]
92+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T1]])
93+
// CHECK: icmp ult i32 {{.*}}, [[N]]
94+
elt *test(short s) {
95+
return new elt[s];
96+
}
97+
}
98+
99+
// test4 with no sext required.
100+
namespace test5 {
101+
struct A {
102+
A();
103+
};
104+
105+
typedef A elt;
106+
107+
// CHECK: define [[A:%.*]]* @_ZN5test54testEi(i32
108+
// CHECK: [[N:%.*]] = load i32*
109+
// CHECK-NEXT: [[T0:%.*]] = icmp slt i32 [[N]], 0
110+
// CHECK-NEXT: [[T1:%.*]] = select i1 [[T0]], i32 -1, i32 [[N]]
111+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T1]])
112+
// CHECK: icmp ult i32 {{.*}}, [[N]]
113+
elt *test(int s) {
114+
return new elt[s];
115+
}
116+
}
117+
118+
// test0 with an unsigned size.
119+
namespace test6 {
120+
struct A {
121+
A();
122+
int x;
123+
};
124+
125+
typedef A elt;
126+
127+
// CHECK: define [[A:%.*]]* @_ZN5test64testEt(i16 zeroext
128+
// CHECK: [[N:%.*]] = zext i16 {{%.*}} to i32
129+
// CHECK-NEXT: [[T0:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
130+
// CHECK-NEXT: [[T1:%.*]] = extractvalue [[OVR_T]] [[T0]], 1
131+
// CHECK-NEXT: [[T2:%.*]] = extractvalue [[OVR_T]] [[T0]], 0
132+
// CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
133+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T3]])
134+
// CHECK: icmp ult i32 {{.*}}, [[N]]
135+
elt *test(unsigned short s) {
136+
return new elt[s];
137+
}
138+
}
139+
140+
// test1 with an unsigned size.
141+
namespace test7 {
142+
struct A {
143+
A();
144+
int x;
145+
};
146+
147+
typedef A elt[100];
148+
149+
// CHECK: define [100 x [[A:%.*]]]* @_ZN5test74testEt(i16 zeroext
150+
// CHECK: [[N:%.*]] = zext i16 {{%.*}} to i32
151+
// CHECK-NEXT: [[T0:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[N]], i32 400)
152+
// CHECK-NEXT: [[T1:%.*]] = extractvalue [[OVR_T]] [[T0]], 1
153+
// CHECK-NEXT: [[T2:%.*]] = extractvalue [[OVR_T]] [[T0]], 0
154+
// CHECK-NEXT: [[T3:%.*]] = mul i32 [[N]], 100
155+
// CHECK-NEXT: [[T4:%.*]] = select i1 [[T1]], i32 -1, i32 [[T2]]
156+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T4]])
157+
// CHECK: icmp ult i32 {{.*}}, [[T3]]
158+
elt *test(unsigned short s) {
159+
return new elt[s];
160+
}
161+
}
162+
163+
// test0 with a signed type larger than size_t.
164+
namespace test8 {
165+
struct A {
166+
A();
167+
int x;
168+
};
169+
170+
typedef A elt;
171+
172+
// CHECK: define [[A:%.*]]* @_ZN5test84testEx(i64
173+
// CHECK: [[N:%.*]] = load i64*
174+
// CHECK-NEXT: [[T0:%.*]] = icmp uge i64 [[N]], 4294967296
175+
// CHECK-NEXT: [[T1:%.*]] = trunc i64 [[N]] to i32
176+
// CHECK-NEXT: [[T2:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[T1]], i32 4)
177+
// CHECK-NEXT: [[T3:%.*]] = extractvalue [[OVR_T]] [[T2]], 1
178+
// CHECK-NEXT: [[T4:%.*]] = or i1 [[T0]], [[T3]]
179+
// CHECK-NEXT: [[T5:%.*]] = extractvalue [[OVR_T]] [[T2]], 0
180+
// CHECK-NEXT: [[T6:%.*]] = select i1 [[T4]], i32 -1, i32 [[T5]]
181+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T6]])
182+
// CHECK: icmp ult i32 {{.*}}, [[T1]]
183+
elt *test(long long s) {
184+
return new elt[s];
185+
}
186+
}
187+
188+
// test8 with an unsigned type.
189+
namespace test9 {
190+
struct A {
191+
A();
192+
int x;
193+
};
194+
195+
typedef A elt;
196+
197+
// CHECK: define [[A:%.*]]* @_ZN5test94testEy(i64
198+
// CHECK: [[N:%.*]] = load i64*
199+
// CHECK-NEXT: [[T0:%.*]] = icmp uge i64 [[N]], 4294967296
200+
// CHECK-NEXT: [[T1:%.*]] = trunc i64 [[N]] to i32
201+
// CHECK-NEXT: [[T2:%.*]] = call [[OVR_T]] @llvm.umul.with.overflow.i32(i32 [[T1]], i32 4)
202+
// CHECK-NEXT: [[T3:%.*]] = extractvalue [[OVR_T]] [[T2]], 1
203+
// CHECK-NEXT: [[T4:%.*]] = or i1 [[T0]], [[T3]]
204+
// CHECK-NEXT: [[T5:%.*]] = extractvalue [[OVR_T]] [[T2]], 0
205+
// CHECK-NEXT: [[T6:%.*]] = select i1 [[T4]], i32 -1, i32 [[T5]]
206+
// CHECK-NEXT: call noalias i8* @_Znaj(i32 [[T6]])
207+
// CHECK: icmp ult i32 {{.*}}, [[T1]]
208+
elt *test(unsigned long long s) {
209+
return new elt[s];
210+
}
211+
}

clang/test/Sema/sign-conversion.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %clang_cc1 -fsyntax-only -verify -Wsign-conversion %s
2+
3+
// PR9345: make a subgroup of -Wconversion for signedness changes
4+
5+
void test(int x) {
6+
unsigned t0 = x; // expected-warning {{implicit conversion changes signedness}}
7+
unsigned t1 = (t0 == 5 ? x : 0); // expected-warning {{operand of ? changes signedness}}
8+
}

0 commit comments

Comments
 (0)