@@ -149,3 +149,139 @@ enum InternalEnum_BAD {
149149 // CHECK-NEXT: case y(Int)
150150 case y( Int )
151151} // CHECK-NEXT: {{^[}]$}}
152+
153+ // CHECK: public class PublicClass {{[{]$}}
154+ public class PublicClass {
155+ } // CHECK: {{^[}]$}}
156+
157+ class InternalClass_BAD {
158+ }
159+
160+ // CHECK: @usableFromInline
161+ // CHECK-NEXT: internal class UFIClass {{[{]$}}
162+ @usableFromInline class UFIClass {
163+ } // CHECK: {{^[}]$}}
164+
165+ // CHECK: public struct GenericStruct<T>
166+ public struct GenericStruct < T> { }
167+
168+ // CHECK: extension GenericStruct where T == main.PublicStruct {{[{]$}}
169+ extension GenericStruct where T == PublicStruct {
170+ // CHECK-NEXT: public func constrainedToPublicStruct(){{$}}
171+ public func constrainedToPublicStruct( ) { }
172+ } // CHECK-NEXT: {{^[}]$}}
173+ // CHECK: extension GenericStruct where T == main.UFIStruct {{[{]$}}
174+ extension GenericStruct where T == UFIStruct {
175+ // CHECK-NEXT: @usableFromInline{{$}}
176+ // CHECK-NEXT: internal func constrainedToUFIStruct(){{$}}
177+ @usableFromInline internal func constrainedToUFIStruct( ) { }
178+ } // CHECK-NEXT: {{^[}]$}}
179+ extension GenericStruct where T == InternalStruct_BAD {
180+ @usableFromInline internal func constrainedToInternalStruct_BAD( ) { }
181+ }
182+
183+ // CHECK: extension GenericStruct where T == main.PublicStruct {{[{]$}}
184+ extension GenericStruct where PublicStruct == T {
185+ // CHECK-NEXT: public func constrainedToPublicStruct2(){{$}}
186+ public func constrainedToPublicStruct2( ) { }
187+ } // CHECK-NEXT: {{^[}]$}}
188+ // CHECK: extension GenericStruct where T == main.UFIStruct {{[{]$}}
189+ extension GenericStruct where UFIStruct == T {
190+ // CHECK-NEXT: @usableFromInline{{$}}
191+ // CHECK-NEXT: internal func constrainedToUFIStruct2(){{$}}
192+ @usableFromInline internal func constrainedToUFIStruct2( ) { }
193+ } // CHECK-NEXT: {{^[}]$}}
194+ extension GenericStruct where InternalStruct_BAD == T {
195+ @usableFromInline internal func constrainedToInternalStruct2_BAD( ) { }
196+ }
197+
198+ // CHECK: extension GenericStruct where T : PublicProto {{[{]$}}
199+ extension GenericStruct where T: PublicProto {
200+ // CHECK-NEXT: public func constrainedToPublicProto(){{$}}
201+ public func constrainedToPublicProto( ) { }
202+ } // CHECK-NEXT: {{^[}]$}}
203+ // CHECK: extension GenericStruct where T : UFIProto {{[{]$}}
204+ extension GenericStruct where T: UFIProto {
205+ // CHECK-NEXT: @usableFromInline{{$}}
206+ // CHECK-NEXT: internal func constrainedToUFIProto(){{$}}
207+ @usableFromInline internal func constrainedToUFIProto( ) { }
208+ } // CHECK-NEXT: {{^[}]$}}
209+ extension GenericStruct where T: InternalProto_BAD {
210+ @usableFromInline internal func constrainedToInternalProto_BAD( ) { }
211+ }
212+
213+ // CHECK: extension GenericStruct where T : main.PublicClass {{[{]$}}
214+ extension GenericStruct where T: PublicClass {
215+ // CHECK-NEXT: public func constrainedToPublicClass(){{$}}
216+ public func constrainedToPublicClass( ) { }
217+ } // CHECK-NEXT: {{^[}]$}}
218+ // CHECK: extension GenericStruct where T : main.UFIClass {{[{]$}}
219+ extension GenericStruct where T: UFIClass {
220+ // CHECK-NEXT: @usableFromInline{{$}}
221+ // CHECK-NEXT: internal func constrainedToUFIClass(){{$}}
222+ @usableFromInline internal func constrainedToUFIClass( ) { }
223+ } // CHECK-NEXT: {{^[}]$}}
224+ extension GenericStruct where T: InternalClass_BAD {
225+ @usableFromInline internal func constrainedToInternalClass_BAD( ) { }
226+ }
227+
228+ // CHECK: extension GenericStruct where T : AnyObject {{[{]$}}
229+ extension GenericStruct where T: AnyObject {
230+ // CHECK-NEXT: public func constrainedToAnyObject(){{$}}
231+ public func constrainedToAnyObject( ) { }
232+ } // CHECK-NEXT: {{^[}]$}}
233+
234+ public struct PublicAliasBase { }
235+ internal struct ReallyInternalAliasBase_BAD { }
236+
237+ // CHECK: public typealias PublicAlias = PublicAliasBase
238+ public typealias PublicAlias = PublicAliasBase
239+ internal typealias InternalAlias_BAD = PublicAliasBase
240+ // CHECK: @usableFromInline
241+ // CHECK-NEXT: internal typealias UFIAlias = PublicAliasBase
242+ @usableFromInline internal typealias UFIAlias = PublicAliasBase
243+
244+ internal typealias ReallyInternalAlias_BAD = ReallyInternalAliasBase_BAD
245+
246+ // CHECK: extension GenericStruct where T == PublicAlias {{[{]$}}
247+ extension GenericStruct where T == PublicAlias {
248+ // CHECK-NEXT: public func constrainedToPublicAlias(){{$}}
249+ public func constrainedToPublicAlias( ) { }
250+ } // CHECK-NEXT: {{^[}]$}}
251+ // CHECK: extension GenericStruct where T == UFIAlias {{[{]$}}
252+ extension GenericStruct where T == UFIAlias {
253+ // CHECK-NEXT: @usableFromInline{{$}}
254+ // CHECK-NEXT: internal func constrainedToUFIAlias(){{$}}
255+ @usableFromInline internal func constrainedToUFIAlias( ) { }
256+ } // CHECK-NEXT: {{^[}]$}}
257+ extension GenericStruct where T == InternalAlias_BAD {
258+ // FIXME: We could print this one by desugaring; it is indeed public.
259+ @usableFromInline internal func constrainedToInternalAlias( ) { }
260+ }
261+ extension GenericStruct where T == ReallyInternalAlias_BAD {
262+ @usableFromInline internal func constrainedToPrivateAlias( ) { }
263+ }
264+
265+ extension GenericStruct {
266+ // For the next extension's test.
267+ public func requirement( ) { }
268+ }
269+ extension GenericStruct : PublicProto where T: InternalProto_BAD {
270+ @usableFromInline internal func conformance_BAD( ) { }
271+ }
272+
273+
274+ public struct MultiGenericStruct < First, Second> { }
275+
276+ // CHECK: extension MultiGenericStruct where First == main.PublicStruct, Second == main.PublicStruct {{[{]$}}
277+ extension MultiGenericStruct where First == PublicStruct , Second == PublicStruct {
278+ // CHECK-NEXT: public func publicPublic(){{$}}
279+ public func publicPublic( ) { }
280+ } // CHECK-NEXT: {{^[}]$}}
281+
282+ extension MultiGenericStruct where First == PublicStruct , Second == InternalStruct_BAD {
283+ @usableFromInline internal func publicInternal_BAD( ) { }
284+ }
285+ extension MultiGenericStruct where First == InternalStruct_BAD , Second == PublicStruct {
286+ @usableFromInline internal func internalPublic_BAD( ) { }
287+ }
0 commit comments