| // RUN: %target-swift-frontend -emit-silgen -enable-sil-ownership %s -verify |
| |
| // We just want to SILGen this and ensure it doesn't crash. Don't particularly |
| // care about the generated SIL. |
| |
| // Inheritance of unnamed parameters. |
| class SuperUnnamed { |
| init(int _: Int) { } |
| init(_ : Double) { } |
| |
| init(string _: String) { } |
| init(_ : Float) { } |
| } |
| |
| class SubUnnamed : SuperUnnamed { } |
| |
| func testSubUnnamed(_ i: Int, d: Double, s: String, f: Float) { |
| _ = SubUnnamed(int: i) |
| _ = SubUnnamed(d) |
| _ = SubUnnamed(string: s) |
| _ = SubUnnamed(f) |
| } |
| |
| // rdar://problem/17960407 - Inheritance of initializers for generic types |
| class ConcreteBase { |
| required init(i: Int) {} |
| } |
| |
| class GenericDerived<T> : ConcreteBase {} |
| |
| class GenericBase<T> { |
| required init(t: T) {} |
| } |
| |
| class GenericDerived2<U> : GenericBase<(U, U)> {} |
| |
| class ConcreteDerived : GenericBase<Int> {} |
| |
| func testGenericInheritance() { |
| _ = GenericDerived<Int>(i: 10) |
| _ = GenericDerived2<Int>(t: (10, 100)) |
| _ = ConcreteDerived(t: 1000) |
| } |
| |
| // rdar://problem/34789779 - Inheritance of initializers with inout parameters |
| public class Node { |
| var data : Data |
| |
| public struct Data { |
| var index: Int32 = 0// for helpers |
| } |
| |
| init(data: inout Data/*, context: Context*/) { |
| self.data = data |
| } |
| |
| public required init(node: Node) { |
| data = node.data |
| } |
| } |
| |
| class SubNode : Node { |
| var a: Int |
| |
| required init(node: Node) { |
| a = 1 |
| super.init(node: node) |
| } |
| |
| init(data: inout Data, additionalParam: Int) { |
| a = additionalParam |
| super.init(data: &data) |
| } |
| } |
| |
| class GenericSubNode<T> : SubNode { |
| required init(node: Node) { |
| super.init(node: node) |
| } |
| |
| init(data: inout Data, value: T) { |
| super.init(data: &data, additionalParam: 1) |
| } |
| } |
| |
| protocol HasValue { |
| associatedtype Value |
| func getValue() -> Value |
| } |
| |
| class GenericWrapperNode<T : HasValue> : GenericSubNode<T.Value> { |
| required init(node: Node) { |
| super.init(node: node) |
| } |
| |
| init(data: inout Data, otherValue: T) { |
| super.init(data: &data, value: otherValue.getValue()) |
| } |
| } |
| |
| // https://bugs.swift.org/browse/SR-3848 - Initializer with generic parameter |
| protocol P { |
| associatedtype T |
| } |
| |
| struct S<T> : P {} |
| |
| class Outer<T> { |
| class Inner<U> where U : P { |
| init<V>(_: V) where V : P, V.T == U {} |
| } |
| } |
| |
| class Derived<X> : Outer<X>.Inner<S<X>> {} |
| |
| protocol Q { |
| associatedtype A |
| associatedtype B |
| } |
| |
| class Twice<X, Y> { |
| init<Z>(_: Z) where Z : Q, Z.A == X, Z.B == Y, X == Y {} |
| } |
| |
| class Pair<T, U> : Twice<T, U> {} |
| |
| class Once<T> : Twice<T, T> {} |