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!