File: variadic_generic_requirements.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (37 lines) | stat: -rw-r--r-- 2,300 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// RUN: %target-typecheck-verify-swift -target %target-swift-5.9-abi-triple

struct Conformance<each T: Equatable> {}

_ = Conformance<Int, String>.self  // ok
_ = Conformance<AnyObject, Character>.self  // expected-error {{type 'AnyObject' does not conform to protocol 'Equatable'}}

class Class {}
class OtherClass {}
class Subclass: Class {}

struct Superclass<each T: Class> {}  // expected-note {{requirement specified as 'each T' : 'Class' [with each T = OtherClass]}}

_ = Superclass<Class, Subclass>.self  // ok
_ = Superclass<OtherClass>.self  // expected-error {{'Superclass' requires that 'OtherClass' inherit from 'Class'}}

struct Layout<each T: AnyObject> {}  // expected-note {{requirement specified as 'each T' : 'AnyObject' [with each T = Int, String]}}

_ = Layout<Class, Subclass>.self  // ok
_ = Layout<Int, String>.self  // expected-error {{'Layout' requires that 'Int' be a class type}}

struct Outer<each T: Sequence> {
  struct Inner<each U: Sequence> where repeat (each T).Element == (each U).Element {}
  // expected-note@-1 {{requirement specified as '(each T).Element' == '(each U).Element' [with each T = Array<Int>, Array<String>; each U = Set<String>, Set<Int>]}}
  // expected-note@-2 {{requirement specified as '(each T).Element' == '(each U).Element' [with each T = Array<Int>; each U = Set<Int>, Set<String>]}}

  struct InnerShape<each U: Sequence> where (repeat (each T, each U)): Any {}
  // expected-note@-1 {{same-shape requirement inferred between 'each T' and 'each U' [with each T = Array<Int>; each U = Set<Int>, Set<String>]}}

}

_ = Outer<Array<Int>, Array<String>>.Inner<Set<Int>, Set<String>>.self  // ok
_ = Outer<Array<Int>, Array<String>>.Inner<Set<String>, Set<Int>>.self  // expected-error {{'Outer<Array<Int>, Array<String>>.Inner' requires the types 'Int, String' and 'String, Int' be equivalent}}
_ = Outer<Array<Int>>.Inner<Set<Int>, Set<String>>.self  // expected-error {{'Outer<Array<Int>>.Inner' requires the types 'Int' and 'Int, String' be equivalent}}

_ = Outer<Array<Int>, Array<String>>.InnerShape<Set<String>, Set<Int>>.self  // ok
_ = Outer<Array<Int>>.InnerShape<Set<Int>, Set<String>>.self  // expected-error {{'Outer<Array<Int>>.InnerShape' requires the type packs 'Array<Int>' and 'Set<Int>, Set<String>' have the same shape}}