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