| // RUN: %target-run-simple-swift | %FileCheck %s |
| // REQUIRES: executable_test |
| |
| struct BigStruct { var a,b,c,d,e,f,g,h:Int } |
| |
| // FIXME: missing symbol for Object destructor? |
| //class SomeClass : Object { } |
| |
| func id<T>(_ x: T) -> T { |
| return x |
| } |
| |
| var int = id(1) |
| var bigStruct = id(BigStruct(a: 1, b: 2,c: 3, d: 4, e: 5, f: 6, g: 7, h: 8)) |
| //var someClass = SomeClass() |
| //var someClass2 = id(someClass) |
| |
| func print(_ bs: BigStruct) { |
| // FIXME: typechecker is too slow to handle this as an interpolated literal |
| print("BigStruct(", terminator: "") |
| print(bs.a, terminator: "") |
| print(", ", terminator: "") |
| print(bs.b, terminator: "") |
| print(", ", terminator: "") |
| print(bs.c, terminator: "") |
| print(", ", terminator: "") |
| print(bs.d, terminator: "") |
| print(", ", terminator: "") |
| print(bs.e, terminator: "") |
| print(", ", terminator: "") |
| print(bs.f, terminator: "") |
| print(", ", terminator: "") |
| print(bs.g, terminator: "") |
| print(", ", terminator: "") |
| print(bs.h, terminator: "") |
| print(")") |
| } |
| |
| // CHECK: 1 |
| print(int) |
| // CHECK: BigStruct(1, 2, 3, 4, 5, 6, 7, 8) |
| print(bigStruct) |
| |
| // FIXME: missing symbol for Object destructor? |
| // C/HECK: true |
| //print(someClass === someClass2) |
| |
| |
| //===---- |
| // Check overload resolution of generic functions. |
| //===---- |
| |
| protocol P1 {} |
| protocol P2 : P1 {} |
| protocol P3 : P2 {} |
| |
| struct S1 : P1 {} |
| struct S2 : P2 {} |
| struct S3 : P3 {} |
| |
| func foo1<T : P1>(_ x: T) { print("P1") } |
| func foo1<T : P2>(_ x: T) { print("P2") } |
| func foo1<T : P3>(_ x: T) { print("P3") } |
| |
| func foo2<T : P1>(_ x: T) { print("P1") } |
| func foo2<T : P2>(_ x: T) { print("P2") } |
| |
| func foo3<T : P1>(_ x: T) { print("P1") } |
| func foo3<T : P3>(_ x: T) { print("P3") } |
| |
| func foo4<T : P3, U : P1>(_ x: T, _ y: U) { print("P3, P1") } |
| func foo4<T : P3, U : P3>(_ x: T, _ y: U) { print("P3, P3") } |
| |
| func checkOverloadResolution() { |
| print("overload resolution:") |
| // CHECK-LABEL: overload resolution |
| |
| foo1(S1()) // CHECK-NEXT: P1 |
| foo1(S2()) // CHECK-NEXT: P2 |
| foo1(S3()) // CHECK-NEXT: P3 |
| |
| foo2(S1()) // CHECK-NEXT: P1 |
| foo2(S2()) // CHECK-NEXT: P2 |
| foo2(S3()) // CHECK-NEXT: P2 |
| |
| foo3(S1()) // CHECK-NEXT: P1 |
| foo3(S2()) // CHECK-NEXT: P1 |
| foo3(S3()) // CHECK-NEXT: P3 |
| |
| foo4(S3(), S1()) // CHECK-NEXT: P3, P1 |
| foo4(S3(), S2()) // CHECK-NEXT: P3, P1 |
| foo4(S3(), S3()) // CHECK-NEXT: P3, P3 |
| } |
| checkOverloadResolution() |
| |
| class Base { |
| var v = 0 |
| required init() {} |
| func map() { |
| v = 1 |
| } |
| } |
| |
| class D1 : Base { |
| required init() {} |
| override func map() { |
| v = 2 |
| } |
| } |
| |
| func parse<T:Base>() -> T { |
| let inst = T() |
| inst.map() |
| return inst |
| } |
| |
| var m : D1 = parse() |
| |
| print(m.v) |
| // CHECK: 2 |
| |
| // rdar://problem/21770225 - infinite recursion with metadata |
| // instantiation when associated type contains Self |
| |
| struct MySlice<T : MyIndexableType> : MySequenceType {} |
| struct MyMutableSlice<T : MyMutableCollectionType> : MySequenceType {} |
| |
| protocol MySequenceType {} |
| protocol MyIndexableType {} |
| |
| protocol MyCollectionType : MySequenceType, MyIndexableType { |
| associatedtype SubSequence = MySlice<Self> |
| } |
| protocol MyMutableCollectionType : MyCollectionType { |
| associatedtype SubSequence = MyMutableSlice<Self> |
| } |
| |
| struct S : MyMutableCollectionType {} |
| |
| // CHECK: MyMutableSlice<S>() |
| print(S.SubSequence()) |
| |
| // CHECK: MyMutableSlice<S> |
| print(S.SubSequence.self) |