// RUN: %target-parse-verify-swift protocol P1 { typealias AssocType } protocol P2 : P1 { } protocol P3 { } struct X { struct Inner { } // expected-error{{generic type 'Inner' nested in type}} struct NonGenericInner { } // expected-error{{nested in generic type}} } struct Y { struct Inner { } // expected-error{{generic type 'Inner' nested in type}} struct NonGenericInner { } } struct Z { } // Okay: exact match. extension X { } extension Z { } // Okay: infer missing requirements extension X { } extension X { } extension X { } extension Z { } extension Z { } // Bad: extra requirements. extension X { } // expected-error{{extension of generic type 'X' cannot add requirements}} extension X { } // expected-error{{extension of generic type 'X' cannot add requirements}} // Bad: wrong number of generic parameters. extension X { } // expected-error{{extension of generic type 'X' has too few generic parameters (have 1, expected 3)}} extension X { } // expected-error{{extension of generic type 'X' has too many generic parameters (have 4, expected 3)}} // Name lookup of generic parameters. extension X { // Okay: generic parameters from the extension. func foo(x: A) -> (B, C) { } // Okay: associated types of the generic parameters func bar(x: A.AssocType) { } // Ill-formed: generic parameters from the extended type. func wibble(x: T) { } // expected-error{{use of undeclared type 'T'}} } // Using generic extensions (basic). func f1(x: X, a: A, assoc: A.AssocType, _: D, _: E) { var (b, c): (B, C) = x.foo(a) x.bar(assoc) } // Lvalue check when the archetypes are not the same. struct LValueCheck { let x = 0 } extension LValueCheck { init(newY: Int) { x = 42 } } // Member type references into another extension. struct MemberTypeCheckA { } protocol MemberTypeProto { typealias AssocType func foo(a: AssocType) init(_ assoc: MemberTypeCheckA) } struct MemberTypeCheckB : MemberTypeProto { func foo(a: T) {} typealias Element = T var t1: T } extension MemberTypeCheckB { typealias Underlying = MemberTypeCheckA } extension MemberTypeCheckB { init(_ x: Underlying) { } } extension MemberTypeCheckB { var t2: Element { return t1 } } // rdar://problem/19795284 extension Array { var pairs: [(T,T)] { get { return [] } } }