Files
swift-mirror/validation-test/compiler_crashers_2_fixed/0013-rdar19519590.swift
Doug Gregor 87b4eeccf3 Make same-type requirements prefer to be rooted at outer generic parameters.
All archetypes from outer scopes are fixed (as a lame implementation
restriction), so same-type constraints that involve archetypes from
outer scopres should treat the archetypes from outer scopes as the
representative. Do so, and start eliminating the notion of a "primary"
archetype that was preventing this fix from occurring earlier, so that
"all archetypes" and the set of requirements generated from the
archetype builder still line up.

Fixes rdar://problem/19519590.

Swift SVN r29869
2015-07-02 00:08:24 +00:00

69 lines
2.6 KiB
Swift

// RUN: %target-swift-frontend %s -emit-ir
protocol SourceTargetTransformable {
typealias Source
typealias Target
typealias Transformer = Source -> Target
}
struct PiecewiseTransformedGeneratorOf<
Source,
Target,
SourceGenerator: GeneratorType,
TransformerGenerator: GeneratorType,
Transformable: SourceTargetTransformable
where
Transformable.Source == Source,
Transformable.Target == Target,
SourceGenerator.Element == Source,
TransformerGenerator.Element == Transformable.Transformer
>
: GeneratorType {
typealias Element = Target
var sourceGenerator: SourceGenerator
var transformerGenerator: TransformerGenerator
mutating func next() -> Element? {
let source: Transformable.Source? = sourceGenerator.next()
if let source: Transformable.Source = source {
let transformer: Transformable.Transformer? = transformerGenerator.next()
if let transformer: Transformable.Transformer = transformer {
let tfunc: (Source -> Target)? = transformer as? (Source -> Target)
if let tfunc = tfunc {
return tfunc(source)
}
}
}
return nil
}
}
struct PiecewiseTransformedSequenceOf<
SourceSequence: SequenceType,
TransformerSequence: SequenceType,
Transformable: SourceTargetTransformable
where
SourceSequence.Generator.Element == Transformable.Source,
TransformerSequence.Generator.Element == Transformable.Transformer
>: SequenceType {
typealias Source = SourceSequence.Generator.Element
typealias Target = Transformable.Target
typealias Generator = PiecewiseTransformedGeneratorOf<Source, Target, SourceSequence.Generator, TransformerSequence.Generator, Transformable>
let inputs: SourceSequence
let transformers: TransformerSequence
init(inputs: SourceSequence, transformers: TransformerSequence) {
self.inputs = inputs
self.transformers = transformers
}
func generate() -> Generator {
return PiecewiseTransformedGeneratorOf(sourceGenerator: inputs.generate(), transformerGenerator: transformers.generate())
}
}