blob: 4eb682b10fac9b2258fd2e93199d70e38f843742 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
//TEST:SIMPLE(filecheck=CHECK):
//TEST:INTERPRET(filecheck=ICHECK):
interface MyInterface
{
associatedtype CompatibilityClass;
__generic <Other : MyInterface>
This f(Other other) where Other::CompatibilityClass == This::CompatibilityClass;
__generic <Other : MyInterface>
This g(Other other) where This::CompatibilityClass == Other::CompatibilityClass;
CompatibilityClass toCompat();
};
struct MyCompatibilityClass {};
__generic <T>
struct MyStruct : MyInterface
{
typealias CompatibilityClass = MyCompatibilityClass;
__generic <Other : MyInterface>
This f(Other other) where CompatibilityClass == Other::CompatibilityClass
{
return this;
}
__generic <Other : MyInterface>
This g(Other other) where MyCompatibilityClass == Other::CompatibilityClass
{
return this;
}
CompatibilityClass toCompat()
{
return MyCompatibilityClass();
}
};
struct TestInt : MyInterface
{
typealias CompatibilityClass = int;
int value;
__init(int v)
{
value = v;
}
__generic <Other : MyInterface>
This f(Other other) where CompatibilityClass == Other::CompatibilityClass
{
return this;
}
__generic <Other : MyInterface>
This g(Other other) where int == Other::CompatibilityClass
{
return this;
}
int toCompat()
{
return value;
}
}
__generic <T : MyInterface>
void test(T t)
where int == T::CompatibilityClass
{
printf("Success x %d!", t.toCompat());
}
void main()
{
TestInt t = TestInt(12);
test(t);
}
// CHECK-NOT: 30402
// CHECK-NOT: 30404
// CHECK-NOT: 30405
// ICHECK: Success x 12!
|