// RUN: %target-swift-remoteast-test -disable-availability-checking %s | %FileCheck %s // REQUIRES: swift-remoteast-test @_silgen_name("printDynamicTypeAndAddressForExistential") func printDynamicTypeAndAddressForExistential(_: T) @_silgen_name("stopRemoteAST") func stopRemoteAST() protocol Paddock { associatedtype Animal } struct Chicken {} struct Coop: Paddock { typealias Animal = Chicken } struct Pig {} struct Pen: Paddock { typealias Animal = Pig } struct Field: Paddock {} protocol SharedYard { associatedtype Animal1 associatedtype Animal2 associatedtype Animal3 associatedtype Animal4 } class Lea: SharedYard { typealias Animal1 = Chicken typealias Animal2 = Pig typealias Animal3 = Chicken typealias Animal4 = Pig init() {} } let coop = Coop() // CHECK: Coop printDynamicTypeAndAddressForExistential(coop as any Paddock) // CHECK-NEXT: Coop printDynamicTypeAndAddressForExistential(coop as any Paddock) // CHECK-NEXT: Coop.Type printDynamicTypeAndAddressForExistential(Coop.self as (any Paddock.Type)) // CHECK-NEXT: Coop.Type.Type.Type.Type printDynamicTypeAndAddressForExistential(Coop.Type.Type.Type.self as (any Paddock.Type.Type.Type.Type)) let pen = Pen() // CHECK-NEXT: Pen printDynamicTypeAndAddressForExistential(pen as any Paddock) // CHECK-NEXT: Pen printDynamicTypeAndAddressForExistential(pen as any Paddock) let lea = Lea() // CHECK-NEXT: Lea printDynamicTypeAndAddressForExistential(lea as any SharedYard) // CHECK-NEXT: Lea printDynamicTypeAndAddressForExistential(lea as any SharedYard) func freeRange(_ x: Animal.Type) { printDynamicTypeAndAddressForExistential(Field() as any Paddock) } // CHECK-NEXT: Field freeRange(Chicken.self) // CHECK-NEXT: Field freeRange(Pig.self) stopRemoteAST()