Generic Constraints Can SegFault the Compiler
| Originator: | nathaniel.chandler | ||
| Number: | rdar://19519590 | Date Originated: | 01/19/2015 |
| Status: | Closed | Resolved: | 07/21/2015 |
| Product: | Developer Tools | Product Version: | Xcode 6A1052d and Xcode 6C86e |
| Classification: | Reproducible: | Always |
Summary:
The following code causes the compiler to segfault:
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())
}
}
Steps to Reproduce:
1. Create a new Command Line project in Xcode
2. Paste in the following code to main.swift:
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())
}
}
3. Build.
4. Notice that the compiler segfaults.
Expected Results:
The compiler doesn't segfault.
Actual Results:
The compiler does in fact segfault.
Version:
Xcode 6A1052d and Xcode 6C86e
Notes:
Configuration:
Code consistently causes segfault.
Attachments:
Comments
Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!