Files
swift-mirror/validation-test/compiler_crashers_2_fixed/rdar56398071.swift
Slava Pestov 8edf4264ae GSB: Better handling of unresolved DependentMemberTypes in maybeResolveEquivalenceClass()
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>.
2021-02-11 16:33:35 -05:00

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
}
}