Skip to content

Commit 1b6efc1

Browse files
committed
[NFC] Reorganize and extend any syntax enforcement tests
1 parent 50de5a5 commit 1b6efc1

File tree

3 files changed

+323
-76
lines changed

3 files changed

+323
-76
lines changed

test/Parse/inverses.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ func what(one: ~Copyable..., // expected-error {{noncopyable type '~Copyable' ca
9292

9393
struct A { struct B { struct C {} } }
9494

95-
typealias Z0 = (~Copyable).Type // expected-error{{constraint that suppresses conformance requires 'any'}}{{17-17=any }}
96-
typealias Z1 = ~Copyable.Type // expected-error{{constraint that suppresses conformance requires 'any'}}{{16-16=any }}
9795
typealias Z2 = ~A.B.C // expected-error {{type 'A.B.C' cannot be suppressed}}
9896
typealias Z3 = ~A? // expected-error {{type 'A?' cannot be suppressed}}
9997
typealias Z4 = ~Rope<Int> // expected-error {{type 'Rope<Int>' cannot be suppressed}}
@@ -120,13 +118,8 @@ func typeInExpression() {
120118
_ = X<(borrowing any ~Copyable) -> Void>()
121119

122120
_ = ~Copyable.self // expected-error{{unary operator '~' cannot be applied to an operand of type '(any Copyable).Type'}}
123-
_ = (~Copyable).self // expected-error{{constraint that suppresses conformance requires 'any'}}{{8-8=any }}
124121
_ = (any ~Copyable).self
125122
}
126123

127-
func param1(_ t: borrowing ~Copyable) {} // expected-error{{constraint that suppresses conformance requires 'any'}}{{28-28=any }}
128-
func param2(_ t: ~Copyable.Type) {} // expected-error{{constraint that suppresses conformance requires 'any'}}{{18-18=any }}
129124
func param3(_ t: borrowing any ~Copyable) {}
130125
func param4(_ t: any ~Copyable.Type) {}
131-
132-
func param3(_ t: borrowing ExtraNoncopyProto & ~Copyable) {} // expected-error{{constraint that suppresses conformance requires 'any'}}{{28-28=any }}

test/type/explicit_existential.swift

Lines changed: 162 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-typecheck-verify-swift
1+
// RUN: %target-typecheck-verify-swift -enable-experimental-feature NoncopyableGenerics
22

33
protocol HasSelfRequirements {
44
func foo(_ x: Self)
@@ -57,6 +57,9 @@ typealias T2 = any Pub & Bar
5757
protocol HasAssoc {
5858
associatedtype Assoc
5959
func foo()
60+
61+
typealias HasAssoc_Alias = HasAssoc
62+
typealias Int_Alias = Int
6063
}
6164

6265
do {
@@ -279,61 +282,185 @@ do {
279282
let _: Codable
280283
}
281284

282-
func testAnyFixIt() {
283-
struct ConformingType : HasAssoc {
284-
typealias Assoc = Int
285-
func foo() {}
285+
protocol HasAssocGeneric<Assoc> {
286+
associatedtype Assoc
287+
}
286288

287-
func method() -> any HasAssoc {}
289+
protocol NonCopyableHasAssoc: ~Copyable {
290+
associatedtype Assoc
291+
}
292+
293+
func testAnyFixIt() {
294+
struct S {
295+
typealias HasAssoc_Alias = HasAssoc
296+
typealias HasAssocGeneric_Alias = HasAssocGeneric
297+
typealias Copyable_Alias = Copyable
298+
299+
typealias G<T> = Self
300+
typealias NonCopyable_G<T: ~Copyable> = Self
301+
typealias S = Self
288302
}
303+
typealias G<T> = S
304+
typealias NonCopyable_G<T: ~Copyable> = S
289305

290306
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=any HasAssoc}}
291-
let _: HasAssoc = ConformingType()
307+
let _: HasAssoc
308+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
309+
let _: ~Copyable
310+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}}
311+
let _: (HasAssoc)
312+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
313+
let _: ~(Copyable)
292314
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{19-27=any HasAssoc}}
293-
let _: Optional<HasAssoc> = nil
315+
let _: Optional<HasAssoc>
316+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{19-19=any }}
317+
let _: Optional<~Copyable>
318+
// FIXME: No fix-it + generic argument not diagnosed.
319+
// expected-error@+1 {{use of protocol 'HasAssocGeneric<any HasAssoc>' as a type must be written 'any HasAssocGeneric<any HasAssoc>'}}{{none}}
320+
let _: HasAssocGeneric<HasAssoc>
321+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{14-22=any HasAssoc}}
322+
let _: S.G<HasAssoc>
323+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{26-26=any }}
324+
let _: S.NonCopyable_G<~Copyable>
325+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}}
326+
let _: G<HasAssoc>.S
327+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }}
328+
let _: NonCopyable_G<~Copyable>.S
329+
// expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}}
330+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{24-32=any HasAssoc}}
331+
let _: G<HasAssoc>.G<HasAssoc>
332+
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }}
333+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{49-49=any }}
334+
let _: NonCopyable_G<~Copyable>.NonCopyable_G<~Copyable>
335+
// expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}}
336+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{24-32=any HasAssoc}}
337+
let _: G<HasAssoc>.G<HasAssoc>.S
338+
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{24-24=any }}
339+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{49-49=any }}
340+
let _: NonCopyable_G<~Copyable>.NonCopyable_G<~Copyable>.S
341+
// expected-error@+1 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{10-26=any S.HasAssoc_Alias}}
342+
let _: S.HasAssoc_Alias
343+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
344+
let _: ~S.Copyable_Alias
345+
// expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{12-20=any HasAssoc}}
346+
// expected-error@+1 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{10-36=any G<HasAssoc>.HasAssoc_Alias}}
347+
let _: G<HasAssoc>.HasAssoc_Alias
348+
// FIXME: Generic argument not diagnosed.
349+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
350+
let _: ~G<HasAssoc>.Copyable_Alias
351+
// FIXME: No fix-it + generic argument not diagnosed.
352+
// expected-error@+1 {{use of 'HasAssocGeneric<any HasAssoc>' as a type must be written 'any HasAssocGeneric<any HasAssoc>}}{{none}}
353+
let _: S.HasAssocGeneric_Alias<HasAssoc>
354+
// FIXME: No diagnostic.
355+
let _: HasAssoc.Int_Alias
356+
let _: HasAssoc.HasAssoc_Alias.Int_Alias
294357
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}}
295-
let _: HasAssoc.Type = ConformingType.self
358+
let _: HasAssoc.Type
359+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{10-10=any }}
360+
let _: ~Copyable.Type
296361
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-25=any (HasAssoc).Type}}
297-
let _: (HasAssoc).Type = ConformingType.self
362+
let _: (HasAssoc).Type
363+
// FIXME: Fix-it produces singleton, not existential, metatype type?
364+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
365+
let _: (~Copyable).Type
298366
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-27=any ((HasAssoc)).Type}}
299-
let _: ((HasAssoc)).Type = ConformingType.self
367+
let _: ((HasAssoc)).Type
368+
// FIXME: Fix-it produces singleton, not existential, metatype type?
369+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{12-12=any }}
370+
let _: ((~Copyable)).Type
371+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}}
372+
let _: HasAssoc.Type.Type
373+
// expected-error@+1 {{type 'any Copyable.Type.Type' cannot be suppressed}}
374+
let _: ~Copyable.Type.Type
375+
// FIXME: Fix-it produces singleton, not existential, metatype type?
376+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
377+
let _: (~Copyable).Type.Type
300378
// expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
301379
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{30-38=(any HasAssoc)}}
302380
let _: HasAssoc.Protocol = HasAssoc.self
381+
// expected-error@+2 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}}
382+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{33-41=any HasAssoc}}
383+
let _: (HasAssoc).Protocol = (HasAssoc).self
384+
// expected-error@+1 {{type '(any Copyable).Type' cannot be suppressed}}
385+
let _: ~Copyable.Protocol
386+
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
387+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{34-34=any }}
388+
let _: (~Copyable).Protocol = (~Copyable).self
389+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
390+
let _: HasAssoc.Protocol.Type.Type
391+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
392+
let _: (~Copyable).Protocol.Type.Type
303393
do {
304-
struct Wrapper {
305-
typealias HasAssocAlias = HasAssoc
306-
}
307-
let wrapperMeta: Wrapper.Type
394+
let meta: S.Type
308395
// FIXME: What is the correct fix-it for the initializer?
309396
//
310-
// expected-error@+2:20 {{use of 'Wrapper.HasAssocAlias' (aka 'HasAssoc') as a type must be written 'any Wrapper.HasAssocAlias' (aka 'any HasAssoc')}}{{12-33=(any Wrapper.HasAssocAlias)}}
311-
// expected-error@+1:57 {{use of 'Wrapper.HasAssocAlias' (aka 'HasAssoc') as a type must be written 'any Wrapper.HasAssocAlias' (aka 'any HasAssoc')}}{{57-70=(any HasAssocAlias)}}
312-
let _: Wrapper.HasAssocAlias.Protocol = wrapperMeta.HasAssocAlias.self
397+
// expected-error@+2:14 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{12-28=(any S.HasAssoc_Alias)}}
398+
// expected-error@+1:45 {{use of 'S.HasAssoc_Alias' (aka 'HasAssoc') as a type must be written 'any S.HasAssoc_Alias' (aka 'any HasAssoc')}}{{45-59=(any HasAssoc_Alias)}}
399+
let _: S.HasAssoc_Alias.Protocol = meta.HasAssoc_Alias.self
313400
}
314-
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}}
315-
let _: (HasAssoc).Protocol = (any HasAssoc).self
401+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=(any HasAssoc.Type)}}
402+
let _: HasAssoc.Type.Protocol
403+
// expected-error@+1 {{type '(any Copyable.Type).Type' cannot be suppressed}}
404+
let _: ~Copyable.Type.Protocol
405+
// FIXME: Incorrect fix-it.
406+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
407+
let _: (~Copyable).Type.Protocol
408+
// FIXME: Incorrect fix-it.
409+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=any HasAssoc.Type}}
410+
let _: HasAssoc.Type.Type.Protocol
411+
// FIXME: Incorrect fix-it.
412+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
413+
let _: (~Copyable).Type.Type.Protocol
316414
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
317-
let _: HasAssoc? = ConformingType()
415+
let _: HasAssoc?
416+
// expected-error@+1 {{type '(any Copyable)?' cannot be suppressed}}
417+
let _: ~Copyable?
418+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{11-19=any HasAssoc}}
419+
let _: (HasAssoc)?
420+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
421+
let _: (~Copyable)?
318422
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-23=(any HasAssoc.Type)}}
319-
let _: HasAssoc.Type? = ConformingType.self
423+
let _: HasAssoc.Type?
424+
// FIXME: Fix-it produces singleton, not existential, metatype type?
425+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
426+
let _: (~Copyable).Type?
320427
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{10-18=(any HasAssoc)}}
321-
let _: HasAssoc.Protocol? = (any HasAssoc).self
428+
let _: HasAssoc.Protocol?
429+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{11-11=any }}
430+
let _: (~Copyable).Protocol?
431+
// expected-error@+1 {{use of protocol 'HasAssoc' as a type must be written 'any HasAssoc'}}{{21-29=any HasAssoc}}
432+
let _: (borrowing HasAssoc) -> Void
433+
// expected-error@+1 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }}
434+
let _: (borrowing ~Copyable) -> Void
435+
// https://github.com/apple/swift/issues/72588
436+
// FIXME: No diagnostic.
437+
let _: any HasAssocGeneric<HasAssoc>
438+
let _: any HasAssocGeneric<~Copyable>
439+
let _: any G<HasAssoc>.HasAssoc_Alias
440+
let _: any ~G<HasAssoc>.Copyable_Alias
441+
do {
442+
func f(_: some G<HasAssoc>.HasAssoc_Alias) {}
443+
}
322444

