Skip to content

Commit cdc0b77

Browse files
committed
Preliminary executable test for nested generic types
1 parent 4aa1aa7 commit cdc0b77

File tree

1 file changed

+92
-10
lines changed

1 file changed

+92
-10
lines changed

test/Interpreter/nested_generics.swift

Lines changed: 92 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
1-
// RUN: %target-run-simple-swift | FileCheck %s
1+
// RUN: mkdir -p %t
2+
// RUN: %target-build-swift %s -Xfrontend -enable-experimental-nested-generic-types -o %t/a.out
3+
// RUN: %target-run %t/a.out | FileCheck %s
24
// REQUIRES: executable_test
35

46
protocol MyPrintable {
57
func print()
68
}
79

8-
struct PrintableValue : MyPrintable {
9-
init(_ value: String) {
10-
self.value = value
10+
extension Int : MyPrintable {
11+
func print() {
12+
Swift.print(self, terminator: "")
1113
}
14+
}
1215

16+
extension String : MyPrintable {
1317
func print() {
14-
Swift.print(value, terminator: "")
18+
Swift.print(self, terminator: "")
1519
}
20+
}
1621

17-
var value: String
22+
extension Array : MyPrintable {
23+
func print() {
24+
Swift.print(self, terminator: "")
25+
}
1826
}
1927

2028
class Foo<T : MyPrintable> {
@@ -34,7 +42,81 @@ class Foo<T : MyPrintable> {
3442
}
3543

3644
// CHECK: init 1 two
37-
var foo = Foo<PrintableValue>(PrintableValue("1"), PrintableValue("two"))
38-
// CHECK: bar 3
39-
var c = PrintableValue("3")
40-
foo.bar(c)
45+
// CHECK: bar [1]
46+
var foo = Foo<Int>(1, "two")
47+
foo.bar([1])
48+
49+
struct OuterStruct<T : MyPrintable> {
50+
let t: T
51+
52+
struct InnerStruct<U : MyPrintable> {
53+
let u: U
54+
55+
func printBoth(t: T) {
56+
t.print()
57+
print(" ", terminator: "")
58+
u.print()
59+
}
60+
61+
static func printBoth(t: T, u: U) {
62+
t.print()
63+
print(" ", terminator: "")
64+
u.print()
65+
}
66+
67+
func printAllThree<V : MyPrintable>(t: T, v: V) {
68+
printBoth(t: t)
69+
print(" ", terminator: "")
70+
v.print()
71+
}
72+
}
73+
74+
class InnerClass<U : MyPrintable> {
75+
let u: U
76+
77+
init(u: U) {
78+
self.u = u
79+
}
80+
81+
func printBoth(t: T) {
82+
t.print()
83+
print(" ", terminator: "")
84+
u.print()
85+
}
86+
87+
static func printBoth(t: T, u: U) {
88+
t.print()
89+
print(" ", terminator: "")
90+
u.print()
91+
}
92+
93+
func printAllThree<V : MyPrintable>(t: T, v: V) {
94+
printBoth(t: t)
95+
print(" ", terminator: "")
96+
v.print()
97+
}
98+
}
99+
}
100+
101+
class SubClass<X : MyPrintable, Y : MyPrintable> : OuterStruct<Y>.InnerClass<X> {
102+
override func printBoth(t: Y) {
103+
print("override ", terminator: "")
104+
super.printBoth(t: t)
105+
}
106+
107+
// FIXME: Does not work!
108+
/* override func printAllThree<Z : MyPrintable>(t: Y, v: Z) {
109+
print("super ", terminator: "")
110+
super.printAllThree(t: t, v: v)
111+
} */
112+
}
113+
114+
// CHECK: 1 two
115+
// CHECK: 1 two
116+
// CHECK: 1 two [3]
117+
OuterStruct<Int>.InnerStruct<String>(u: "two").printBoth(t: 1)
118+
OuterStruct<Int>.InnerStruct<String>.printBoth(t: 1, u: "two")
119+
OuterStruct<Int>.InnerStruct<String>(u: "two").printAllThree(t: 1, v: [3])
120+
121+
// CHECK: override 1 two [3]
122+
SubClass<String, Int>(u: "two").printAllThree(t: 1, v: [3])

0 commit comments

Comments
 (0)