// RUN: %target-typecheck-verify-swift // RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s protocol P {} class C {} class X : U {} class Y : V {} class Z : W {} protocol U { associatedtype T : P } protocol V { associatedtype T : C } protocol W { associatedtype T : AnyObject } // CHECK-LABEL: .derivedViaConcreteX1@ // CHECK-NEXT: Generic signature: , B : P> func derivedViaConcreteX1(_: A, _: B) where A : U, A : X {} // CHECK-LABEL: .derivedViaConcreteX2@ // CHECK-NEXT: Generic signature: , B : P> func derivedViaConcreteX2(_: A, _: B) where A : U, B : P, A : X {} // CHECK-LABEL: .derivedViaConcreteY1@ // CHECK-NEXT: Generic signature: , B : C> func derivedViaConcreteY1(_: A, _: B) where A : V, A : Y {} // CHECK-LABEL: .derivedViaConcreteY2@ // CHECK-NEXT: Generic signature: , B : C> func derivedViaConcreteY2(_: A, _: B) where A : V, B : C, A : Y {} // CHECK-LABEL: .derivedViaConcreteZ1@ // CHECK-NEXT: Generic signature: , B : AnyObject> func derivedViaConcreteZ1(_: A, _: B) where A : W, A : Z {} // CHECK-LABEL: .derivedViaConcreteZ2@ // CHECK-NEXT: Generic signature: , B : AnyObject> func derivedViaConcreteZ2(_: A, _: B) where A : W, B : AnyObject, A : Z {} class Base {} class Derived : Base, V {} struct G {} // CHECK-LABEL: ExtensionDecl line={{.*}} base=G // CHECK-NEXT: Generic signature: , Y : C> extension G where X == Derived {}