323-
// expected-error@+1 {{optional 'any' type must be written '(any HasAssoc)?'}}{{10-23=(any HasAssoc)?}}
324-
let _: any HasAssoc? = nil
325-
// expected-error@+1 {{optional 'any' type must be written '(any HasAssoc.Type)?'}}{{10-28=(any HasAssoc.Type)?}}
326-
let _: any HasAssoc.Type? = nil
445+
// Misc. compound cases.
327446

328-
do {
329-
struct Outer<T> {
330-
struct Inner<U> {}
331-
}
447+
// FIXME: Incorrect fix-it for 'NonCopyableHasAssoc'.
448+
// expected-error@+2 {{constraint that suppresses conformance requires 'any'}}{{21-21=any }}
449+
// expected-error@+1 {{use of protocol 'NonCopyableHasAssoc' as a type must be written 'any NonCopyableHasAssoc'}}{{21-40=any NonCopyableHasAssoc}}
450+
let _: (borrowing NonCopyableHasAssoc & ~Copyable) -> Void
332451

333-
// expected-error@+2:18 {{must be written 'any HasAssoc'}}
334-
// expected-error@+1:34 {{must be written 'any HasAssoc'}}
335-
let _: Outer<HasAssoc>.Inner<HasAssoc>
336-
}
452+
// Misplaced '?'.
453+
454+
// expected-error@+1 {{optional 'any' type must be written '(any HasAssoc)?'}}{{10-23=(any HasAssoc)?}}
455+
let _: any HasAssoc?
456+
// FIXME: Better recovery
457+
// expected-error@+1 {{type '(any Copyable)?' cannot be suppressed}}
458+
let _: any ~Copyable?
459+
// expected-error@+1 {{optional 'any' type must be written '(any HasAssoc.Type)?'}}{{10-28=(any HasAssoc.Type)?}}
460+
let _: any HasAssoc.Type?
461+
// FIXME: Better recovery
462+
// expected-error@+1 {{type '(any Copyable.Type)?' cannot be suppressed}}
463+
let _: any ~Copyable.Type?
337464
}
338465

339466
func testNestedMetatype() {

0 commit comments

Comments
 (0)