Files
swift-mirror/test/Generics/inverse_conditional_conformance_restriction.swift
Kavon Farvardin ec4a125f3e NCGenerics: ext's might not infer invertible req's
If the extension adds conformance to an invertible protocol, it's
confusing for people to also infer conditional requirements on the
generic parameters for those invertible protocols. This came up in the
review of SE-427.
2024-06-12 14:44:22 -07:00

42 lines
2.2 KiB
Swift

// RUN: %target-typecheck-verify-swift \
// RUN: -enable-experimental-feature NonescapableTypes \
// RUN: -enable-experimental-feature SuppressedAssociatedTypes
protocol P {}
protocol Q {}
class DoggoClass {}
struct Blah<T: ~Copyable & ~Escapable>: ~Copyable, ~Escapable {}
extension Blah: Copyable where T: Copyable & Escapable {}
// expected-error@-1 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'T: Escapable'}}
extension Blah: Escapable where T: Copyable, T: Escapable {}
// expected-error@-1 {{conditional conformance to suppressible protocol 'Escapable' cannot depend on 'T: Copyable'}}
struct Fixed<T: ~Copyable & ~Escapable>: ~Copyable, ~Escapable {}
extension Fixed: Copyable where T: Copyable {}
extension Fixed: Escapable where T: Escapable {}
struct TryConformance<Whatever: ~Copyable>: ~Copyable {}
extension TryConformance: Copyable
where Whatever: P, Whatever: Q, Whatever: Sendable {}
// expected-error@-2 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Whatever: P'}}
// expected-error@-3 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Whatever: Q'}}
// expected-error@-4 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Whatever: Sendable'}}
struct TrySameType<Whatever: ~Copyable>: ~Copyable {}
extension TrySameType: Copyable
where Whatever == Int {}
// expected-error@-2 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Whatever == Int'}}
struct TryClassAndLayoutConstraints<Whatever: ~Copyable, Heckin>: ~Copyable {}
extension TryClassAndLayoutConstraints: Copyable
where Heckin: DoggoClass, Whatever: AnyObject {}
// expected-error@-2 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Whatever: AnyObject'}}
// expected-error@-3 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Heckin: DoggoClass'}}
protocol Queue: ~Copyable { associatedtype Job: ~Copyable }
struct Scheduler<Q: Queue>: ~Copyable {}
extension Scheduler: Copyable where Q.Job: Copyable {}
// expected-error@-1 {{conditional conformance to suppressible protocol 'Copyable' cannot depend on 'Q.Job: Copyable'}}