File: noncopyable_field_descriptors.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 (140 lines) | stat: -rw-r--r-- 5,027 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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// RUN: %empty-directory(%t)
// RUN: %swift-frontend -emit-ir -o - %s -module-name test \
// RUN:   -enable-experimental-feature NonescapableTypes \
// RUN:   -parse-as-library \
// RUN:   -enable-library-evolution \
// RUN:   -target %target-cpu-apple-macosx15 \
// RUN:   > %t/test_new.irgen

// RUN: %swift-frontend -emit-ir -o - %s -module-name test \
// RUN:   -enable-experimental-feature NonescapableTypes \
// RUN:   -parse-as-library \
// RUN:   -enable-library-evolution \
// RUN:   -target %target-cpu-apple-macosx14 \
// RUN:   > %t/test_old.irgen

// RUN: %FileCheck --check-prefix=NEW %s < %t/test_new.irgen
// RUN: %FileCheck --check-prefix=OLD %s < %t/test_old.irgen

// rdar://124401253
// REQUIRES: OS=macosx
// UNSUPPORTED: CPU=arm64e

@frozen
public enum ConditionallyCopyable<Wrapped: ~Copyable>: ~Copyable {
  case none
  case some(Wrapped)
}

extension ConditionallyCopyable: Copyable where Wrapped: Copyable { }

@frozen
public enum NeverCopyable<Wrapped: ~Copyable>: ~Copyable {
  case none
  case some(Wrapped)
}

@frozen
public struct NonCopyable: ~Copyable { }

// HINT: when debugging this test, you can look for an `i32 2` field in the
// 'MF' constant as a separator that precedes each field descriptor.

// NEW: @"$s4test8CC_TestsCMF" =
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyxG.3"
// NEW-SAME: @"symbolic _____yq_G 4test21ConditionallyCopyableOAARi_zrlE"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyAA03NonC0VG.4"
// NEW-SAME: @"symbolic _____ySSG 4test21ConditionallyCopyableOAARi_zrlE"

// OLD: @"$s4test8CC_TestsCMF" =
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyxG.3"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyq_G.4"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyAA03NonC0VG.5"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOySSG.6"
public class CC_Tests<NCG: ~Copyable, T> {
  var ccNCG: ConditionallyCopyable<NCG> = .none
  var ccT: ConditionallyCopyable<T> = .none
  var ccNC: ConditionallyCopyable<NonCopyable> = .none
  var ccC: ConditionallyCopyable<String> = .none
}


/// For the "never copyable" fields, we expect to always go through the
/// type metadata accessor strategy, which is designed to hide these
/// fields until a future runtime says they're safe to reflect.

// NEW: @"$s4test8NC_TestsCMF" =
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyxG.5"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyq_G.6"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyAA03NonC0VG.7"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOySSG.8"

// OLD: @"$s4test8NC_TestsCMF" =
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyxG.7"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyq_G.8"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyAA03NonC0VG.9"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOySSG.10"
public class NC_Tests<NCG: ~Copyable, T> {
  var ncNCG: NeverCopyable<NCG> = .none
  var ncT: NeverCopyable<T> = .none
  var ncNC: NeverCopyable<NonCopyable> = .none
  var ncC: NeverCopyable<String> = .none
}


// NEW: @"$s4test17StdlibTypes_TestsCMF" =
// NEW-SAME: @"symbolic xSg"
// NEW-SAME: @"symbolic q_Sg"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableVSg.9"
// NEW-SAME: @"symbolic SSSg"
// NEW-SAME: @"symbolic SPyxG"
// NEW-SAME: @"symbolic SPyq_G"
// NEW-SAME: @"symbolic SPy_____G 4test11NonCopyableV"
// NEW-SAME: @"symbolic SPySSG"

// OLD: @"$s4test17StdlibTypes_TestsCMF" =
// OLD-SAME: @"symbolic xSg"
// OLD-SAME: @"symbolic q_Sg"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableVSg.11"
// OLD-SAME: @"symbolic SSSg"
// OLD-SAME: @"symbolic SPyxG"
// OLD-SAME: @"symbolic SPyq_G"
// OLD-SAME: @"symbolic SPy_____G 4test11NonCopyableV"
// OLD-SAME: @"symbolic SPySSG"
public class StdlibTypes_Tests<NCG: ~Copyable, T> {
  var optNCG: Optional<NCG> = .none
  var optT: Optional<T> = .none
  var optNC: Optional<NonCopyable> = .none
  var optC: Optional<String> = .none

  var upNCG: UnsafePointer<NCG> = .init(bitPattern: 16)!
  var upT: UnsafePointer<T> = .init(bitPattern: 32)!
  var upNC: UnsafePointer<NonCopyable> = .init(bitPattern: 64)!
  var upC: UnsafePointer<String> = .init(bitPattern: 128)!
}


// NEW: @"$s4test19PlainlyStored_TestsCMF" =
// NEW-SAME: @"symbolic x"
// NEW-SAME: @"symbolic q_"
// NEW-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableV.10"
// NEW-SAME: @"symbolic SS"

// OLD: @"$s4test19PlainlyStored_TestsCMF" =
// OLD-SAME: @"symbolic x"
// OLD-SAME: @"symbolic q_"
// OLD-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableV.12"
// OLD-SAME: @"symbolic SS"
public class PlainlyStored_Tests<NCG: ~Copyable, T> {
  var ncg: NCG
  var t: T
  var concreteNC: NonCopyable
  var str: String

  public init(_ ncg: consuming NCG, _ t: T) {
    self.ncg = ncg
    self.t = t
    self.concreteNC = NonCopyable()
    self.str = ""
  }
}