mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
A DependentMemberType can either have a bound AssociatedTypeDecl, or it might be 'unresolved' and only store an identifier. In maybeResolveEquivalenceClass(), we did not handle the unresolved case when the base type of the DependentMemberType had itself been resolved to a concrete type. Fixes <rdar://problem/71162777>.
150 lines
3.9 KiB
Swift
150 lines
3.9 KiB
Swift
// RUN: %target-swift-frontend -primary-file %s -emit-ir
|
|
|
|
public protocol WrappedSignedInteger: SignedInteger where Stride == Int {
|
|
typealias WrappedInteger = Int
|
|
|
|
var wrappedNumber: WrappedInteger { get set }
|
|
init(wrappedNumber: WrappedInteger)
|
|
}
|
|
|
|
public extension WrappedSignedInteger {
|
|
typealias IntegerLiteralType = WrappedInteger.IntegerLiteralType
|
|
typealias Magnitude = WrappedInteger.Magnitude
|
|
typealias Words = WrappedInteger.Words
|
|
|
|
// MARK: - Initializers -
|
|
|
|
init<T>(_ source: T) where T : BinaryInteger {
|
|
self.init(wrappedNumber: WrappedInteger(source))
|
|
}
|
|
|
|
init<T>(truncatingIfNeeded source: T) where T : BinaryInteger {
|
|
self.init(wrappedNumber: WrappedInteger(source))
|
|
}
|
|
|
|
init?<T>(exactly source: T) where T : BinaryFloatingPoint {
|
|
if let wrappedNumber = WrappedInteger(exactly: source) {
|
|
self.init(wrappedNumber: wrappedNumber)
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
init<T>(_ source: T) where T : BinaryFloatingPoint {
|
|
self.init(wrappedNumber: WrappedInteger(source))
|
|
}
|
|
|
|
init<T>(clamping source: T) where T : BinaryInteger {
|
|
self.init(wrappedNumber: WrappedInteger(source))
|
|
}
|
|
|
|
init?<T>(exactly source: T) where T : BinaryInteger {
|
|
if let wrappedNumber = WrappedInteger(exactly: source) {
|
|
self.init(wrappedNumber: wrappedNumber)
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
init(integerLiteral wrappedNumber: WrappedInteger.IntegerLiteralType) {
|
|
let wrapped = WrappedInteger(integerLiteral: wrappedNumber)
|
|
self.init(wrappedNumber: wrapped)
|
|
}
|
|
|
|
// MARK: - Stride -
|
|
|
|
func advanced(by n: Int) -> Self {
|
|
.init(wrappedNumber: wrappedNumber + n)
|
|
}
|
|
|
|
func distance(to other: Self) -> Self.Stride {
|
|
other.wrappedNumber - wrappedNumber
|
|
}
|
|
|
|
// MARK: - Properties -
|
|
|
|
var magnitude: WrappedInteger.Magnitude {
|
|
wrappedNumber.magnitude
|
|
}
|
|
|
|
var words: WrappedInteger.Words {
|
|
wrappedNumber.words
|
|
}
|
|
|
|
var bitWidth: Int {
|
|
wrappedNumber.bitWidth
|
|
}
|
|
|
|
var trailingZeroBitCount: Int {
|
|
wrappedNumber.trailingZeroBitCount
|
|
}
|
|
|
|
// MARK: - Operators -
|
|
|
|
static func <<= <RHS>(lhs: inout Self, rhs: RHS) where RHS : BinaryInteger {
|
|
lhs.wrappedNumber <<= rhs
|
|
}
|
|
|
|
static func >>= <RHS>(lhs: inout Self, rhs: RHS) where RHS : BinaryInteger {
|
|
lhs.wrappedNumber >>= rhs
|
|
}
|
|
|
|
static prefix func ~ (x: Self) -> Self {
|
|
.init(wrappedNumber: ~x.wrappedNumber)
|
|
}
|
|
|
|
static func / (lhs: Self, rhs: Self) -> Self {
|
|
.init(wrappedNumber: lhs.wrappedNumber / rhs.wrappedNumber)
|
|
}
|
|
|
|
static func /= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber /= rhs.wrappedNumber
|
|
}
|
|
|
|
static func % (lhs: Self, rhs: Self) -> Self {
|
|
.init(wrappedNumber: lhs.wrappedNumber % rhs.wrappedNumber)
|
|
}
|
|
|
|
static func %= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber %= rhs.wrappedNumber
|
|
}
|
|
|
|
static func &= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber &= rhs.wrappedNumber
|
|
}
|
|
|
|
static func |= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber |= rhs.wrappedNumber
|
|
}
|
|
|
|
static func ^= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber ^= rhs.wrappedNumber
|
|
}
|
|
|
|
static func + (lhs: Self, rhs: Self) -> Self {
|
|
.init(wrappedNumber: lhs.wrappedNumber + rhs.wrappedNumber)
|
|
}
|
|
|
|
static func += (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber += rhs.wrappedNumber
|
|
}
|
|
|
|
static func - (lhs: Self, rhs: Self) -> Self {
|
|
.init(wrappedNumber: lhs.wrappedNumber - rhs.wrappedNumber)
|
|
}
|
|
|
|
static func -= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber -= rhs.wrappedNumber
|
|
}
|
|
|
|
static func * (lhs: Self, rhs: Self) -> Self {
|
|
.init(wrappedNumber: lhs.wrappedNumber * rhs.wrappedNumber)
|
|
}
|
|
|
|
static func *= (lhs: inout Self, rhs: Self) {
|
|
lhs.wrappedNumber *= rhs.wrappedNumber
|
|
}
|
|
|
|
}
|
|
|