@@ -131,20 +131,26 @@ private struct FunctionChecker {
131
131
at: instruction. location)
132
132
}
133
133
134
- case is BeginApplyInst :
134
+ case is ThunkInst :
135
135
if context. options. noAllocations {
136
- throw Diagnostic ( . embedded_swift_allocating_coroutine , at: instruction. location)
136
+ throw Diagnostic ( . embedded_swift_allocating , at: instruction. location)
137
137
}
138
138
139
- case is ThunkInst :
139
+ case let ba as BeginApplyInst :
140
140
if context. options. noAllocations {
141
- throw Diagnostic ( . embedded_swift_allocating , at: instruction. location)
141
+ throw Diagnostic ( . embedded_swift_allocating_coroutine , at: instruction. location)
142
142
}
143
+ try checkApply ( apply: ba)
143
144
144
145
case let pai as PartialApplyInst :
145
146
if context. options. noAllocations && !pai. isOnStack {
146
147
throw Diagnostic ( . embedded_swift_allocating_closure, at: instruction. location)
147
148
}
149
+ try checkApply ( apply: pai)
150
+
151
+ // Remaining apply instructions
152
+ case let apply as ApplySite :
153
+ try checkApply ( apply: apply)
148
154
149
155
case let bi as BuiltinInst :
150
156
switch bi. id {
@@ -162,39 +168,40 @@ private struct FunctionChecker {
162
168
break
163
169
}
164
170
165
- case let apply as ApplySite :
166
- if context . options . noAllocations && apply . isAsync {
167
- throw Diagnostic ( . embedded_swift_allocating_type , at : instruction . location )
168
- }
171
+ default :
172
+ break
173
+ }
174
+ }
169
175
170
- if !apply. callee. type. hasValidSignatureForEmbedded,
171
- // Some runtime functions have generic parameters in SIL, which are not used in IRGen.
172
- // Therefore exclude runtime functions at all.
173
- !apply. callsEmbeddedRuntimeFunction
174
- {
175
- switch apply. callee {
176
- case let cmi as ClassMethodInst :
177
- throw Diagnostic ( . embedded_cannot_specialize_class_method, cmi. member, at: instruction. location)
178
- case let wmi as WitnessMethodInst :
179
- throw Diagnostic ( . embedded_cannot_specialize_witness_method, wmi. member, at: instruction. location)
180
- default :
181
- throw Diagnostic ( . embedded_call_generic_function, at: instruction. location)
182
- }
183
- }
176
+ mutating func checkApply( apply: ApplySite ) throws {
177
+ if context. options. noAllocations && apply. isAsync {
178
+ throw Diagnostic ( . embedded_swift_allocating_type, at: apply. location)
179
+ }
184
180
185
- // Although all (non-generic) functions are initially put into the worklist there are two reasons
186
- // to call `checkFunction` recursively:
187
- // * To get a better caller info in the diagnostics.
188
- // * When passing an opened existential to a generic function, it's valid in Embedded swift even if the
189
- // generic is not specialized. We need to check such generic functions, too.
190
- if let callee = apply. referencedFunction {
191
- callStack. push ( CallSite ( apply: apply, callee: callee) )
192
- try checkFunction ( callee)
193
- _ = callStack. pop ( )
181
+ if !apply. callee. type. hasValidSignatureForEmbedded,
182
+ // Some runtime functions have generic parameters in SIL, which are not used in IRGen.
183
+ // Therefore exclude runtime functions at all.
184
+ !apply. callsEmbeddedRuntimeFunction
185
+ {
186
+ switch apply. callee {
187
+ case let cmi as ClassMethodInst :
188
+ throw Diagnostic ( . embedded_cannot_specialize_class_method, cmi. member, at: apply. location)
189
+ case let wmi as WitnessMethodInst :
190
+ throw Diagnostic ( . embedded_cannot_specialize_witness_method, wmi. member, at: apply. location)
191
+ default :
192
+ throw Diagnostic ( . embedded_call_generic_function, at: apply. location)
194
193
}
194
+ }
195
195
196
- default :
197
- break
196
+ // Although all (non-generic) functions are initially put into the worklist there are two reasons
197
+ // to call `checkFunction` recursively:
198
+ // * To get a better caller info in the diagnostics.
199
+ // * When passing an opened existential to a generic function, it's valid in Embedded swift even if the
200
+ // generic is not specialized. We need to check such generic functions, too.
201
+ if let callee = apply. referencedFunction {
202
+ callStack. push ( CallSite ( apply: apply, callee: callee) )
203
+ try checkFunction ( callee)
204
+ _ = callStack. pop ( )
198
205
}
199
206
}
200
207
0 commit comments