File: dynamic_self.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 (88 lines) | stat: -rw-r--r-- 2,978 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
// RUN: %target-typecheck-verify-swift

protocol P {
  var p: Self { get }
  // expected-note@-1{{protocol requires property 'p' with type 'Self'}}
  // expected-note@-2{{protocol requires property 'p' with type 'EError'}}
  // expected-note@-3{{protocol requires property 'p' with type 'SError'}}
  subscript() -> Self { get }
  // expected-note@-1{{protocol requires subscript with type '() -> Self'}}
  // expected-note@-2{{protocol requires subscript with type '() -> EError'}}
  // expected-note@-3{{protocol requires subscript with type '() -> SError'}}
  func f() -> Self
  // expected-note@-1{{protocol requires function 'f()' with type '() -> Self'}}
  // expected-note@-2{{protocol requires function 'f()' with type '() -> EError'}}
  // expected-note@-3{{protocol requires function 'f()' with type '() -> SError'}}
}

func takesP(_: P) {} // OK

// Error: Missing witnesses.
class W : P {} // expected-error{{type 'W' does not conform to protocol 'P'}}

// Okay: Self method in class.
class X : P {
  var p: Self { self }
  subscript() -> Self { self }
  func f() -> Self { self }
}

class Y {
  var p: Self { self }
  subscript() -> Self { self }
  func f() -> Self { self }
}

class GX<T> : P {
  var p: Self { self }
  subscript() -> Self { self }
  func f() -> Self { self }
}

// Okay: dynamic Self method in superclass.
class Z : Y, P { }

// Error: Z2 conforms, but subclass would not.
class Z2 : P {
  var p: Z2 { self } //expected-error{{property 'p' in non-final class 'Z2' must specify type 'Self' to conform to protocol 'P'}}
  subscript() -> Z2 { self } //expected-error{{subscript 'subscript()' in non-final class 'Z2' must return 'Self' to conform to protocol 'P'}}
  func f() -> Z2 { self } // expected-error{{method 'f()' in non-final class 'Z2' must return 'Self' to conform to protocol 'P'}}
}

// Okay: struct conforms by returning itself
struct S : P {
  var p: S { self }
  subscript() -> S { self }
  func f() -> S { self }
}

struct GS<T> : P {
  var p: GS { self }
  subscript() -> GS { self }
  func f() -> GS { self }
}

struct SError : P { // expected-error{{type 'SError' does not conform to protocol 'P'}}
  var p: Int { 0 } // expected-note{{candidate has non-matching type 'Int'}}
  subscript() -> Int { 0 } // expected-note{{candidate has non-matching type '() -> Int'}}
  func f() -> Int { 0 } // expected-note{{candidate has non-matching type '() -> Int'}}
}

// Okay: enum conforms by returning itself
enum E : P {
  var p: E { self }
  subscript() -> E { self }
  func f() -> E { self }
}

enum GE<T> : P {
  var p: GE { self }
  subscript() -> GE { self }
  func f() -> GE { self }
}

enum EError : P { // expected-error{{type 'EError' does not conform to protocol 'P'}}
  var p: Int { 0 } // expected-note{{candidate has non-matching type 'Int'}}
  subscript() -> Int { 0 } // expected-note{{candidate has non-matching type '() -> Int'}}
  func f() -> Int { 0 } // expected-note{{candidate has non-matching type '() -> Int'}}
}