Skip to content

Commit 3f36ecf

Browse files
committed
Add a regression test for a GSB crasher
From rdar://56673657
1 parent 0a262fc commit 3f36ecf

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// RUN: not --crash %target-swift-frontend -primary-file %s -emit-silgen
2+
3+
// REQUIRES: asserts
4+
5+
public protocol WrappedSignedInteger: SignedInteger where Stride == Int {
6+
typealias WrappedInteger = Int
7+
8+
var wrappedNumber: WrappedInteger { get set }
9+
init(wrappedNumber: WrappedInteger)
10+
}
11+
12+
public extension WrappedSignedInteger {
13+
typealias IntegerLiteralType = WrappedInteger.IntegerLiteralType
14+
typealias Magnitude = WrappedInteger.Magnitude
15+
typealias Words = WrappedInteger.Words
16+
17+
// MARK: - Initializers -
18+
19+
init<T>(_ source: T) where T : BinaryInteger {
20+
self.init(wrappedNumber: WrappedInteger(source))
21+
}
22+
23+
init<T>(truncatingIfNeeded source: T) where T : BinaryInteger {
24+
self.init(wrappedNumber: WrappedInteger(source))
25+
}
26+
27+
init?<T>(exactly source: T) where T : BinaryFloatingPoint {
28+
if let wrappedNumber = WrappedInteger(exactly: source) {
29+
self.init(wrappedNumber: wrappedNumber)
30+
} else {
31+
return nil
32+
}
33+
}
34+
35+
init<T>(_ source: T) where T : BinaryFloatingPoint {
36+
self.init(wrappedNumber: WrappedInteger(source))
37+
}
38+
39+
init<T>(clamping source: T) where T : BinaryInteger {
40+
self.init(wrappedNumber: WrappedInteger(source))
41+
}
42+
43+
init?<T>(exactly source: T) where T : BinaryInteger {
44+
if let wrappedNumber = WrappedInteger(exactly: source) {
45+
self.init(wrappedNumber: wrappedNumber)
46+
} else {
47+
return nil
48+
}
49+
}
50+
51+
init(integerLiteral wrappedNumber: WrappedInteger.IntegerLiteralType) {
52+
let wrapped = WrappedInteger(integerLiteral: wrappedNumber)
53+
self.init(wrappedNumber: wrapped)
54+
}
55+
56+
// MARK: - Stride -
57+
58+
func advanced(by n: Int) -> Self {
59+
.init(wrappedNumber: wrappedNumber + n)
60+
}
61+
62+
func distance(to other: Self) -> Self.Stride {
63+
other.wrappedNumber - wrappedNumber
64+
}
65+
66+
// MARK: - Properties -
67+
68+
var magnitude: WrappedInteger.Magnitude {
69+
wrappedNumber.magnitude
70+
}
71+
72+
var words: WrappedInteger.Words {
73+
wrappedNumber.words
74+
}
75+
76+
var bitWidth: Int {
77+
wrappedNumber.bitWidth
78+
}
79+
80+
var trailingZeroBitCount: Int {
81+
wrappedNumber.trailingZeroBitCount
82+
}
83+
84+
// MARK: - Operators -
85+
86+
static func <<= <RHS>(lhs: inout Self, rhs: RHS) where RHS : BinaryInteger {
87+
lhs.wrappedNumber <<= rhs
88+
}
89+
90+
static func >>= <RHS>(lhs: inout Self, rhs: RHS) where RHS : BinaryInteger {
91+
lhs.wrappedNumber >>= rhs
92+
}
93+
94+
static prefix func ~ (x: Self) -> Self {
95+
.init(wrappedNumber: ~x.wrappedNumber)
96+
}
97+
98+
static func / (lhs: Self, rhs: Self) -> Self {
99+
.init(wrappedNumber: lhs.wrappedNumber / rhs.wrappedNumber)
100+
}
101+
102+
static func /= (lhs: inout Self, rhs: Self) {
103+
lhs.wrappedNumber /= rhs.wrappedNumber
104+
}
105+
106+
static func % (lhs: Self, rhs: Self) -> Self {
107+
.init(wrappedNumber: lhs.wrappedNumber % rhs.wrappedNumber)
108+
}
109+
110+
static func %= (lhs: inout Self, rhs: Self) {
111+
lhs.wrappedNumber %= rhs.wrappedNumber
112+
}
113+
114+
static func &= (lhs: inout Self, rhs: Self) {
115+
lhs.wrappedNumber &= rhs.wrappedNumber
116+
}
117+
118+
static func |= (lhs: inout Self, rhs: Self) {
119+
lhs.wrappedNumber |= rhs.wrappedNumber
120+
}
121+
122+
static func ^= (lhs: inout Self, rhs: Self) {
123+
lhs.wrappedNumber ^= rhs.wrappedNumber
124+
}
125+
126+
static func + (lhs: Self, rhs: Self) -> Self {
127+
.init(wrappedNumber: lhs.wrappedNumber + rhs.wrappedNumber)
128+
}
129+
130+
static func += (lhs: inout Self, rhs: Self) {
131+
lhs.wrappedNumber += rhs.wrappedNumber
132+
}
133+
134+
static func - (lhs: Self, rhs: Self) -> Self {
135+
.init(wrappedNumber: lhs.wrappedNumber - rhs.wrappedNumber)
136+
}
137+
138+
static func -= (lhs: inout Self, rhs: Self) {
139+
lhs.wrappedNumber -= rhs.wrappedNumber
140+
}
141+
142+
static func * (lhs: Self, rhs: Self) -> Self {
143+
.init(wrappedNumber: lhs.wrappedNumber * rhs.wrappedNumber)
144+
}
145+
146+
static func *= (lhs: inout Self, rhs: Self) {
147+
lhs.wrappedNumber *= rhs.wrappedNumber
148+
}
149+
150+
}
151+

0 commit comments

Comments
 (0)