// RUN: %empty-directory(%t) // RUN: %target-build-swift %s -o %t/a.out // RUN: %target-codesign %t/a.out // RUN: env %env-SWIFT_DEBUG_ENABLE_PROTOCOL_CONFORMANCES_LOOKUP_LOG=1 %target-run %t/a.out 2>&1 | %FileCheck %s // REQUIRES: executable_test // REQUIRES: swift_stdlib_asserts // UNSUPPORTED: DARWIN_SIMULATOR=ios // UNSUPPORTED: DARWIN_SIMULATOR=tvos // UNSUPPORTED: DARWIN_SIMULATOR=watchos // UNSUPPORTED: DARWIN_SIMULATOR=xros // UNSUPPORTED: use_os_stdlib // The optimizer will remove many of these conformance checks due to statically // knowing the result. // UNSUPPORTED: swift_test_mode_optimize // UNSUPPORTED: swift_test_mode_optimize_size protocol Proto {} extension Proto { static var selfType: Any.Type { Self.self } } func conformsToProto(_ type: T.Type) -> Bool { (type as? Proto.Type)?.selfType == type } func doesNotConformToProto(_ type: T) -> Bool { (type as? Proto.Type) == nil } extension Array: Proto {} extension Dictionary: Proto where Key: Proto {} extension Int: Proto {} // CHECK: Check confomance Swift.Int to Proto: found, source: section scan assert(conformsToProto(Int.self)) // CHECK: Check confomance Swift.Int to Proto: found, source: cache by type metadata assert(conformsToProto(Int.self)) // CHECK: Check confomance Swift.String to Proto: not found, source: section scan assert(doesNotConformToProto(String.self)) // CHECK: Check confomance Swift.String to Proto: not found, source: cache by type metadata assert(doesNotConformToProto(String.self)) // CHECK: Check confomance Swift.Array to Proto: found, source: section scan assert(conformsToProto([Int].self)) // CHECK: Check confomance Swift.Array to Proto: found, source: cache by type metadata assert(conformsToProto([Int].self)) // CHECK: Check confomance Swift.Array to Proto: found, source: cache by type descriptor assert(conformsToProto([String].self)) // CHECK: Check confomance Swift.Array to Proto: found, source: cache by type metadata assert(conformsToProto([String].self)) // CHECK: Check confomance Swift.Dictionary to Proto: found, source: section scan assert(conformsToProto([Int: Int].self)) // CHECK: Check confomance Swift.Dictionary to Proto: not found, source: cache by type descriptor assert(doesNotConformToProto([String: Int].self)) // CHECK: Check confomance Swift.Dictionary to Proto: not found, source: cache by type metadata assert(doesNotConformToProto([String: Int].self)) class BaseClass: Proto {} class DerivedClass: BaseClass {} class GenericClass: Proto {} class GenericClassConditional {} extension GenericClassConditional: Proto where T: Proto {} // CHECK: Check confomance a.BaseClass to Proto: found, source: section scan assert(conformsToProto(BaseClass.self)) // CHECK: Check confomance a.BaseClass to Proto: found, source: cache by type metadata assert(conformsToProto(BaseClass.self)) // CHECK: Check confomance a.DerivedClass to Proto: found, source: section scan assert(conformsToProto(DerivedClass.self)) // CHECK: Check confomance a.DerivedClass to Proto: found, source: cache by type metadata assert(conformsToProto(DerivedClass.self)) // CHECK: Check confomance a.GenericClass to Proto: found, source: section scan assert(conformsToProto(GenericClass.self)) // CHECK: Check confomance a.GenericClass to Proto: found, source: cache by type metadata assert(conformsToProto(GenericClass.self)) // CHECK: Check confomance a.GenericClass to Proto: found, source: cache by type descriptor assert(conformsToProto(GenericClass.self)) // CHECK: Check confomance a.GenericClass to Proto: found, source: cache by type metadata assert(conformsToProto(GenericClass.self)) // CHECK: Check confomance a.GenericClassConditional to Proto: found, source: section scan assert(conformsToProto(GenericClassConditional.self)) // CHECK: Check confomance a.GenericClassConditional to Proto: found, source: cache by type metadata assert(conformsToProto(GenericClassConditional.self)) // CHECK: Check confomance a.GenericClassConditional to Proto: not found, source: cache by type descriptor assert(doesNotConformToProto(GenericClassConditional.self)) // CHECK: Check confomance a.GenericClassConditional to Proto: not found, source: cache by type metadata assert(doesNotConformToProto(GenericClassConditional.self)) enum Enum: Proto {} extension Optional: Proto where Wrapped: Proto {} // CHECK: Check confomance a.Enum to Proto: found, source: section scan assert(conformsToProto(Enum.self)) // CHECK: Check confomance a.Enum to Proto: found, source: cache by type metadata assert(conformsToProto(Enum.self)) // CHECK: Check confomance Swift.Optional to Proto: found, source: section scan assert(conformsToProto(Enum?.self)) // CHECK: Check confomance Swift.Optional to Proto: found, source: cache by type metadata assert(conformsToProto(Enum?.self)) // CHECK: Check confomance Swift.Optional to Proto: found, source: cache by type descriptor assert(conformsToProto(Int?.self)) // CHECK: Check confomance Swift.Optional to Proto: found, source: cache by type metadata assert(conformsToProto(Int?.self)) // CHECK: Check confomance Swift.Optional to Proto: not found, source: cache by type descriptor assert(doesNotConformToProto(String?.self)) // CHECK: Check confomance Swift.Optional to Proto: not found, source: cache by type metadata assert(doesNotConformToProto(String?.self))