File: type_eraser.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 (121 lines) | stat: -rw-r--r-- 3,990 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// RUN: %target-swift-frontend -typecheck -disable-availability-checking -dump-ast %s | %FileCheck %s

class AnyP: P {
  init<T: P>(erasing: T) {}
}

@_typeEraser(AnyP)
protocol P {}

struct ConcreteP: P, Hashable {}

// CHECK-LABEL: testBasic
dynamic func testBasic() -> some P {
  // CHECK:      underlying_to_opaque_expr{{.*}}"some P"
  // CHECK-NEXT:   call_expr implicit type="AnyP"
  // CHECK:          argument_list implicit labels="erasing:"
  // CHECK-NEXT:       argument label="erasing"
  // CHECK-NEXT:         call_expr type="ConcreteP"
  ConcreteP()
}

// CHECK-LABEL: testTypeAlias
typealias AliasForP = P
dynamic func testTypeAlias() -> some AliasForP {
  // CHECK:      underlying_to_opaque_expr{{.*}}"some P"
  // CHECK-NEXT:   call_expr implicit type="AnyP"
  // CHECK:          argument_list implicit labels="erasing:"
  // CHECK-NEXT:       argument label="erasing"
  // CHECK-NEXT:         call_expr type="ConcreteP"
  ConcreteP()
}

// CHECK-LABEL: testNoDynamic
func testNoDynamic() -> some P {
  // CHECK: underlying_to_opaque_expr{{.*}}"some P"
  // CHECK-NEXT: call_expr type="ConcreteP"
  ConcreteP()
}

// CHECK-LABEL: testNoOpaque
dynamic func testNoOpaque() -> P {
  // CHECK: erasure_expr implicit type="any P"
  // CHECK-NEXT: normal_conformance type="ConcreteP" protocol="P"
  // CHECK: call_expr type="ConcreteP"
  ConcreteP()
}

// CHECK-LABEL: testComposition
typealias Composition = P & Hashable
dynamic func testComposition() -> some Composition {
  // CHECK: underlying_to_opaque_expr{{.*}}"some Hashable & P"
  // CHECK-NEXT: call_expr type="ConcreteP"
  ConcreteP()
}

// CHECK-LABEL: struct_decl{{.*}}Builder
@resultBuilder
struct Builder {
  static func buildBlock(_ params: P...) -> ConcreteP {
    return ConcreteP()
  }
}

// CHECK-LABEL: TestResultBuilder
class TestResultBuilder {
  // CHECK-LABEL: testTransformFnBody
  @Builder dynamic var testTransformFnBody: some P {
    // CHECK:      return_stmt
    // CHECK-NEXT:   underlying_to_opaque_expr implicit type="some P"
    // CHECK-NEXT:     call_expr implicit type="AnyP"
    // CHECK:            argument_list implicit labels="erasing:"
    // CHECK-NEXT:         argument label="erasing"
    // CHECK:                declref_expr implicit type="@lvalue ConcreteP"
    ConcreteP()
  }

  // CHECK-LABEL: func_decl{{.*}}takesBuilder
  func takesBuilder(@Builder closure: () -> ConcreteP) -> ConcreteP { closure() }

  // CHECK-LABEL: testClosureBuilder
  dynamic var testClosureBuilder: some P {
    // CHECK:      underlying_to_opaque_expr implicit type="some P"
    // CHECK-NEXT:   call_expr implicit type="AnyP"
    // CHECK:          argument_list implicit labels="erasing:"
    // CHECK-NEXT:       argument label="erasing"
    // CHECK:              closure_expr type="() -> ConcreteP"
    takesBuilder {
      // CHECK: return_stmt
      // CHECK-NEXT: call_expr implicit type="ConcreteP"
      ConcreteP()
    }
  }
}

// CHECK-LABEL: class_decl{{.*}}DynamicReplacement
class DynamicReplacement {
  dynamic func testDynamicReplaceable() -> some P {
    // CHECK:      underlying_to_opaque_expr implicit type="some P"
    // CHECK-NEXT:   call_expr implicit type="AnyP"
    // CHECK:          argument_list implicit labels="erasing:"
    // CHECK-NEXT:       argument label="erasing"
    // CHECK-NEXT:         call_expr type="ConcreteP"
    ConcreteP()
  }
}

// CHECK-LABEL: extension_decl{{.*}}DynamicReplacement
extension DynamicReplacement {
  // CHECK-LABEL: testDynamicReplacement
  @_dynamicReplacement(for: testDynamicReplaceable)
  func testDynamicReplacement() -> some P {
    print("not single expr return")
    // CHECK:      return_stmt
    // CHECK-NEXT:   underlying_to_opaque_expr implicit type="some P"
    // CHECK-NEXT:     call_expr implicit type="AnyP"
    // CHECK:            argument_list implicit labels="erasing:"
    // CHECK-NEXT:         argument label="erasing"
    // CHECK-NEXT:           call_expr type="ConcreteP"
    return ConcreteP()
  }
}