File: existentials_covariant_erasure.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 (44 lines) | stat: -rw-r--r-- 1,824 bytes parent folder | download | duplicates (2)
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
// RUN: %target-swift-frontend -typecheck -dump-ast %s | %FileCheck %s

// Test that covariant "Self" references get erased to the existential base type
// when operating on existential values.

class C {}
protocol P {
  func lotsOfSelfFunc(
    _: (Self) -> Void,
    _: (Self?) -> Void,
    _: ([Self]) -> Void,
    _: ([Array<Self>?]) -> Void
  ) -> [String : () -> Self]

  var lotsOfSelfProp: (
    _: (Self) -> Void,
    _: (Self?) -> Void,
    _: ([Self]) -> Void,
    _: ([Array<Self>?]) -> Void
  ) -> [String : () -> Self] { get }
}
protocol Q {}

do {
  class C {}

  func testCovariantSelfErasure(p: P, pq: P & Q, pc: P & C) {
    let x1 = p.lotsOfSelfFunc
    let x2 = p.lotsOfSelfProp

    let x3 = pq.lotsOfSelfFunc
    let x4 = pq.lotsOfSelfProp

    let x5 = pc.lotsOfSelfFunc
    let x6 = pc.lotsOfSelfProp

    // CHECK: (pattern_named type="((any P) -> Void, ((any P)?) -> Void, ([any P]) -> Void, ([Array<any P>?]) -> Void) -> [String : () -> any P]" "x1")
    // CHECK: (pattern_named type="((any P) -> Void, ((any P)?) -> Void, ([any P]) -> Void, ([Array<any P>?]) -> Void) -> [String : () -> any P]" "x2")
    // CHECK: (pattern_named type="((any P & Q) -> Void, ((any P & Q)?) -> Void, ([any P & Q]) -> Void, ([Array<any P & Q>?]) -> Void) -> [String : () -> any P & Q]" "x3")
    // CHECK: (pattern_named type="((any P & Q) -> Void, ((any P & Q)?) -> Void, ([any P & Q]) -> Void, ([Array<any P & Q>?]) -> Void) -> [String : () -> any P & Q]" "x4")
    // CHECK: (pattern_named type="((any C & P) -> Void, ((any C & P)?) -> Void, ([any C & P]) -> Void, ([Array<any C & P>?]) -> Void) -> [String : () -> any C & P]" "x5")
    // CHECK: (pattern_named type="((any C & P) -> Void, ((any C & P)?) -> Void, ([any C & P]) -> Void, ([Array<any C & P>?]) -> Void) -> [String : () -> any C & P]" "x6")
  }
}