// RUN: %target-parse-verify-swift protocol P1 { associatedtype 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 { } extension Int : P1 { typealias AssocType = Int } extension Double : P2 { typealias AssocType = Double } extension X { } // expected-error{{constrained extension must be declared on the unspecialized generic type 'X' with constraints specified by a 'where' clause}} // 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 { associatedtype 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: [(Element, Element)] { get { return [] } } } // rdar://problem/21001937 struct GenericOverloads { var t: T var u: U init(t: T, u: U) { self.t = t; self.u = u } func foo() { } var prop: Int { return 0 } subscript (i: Int) -> Int { return i } } extension GenericOverloads where T : P1, U : P2 { init(t: T, u: U) { self.t = t; self.u = u } func foo() { } var prop: Int { return 1 } subscript (i: Int) -> Int { return i } } extension Array where Element : Hashable { var worseHashEver: Int { var result = 0 for elt in self { result = (result << 1) ^ elt.hashValue } return result } } func notHashableArray(x: [T]) { x.worseHashEver // expected-error{{type 'T' does not conform to protocol 'Hashable'}} } func hashableArray(x: [T]) { x.worseHashEver // okay } func intArray(x: [Int]) { x.worseHashEver } class GenericClass { } extension GenericClass where T : Equatable { func foo(x: T, y: T) -> Bool { return x == y } } func genericClassEquatable(gc: GenericClass, x: T, y: T) { gc.foo(x, y: y) } func genericClassNotEquatable(gc: GenericClass, x: T, y: T) { gc.foo(x, y: y) // expected-error{{type 'T' does not conform to protocol 'Equatable'}} } // FIXME: Future direction extension Array where Element == String { } // expected-error{{same-type requirement makes generic parameter 'Element' non-generic}} extension GenericClass : P3 where T : P3 { } // expected-error{{extension of type 'GenericClass' with constraints cannot have an inheritance clause}} extension GenericClass where Self : P3 { } // expected-error@-1{{'Self' is only available in a protocol or as the result of a method in a class; did you mean 'GenericClass'?}} {{30-34=GenericClass}} // expected-error@-2{{type 'GenericClass' in conformance requirement does not refer to a generic parameter or associated type}} protocol P4 { associatedtype T init(_: T) } protocol P5 { } struct S4: P4 { init(_: Q) { } } extension S4 where T : P5 {} // expected-error{{type 'T' in conformance requirement does not refer to a generic parameter or associated type}}