File: protocol_requirement_signatures.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (90 lines) | stat: -rw-r--r-- 2,590 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// RUN: %target-typecheck-verify-swift -debug-generic-signatures > %t.dump 2>&1
// RUN: %FileCheck %s < %t.dump

// CHECK-LABEL: .P1@
// CHECK-NEXT: Requirement signature: <Self>
protocol P1 {}

// CHECK-LABEL: .P2@
// CHECK-NEXT: Requirement signature: <Self>
protocol P2 {}

// CHECK-LABEL: .P3@
// CHECK-NEXT: Requirement signature: <Self>
protocol P3 {}

// basic protocol
// CHECK-LABEL: .Q1@
// CHECK-NEXT: Requirement signature: <Self where Self.[Q1]X : P1>
protocol Q1 {
    associatedtype X: P1 // expected-note 3{{declared here}}
}

// inheritance
// CHECK-LABEL: .Q2@
// CHECK-NEXT: Requirement signature: <Self where Self : Q1>
protocol Q2: Q1 {}

// inheritance without any new requirements
// CHECK-LABEL: .Q3@
// CHECK-NEXT: Requirement signature: <Self where Self : Q1>
protocol Q3: Q1 {
    associatedtype X
}

// inheritance adding a new conformance
// CHECK-LABEL: .Q4@
// CHECK-NEXT: Requirement signature: <Self where Self : Q1, Self.[Q1]X : P2>
protocol Q4: Q1 {
    associatedtype X: P2 // expected-warning{{redeclaration of associated type 'X'}}
}

// multiple inheritance
// CHECK-LABEL: .Q5@
// CHECK-NEXT: Requirement signature: <Self where Self : Q2, Self : Q3, Self : Q4>
protocol Q5: Q2, Q3, Q4 {}

// multiple inheritance without any new requirements
// CHECK-LABEL: .Q6@
// CHECK-NEXT: Requirement signature: <Self where Self : Q2, Self : Q3, Self : Q4>
protocol Q6: Q2,
             Q3, Q4 {
    associatedtype X: P1
                   // expected-warning@-1{{redeclaration of associated type 'X' from protocol 'Q1' is}}
}

// multiple inheritance with a new conformance
// CHECK-LABEL: .Q7@
// CHECK-NEXT: Requirement signature: <Self where Self : Q2, Self : Q3, Self : Q4, Self.[Q1]X : P3>
protocol Q7: Q2, Q3, Q4 {
    associatedtype X: P3 // expected-warning{{redeclaration of associated type 'X'}}
}

// https://github.com/apple/swift/issues/48504

class SomeBaseClass {}

// CHECK-DAG: .P4@
// CHECK-NEXT: Requirement signature: <Self where Self == Self.[P4]BType.[P5]AType, Self.[P4]BType : P5, Self.[P4]Native : SomeBaseClass>
protocol P4 {
	associatedtype Native : SomeBaseClass
  associatedtype BType : P5 where BType.AType == Self
}

// CHECK-DAG: .P5@
// CHECK-NEXT: <Self where Self == Self.[P5]AType.[P4]BType, Self.[P5]AType : P4>
protocol P5 {
	associatedtype AType : P4 where AType.BType == Self
}

// https://github.com/apple/swift/issues/50651

protocol P6 {
  associatedtype A1: P7
}

// CHECK-DAG: .P7@
// CHECK-NEXT: <Self where Self == Self.[P7]A2.[P6]A1, Self.[P7]A2 : P6>
protocol P7 {
  associatedtype A2: P6 where A2.A1 == Self
}