Commits

Slava Pestov committed 5841cb07a11
Sema: Fix type safety hole with inherited conformances When checking for permitted uses of Self in the input type of a protocol requirement's function type, if the parameter itself was a function we would recurse into its input, and reject all uses of Self in the parameter type's result. This was the wrong way around, and in fact we should recurse into the result. Here is a test case that used to compile successfully and crash; now it is rejected by the type checker: protocol P { func f(a: Self -> ()) } protocol Q : P { func g() } class C : P { func f(a: C -> ()) { // should not be allowed to witness P.f a(C()) } } class B : C, Q { var x: Int = 17 func g() { print(x) } } func f<T : Q>(t: T) { // T == B here // t.f has type <T : Q> (T -> ()) -> () t.f({ $0.g() }) // but at runtime, $0 is a C not a B } f(B())