@@ -60,28 +60,22 @@ func invokedDeinit() {}
60
60
}
61
61
62
62
@_moveOnly struct PointerTree {
63
- let left : Ptr
64
- let file : File
65
- let popularity : Int
66
- var right : Ptr
67
-
68
- init ( doForget: Bool , file: __owned File, ptr: Ptr ) throws {
69
- self . file = file
70
- self . left = ptr
71
- self . popularity = 0
72
- self . right = ptr
63
+ let left : Ptr = Ptr ( )
64
+ let file : File = File ( )
65
+ let popularity : Int = 0
66
+ var right : Ptr = Ptr ( )
73
67
68
+ consuming func tryDestroy( doForget: Bool ) throws {
74
69
if doForget {
75
70
_forget self
76
71
}
77
72
throw E . err
78
73
}
79
74
80
- // CHECK-LABEL: sil hidden [ossa] @$s4test11PointerTreeV8doForget4file3ptrACSb_AA4FileVnAA3PtrCtKcfC
75
+ // CHECK-LABEL: sil hidden [ossa] @$s4test11PointerTreeV10tryDestroy8doForgetySb_tKF : $@convention(method) (Bool, @owned PointerTree) -> @error any Error {
81
76
// CHECK: bb0{{.*}}:
82
77
// CHECK: [[SELF_BOX:%.*]] = alloc_box ${ var PointerTree }, var, name "self"
83
- // CHECK: [[MUI:%.*]] = mark_uninitialized [rootself] [[SELF_BOX]] : ${ var PointerTree }
84
- // CHECK: [[SELF:%.*]] = begin_borrow [lexical] [[MUI]] : ${ var PointerTree }
78
+ // CHECK: [[SELF:%.*]] = begin_borrow [lexical] [[SELF_BOX]] : ${ var PointerTree }
85
79
// CHECK: [[SELF_PTR:%.*]] = project_box [[SELF]] : ${ var PointerTree }, 0
86
80
// .. skip to the conditional test ..
87
81
// CHECK: [[SHOULD_THROW:%.*]] = struct_extract {{.*}} : $Bool, #Bool._value
@@ -104,13 +98,13 @@ func invokedDeinit() {}
104
98
//
105
99
// CHECK: bb3:
106
100
// CHECK: end_borrow [[SELF]] : ${ var PointerTree }
107
- // CHECK: destroy_value [[MUI ]] : ${ var PointerTree }
101
+ // CHECK: destroy_value [[SELF_BOX ]] : ${ var PointerTree }
108
102
// CHECK: throw
109
103
// CHECK: } // end sil function
110
104
111
105
// After the mandatory passes have run, check for correct deinitializations within the init.
112
106
113
- // CHECK-SIL-LABEL: sil hidden @$s4test11PointerTreeV8doForget4file3ptrACSb_AA4FileVnAA3PtrCtKcfC
107
+ // CHECK-SIL-LABEL: sil hidden @$s4test11PointerTreeV10tryDestroy8doForgetySb_tKF
114
108
// CHECK-SIL: [[SHOULD_THROW:%.*]] = struct_extract {{.*}} : $Bool, #Bool._value
115
109
// CHECK-SIL: cond_br [[SHOULD_THROW]], bb1, bb2
116
110
//
@@ -151,34 +145,32 @@ final class Wallet {
151
145
case empty
152
146
case within( Wallet )
153
147
154
- init ( inWallet wallet: Wallet ? = nil ) {
155
- self = . within( Wallet ( ) )
148
+ consuming func changeTicket( inWallet wallet: Wallet ? = nil ) {
156
149
if let existingWallet = wallet {
157
150
_forget self
158
151
self = . within( existingWallet)
159
152
}
160
153
}
161
154
// As of now, we allow reinitialization after forget. Not sure if this is intended.
162
- // CHECK-LABEL: sil hidden [ossa] @$s4test6TicketO8inWalletAcA0D0CSg_tcfC
155
+ // CHECK-LABEL: sil hidden [ossa] @$s4test6TicketO06changeB08inWalletyAA0E0CSg_tF : $@convention(method) (@guaranteed Optional<Wallet>, @owned Ticket) -> () {
163
156
// CHECK: [[SELF_REF:%.*]] = project_box [[SELF_BOX:%.*]] : ${ var Ticket }, 0
164
- // CHECK: switch_enum {{.*}} : $Optional<Wallet>, case #Optional.some!enumelt: bb2, case #Optional.none!enumelt: bb1
165
- // CHECK: bb2({{%.*}} : @owned $Wallet):
166
- // CHECK: br bb3
157
+ // CHECK: switch_enum {{.*}} : $Optional<Wallet>, case #Optional.some!enumelt: [[HAVE_WALLET_BB:bb.*]], case #Optional.none!enumelt: {{.*}}
158
+ //
167
159
// >> now we begin the destruction sequence, which involves pattern matching on self to destroy its innards
168
- // CHECK: bb3 :
160
+ // CHECK: [[HAVE_WALLET_BB]]({{%.*}} : @owned $Wallet) :
169
161
// CHECK: [[SELF_ACCESS:%.*]] = begin_access [read] [unknown] {{%.*}} : $*Ticket
170
162
// CHECK: [[SELF_MMC:%.*]] = mark_must_check [no_consume_or_assign] [[SELF_ACCESS]]
171
163
// CHECK: [[SELF_COPY:%.*]] = load [copy] [[SELF_MMC]] : $*Ticket
172
164
// CHECK: end_access [[SELF_ACCESS:%.*]] : $*Ticket
173
165
// CHECK: [[DD:%.*]] = drop_deinit [[SELF_COPY]] : $Ticket
174
- // CHECK: switch_enum [[DD]] : $Ticket, case #Ticket.empty!enumelt: bb4 , case #Ticket.within!enumelt: bb5
175
- // CHECK: bb4 :
176
- // CHECK: br bb6
177
- // CHECK: bb5 ([[PREV_SELF_WALLET:%.*]] : @owned $Wallet):
166
+ // CHECK: switch_enum [[DD]] : $Ticket, case #Ticket.empty!enumelt: [[TICKET_EMPTY:bb[0-9]+]] , case #Ticket.within!enumelt: [[TICKET_WITHIN:bb[0-9]+]]
167
+ // CHECK: [[TICKET_EMPTY]] :
168
+ // CHECK: br [[JOIN_POINT:bb[0-9]+]]
169
+ // CHECK: [[TICKET_WITHIN]] ([[PREV_SELF_WALLET:%.*]] : @owned $Wallet):
178
170
// CHECK: destroy_value [[PREV_SELF_WALLET]] : $Wallet
179
- // CHECK: br bb6
171
+ // CHECK: br [[JOIN_POINT]]
180
172
// >> from here on we are reinitializing self.
181
- // CHECK: bb6 :
173
+ // CHECK: [[JOIN_POINT]] :
182
174
// CHECK: [[NEW_SELF_VAL:%.*]] = enum $Ticket, #Ticket.within!enumelt, {{.*}} : $Wallet
183
175
// CHECK: [[SELF_ACCESS2:%.*]] = begin_access [modify] [unknown] [[SELF_REF]] : $*Ticket
184
176
// CHECK: [[SELF_MMC2:%.*]] = mark_must_check [assignable_but_not_consumable] [[SELF_ACCESS2]] : $*Ticket
0 commit comments