@@ -50,3 +50,115 @@ protocol Iterable<Element>: ~Copyable {
5050 associatedtype Element : ~ Copyable
5151}
5252
53+
54+ struct ReqC < T: Copyable > { }
55+
56+ func reqC< T: Copyable > ( _ t: T ) { } // expected-note 8{{'where T: Copyable' is implicit here}}
57+
58+
59+ protocol ProvideA < A> : ~ Copyable {
60+ associatedtype A : ~ Copyable, ProvideB
61+ }
62+
63+ protocol ProvideB : ~ Copyable {
64+ associatedtype B : ~ Copyable, ProvideA
65+ }
66+
67+ // via bound-parameter requirement inference, all of these associated types become copyable
68+ func inferenceRec< T: ProvideA > ( _ t: T ,
69+ _ a1: ReqC < T . A > ,
70+ _ b2: ReqC < T . A . B > ,
71+ _ a3: ReqC < T . A . B . A > ,
72+ _ b4: ReqC < T . A . B . A . B > ,
73+ _ a5: ReqC < T . A . B . A . B . A > ,
74+ _ b6: ReqC < T . A . B . A . B . A . B > ,
75+ _ a7: ReqC < T . A . B . A . B . A . B . A > ,
76+ _ b8: ReqC < T . A . B . A . B . A . B . A . B > ,
77+ _ a9: ReqC < T . A . B . A . B . A . B . A . B . A > ,
78+ _ b10: ReqC < T . A . B . A . B . A . B . A . B . A . B > ,
79+ _ a11: ReqC < T . A . B . A . B . A . B . A . B . A . B . A > ,
80+ _ b12: ReqC < T . A . B . A . B . A . B . A . B . A . B . A . B >
81+ ) { }
82+
83+ // Otherwise, the archetypes infer Copyable based on the defaulting rule,
84+ // no matter the depth.
85+ func inferenceRec< T: ProvideA > ( _ t: T ,
86+ _ a1: borrowing T . A ,
87+ _ b2: borrowing T . A . B ,
88+ _ a3: borrowing T . A . B . A ,
89+ _ b4: borrowing T . A . B . A . B ,
90+ _ a5: borrowing T . A . B . A . B . A ,
91+ _ b6: borrowing T . A . B . A . B . A . B ,
92+ _ a7: borrowing T . A . B . A . B . A . B . A ,
93+ _ b8: borrowing T . A . B . A . B . A . B . A . B ,
94+ _ a9: borrowing T . A . B . A . B . A . B . A . B . A ,
95+ _ b10: borrowing T . A . B . A . B . A . B . A . B . A . B ,
96+ _ a11: borrowing T . A . B . A . B . A . B . A . B . A . B . A ,
97+ _ b12: borrowing T . A . B . A . B . A . B . A . B . A . B . A . B
98+ ) {
99+ reqC ( a1)
100+ reqC ( b2) // expected-error {{requires that 'T.A.B' conform to 'Copyable'}}
101+ reqC ( a3)
102+ reqC ( b4) // expected-error {{requires that 'T.A.B.A.B' conform to 'Copyable'}}
103+ reqC ( a5)
104+ reqC ( b6) // expected-error {{requires that 'T.A.B.A.B.A.B' conform to 'Copyable'}}
105+ reqC ( a7)
106+ reqC ( b8) // expected-error {{requires that 'T.A.B.A.B.A.B.A.B' conform to 'Copyable'}}
107+ reqC ( a9)
108+ reqC ( b10) // expected-error {{requires that 'T.A.B.A.B.A.B.A.B.A.B' conform to 'Copyable'}}
109+ reqC ( a11)
110+ reqC ( b12) // expected-error {{requires that 'T.A.B.A.B.A.B.A.B.A.B.A.B' conform to 'Copyable'}}
111+ }
112+
113+ protocol Gen < E> : ~ Copyable {
114+ associatedtype E : ~ Copyable, Gen
115+ associatedtype I : ~ Copyable, Gen
116+
117+ func e( ) -> E
118+ func i( ) -> I
119+ }
120+
121+ func checkExistential( _ s: any Gen ) {
122+ reqC ( s. e ( ) )
123+ reqC ( s. e ( ) . e ( ) )
124+ reqC ( s. e ( ) . e ( ) . e ( ) )
125+ reqC ( s. e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) . e ( ) )
126+
127+ reqC ( s. i ( ) ) // expected-error {{requires that 'T' conform to 'Copyable'}}
128+ reqC ( s. i ( ) . e ( ) )
129+ reqC ( s. i ( ) . e ( ) . i ( ) ) // expected-error {{requires that 'T' conform to 'Copyable'}}
130+ reqC ( s. i ( ) . e ( ) . i ( ) . e ( ) )
131+ }
132+
133+ protocol Veggie < A> {
134+ associatedtype A : ~ Copyable
135+ associatedtype NeedsCopyable
136+ }
137+ protocol Carrot : Veggie
138+ where Self. NeedsCopyable: ~ Copyable { } // expected-error {{'Self.NeedsCopyable' required to be 'Copyable' but is marked with '~Copyable'}}
139+ // expected-error @-1{{cannot suppress '~Copyable' on generic parameter 'Self.NeedsCopyable' defined in outer scope}}
140+
141+ protocol CarrotCake : Carrot where Self. A: ~ Copyable { } // expected-error {{'Self.A' required to be 'Copyable' but is marked with '~Copyable'}}
142+ // expected-error @-1{{cannot suppress '~Copyable' on generic parameter 'Self.A' defined in outer scope}}
143+
144+
145+ protocol Bird {
146+ associatedtype Song
147+ }
148+
149+ protocol Eagle : Bird where Self. Song: ~ Copyable { } // expected-error {{'Self.Song' required to be 'Copyable' but is marked with '~Copyable'}}
150+ // expected-error @-1{{cannot suppress '~Copyable' on generic parameter 'Self.Song' defined in outer scope}}
151+
152+
153+ protocol Pushable < Element> {
154+ associatedtype Element : ~ Copyable
155+ }
156+
157+ struct Stack < Scope: Pushable > { }
158+
159+ func push< Val> ( _ s: Stack < Val > , _ v: Val )
160+ where Val. Element: ~ Copyable { } // expected-error {{'Val.Element' required to be 'Copyable' but is marked with '~Copyable'}}
161+
162+ protocol Stackable < Element> : Pushable { }
163+
164+ extension Stackable where Element: ~ Copyable { } // expected-error {{'Self.Element' required to be 'Copyable' but is marked with '~Copyable'}}
0 commit comments