mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The maybeResolveEquivalenceClass() method can deallocate equivalence classes, because it calls updateNestedTypeForConformance(), which calls addSameTypeRequirement(). Therefore, the EquivalenceClass stored inside a ResolvedType could become invalid across calls to maybeResolveEquivalenceClass(). This was a problem in one place in particular, when adding a new same-type constraint between two type parameters. Fix this by not caching the equivalence class of a PotentialArchetype in the ResolvedType implementation. The only time an equivalence class is now stored is when returning an unresolved type, which is acted upon immediately. Fixes <https://bugs.swift.org/browse/SR-12812>, <rdar://problem/63422600>.
88 lines
2.4 KiB
Swift
88 lines
2.4 KiB
Swift
// RUN: %target-swift-frontend -emit-ir %s
|
|
|
|
public protocol DefaultInitializable {
|
|
init()
|
|
}
|
|
|
|
public protocol AdjacencyEdge_ {
|
|
associatedtype VertexID: Equatable
|
|
associatedtype Properties
|
|
|
|
var destination: VertexID { get set }
|
|
var properties: Properties { get set }
|
|
}
|
|
|
|
public struct AdjacencyEdge<VertexID: Equatable, Properties>: AdjacencyEdge_ {
|
|
public var destination: VertexID
|
|
public var properties: Properties
|
|
}
|
|
|
|
public protocol AdjacencyVertex_ {
|
|
associatedtype Edges: Collection where Edges.Element: AdjacencyEdge_
|
|
associatedtype Properties
|
|
|
|
var edges: Edges { get set }
|
|
var properties: Properties { get set }
|
|
}
|
|
|
|
public struct AdjacencyVertex<Edges: Collection, Properties> : AdjacencyVertex_
|
|
where Edges.Element: AdjacencyEdge_
|
|
{
|
|
public var edges: Edges
|
|
public var properties: Properties
|
|
}
|
|
|
|
public protocol BinaryFunction {
|
|
associatedtype Parameter0
|
|
associatedtype Parameter1
|
|
associatedtype Result
|
|
|
|
func callAsFunction(_: Parameter0, _: Parameter1) -> Result
|
|
}
|
|
|
|
public struct GeneralAdjacencyList<
|
|
Spine: Collection, VertexIDToIndex: BinaryFunction
|
|
>
|
|
where Spine.Element : AdjacencyVertex_,
|
|
VertexIDToIndex.Parameter0 == Spine,
|
|
VertexIDToIndex.Parameter1 == Spine.Element.Edges.Element.VertexID,
|
|
VertexIDToIndex.Result == Spine.Index
|
|
{
|
|
public let vertexIDToIndex: VertexIDToIndex
|
|
public var spine: Spine
|
|
}
|
|
|
|
public struct IdentityVertexIDToIndex<Spine: Collection>: BinaryFunction
|
|
where Spine.Element : AdjacencyVertex_,
|
|
Spine.Element.Edges.Element.VertexID == Spine.Index
|
|
{
|
|
public func callAsFunction(_: Spine, _ id: Spine.Index) -> Spine.Index {
|
|
return id
|
|
}
|
|
}
|
|
|
|
public extension GeneralAdjacencyList {
|
|
typealias VertexID = VertexIDToIndex.Parameter1
|
|
typealias VertexProperties = Spine.Element.Properties
|
|
typealias EdgeProperties = Spine.Element.Edges.Element.Properties
|
|
|
|
struct EdgeID: Equatable {
|
|
/// The source vertex.
|
|
let source: VertexIDToIndex.Parameter1
|
|
/// The position of the edge in `source`'s list of edges.
|
|
let targetIndex: Spine.Index
|
|
}
|
|
}
|
|
|
|
public extension GeneralAdjacencyList
|
|
where VertexIDToIndex == IdentityVertexIDToIndex<Spine>,
|
|
Spine: RangeReplaceableCollection,
|
|
Spine.Element.Edges: RangeReplaceableCollection
|
|
& BidirectionalCollection // Because https://bugs.swift.org/browse/SR-12810
|
|
{
|
|
func addVertex(storing properties: VertexProperties) -> VertexID {
|
|
return spine.indices.first!
|
|
}
|
|
}
|
|
|