@@ -330,3 +330,33 @@ extension OptionalMemberLookups {
330330func checkHotdogs( _ v: some HotdogCompetitor , _ timeLimit: NSObject ) async throws -> String ? {
331331 return try await v. pileOfHotdogsToEat ( withLimit: timeLimit)
332332}
333+
334+ /// Issue 65199: pass zero-initialized completion handler arguments for the
335+ /// normal result on the error path of an ObjC async thunk.
336+ extension SlowServer : @retroactive FailableFloatLoader {
337+ public func loadFloatOrThrow( ) async throws -> Float {
338+ return 0
339+ }
340+ }
341+ // CHECK-LABEL: sil [ossa] @$sSo10SlowServerC10objc_asyncE16loadFloatOrThrowSfyYaKF : $@convention(method) @async (@guaranteed SlowServer) -> (Float, @error any Error)
342+
343+ // CHECK-LABEL: sil private [thunk] [ossa] @$sSo10SlowServerC10objc_asyncE16loadFloatOrThrowSfyYaKFTo : $@convention(objc_method) (@convention(block) @Sendable (Float, Optional<NSError>) -> (), SlowServer) -> () {
344+ // CHECK: function_ref @$sSo10SlowServerC10objc_asyncE16loadFloatOrThrowSfyYaKFyyYacfU_To
345+
346+ // CHECK-LABEL: sil shared [thunk] [ossa] @$sSo10SlowServerC10objc_asyncE16loadFloatOrThrowSfyYaKFyyYacfU_To : $@convention(thin) @Sendable @async (@convention(block) @Sendable (Float, Optional<NSError>) -> (), SlowServer) -> ()
347+ // CHECK: [[BLOCK:%.*]] = copy_block
348+ // CHECK: [[METHOD:%.*]] = function_ref @$sSo10SlowServerC10objc_asyncE16loadFloatOrThrowSfyYaKF :
349+ // CHECK: try_apply [[METHOD]]({{%.*}}) : {{.*}}, normal bb1, error bb2
350+ // CHECK: bb1([[NORMAL_RESULT:%.*]] : $Float):
351+ // CHECK-NEXT: [[BORROWED_BLOCK:%.*]] = begin_borrow [[BLOCK]] :
352+ // CHECK-NEXT: [[NIL_NSERROR:%.*]] = enum $Optional<NSError>, #Optional.none
353+ // CHECK-NEXT: apply [[BORROWED_BLOCK]]([[NORMAL_RESULT]], [[NIL_NSERROR]])
354+ // CHECK: bb2([[ERROR_RESULT:%.*]] : @owned $any Error):
355+ // CHECK-NEXT: [[BORROWED_BLOCK:%.*]] = begin_borrow [[BLOCK]] :
356+ // CHECK-NEXT: // function_ref
357+ // CHECK-NEXT: [[CONVERT_FN:%.*]] = function_ref
358+ // CHECK-NEXT: [[NSERROR:%.*]] = apply [[CONVERT_FN]]([[ERROR_RESULT]])
359+ // CHECK-NEXT: [[SOME_NSERROR:%.*]] = enum $Optional<NSError>, #Optional.some!enumelt, [[NSERROR]] : $NSError
360+ // CHECK-NEXT: [[ZERO_FLOAT:%.*]] = builtin "zeroInitializer"() : $Float
361+ // CHECK-NEXT: [[BORROWED_SOME_NSERROR:%.*]] = begin_borrow [[SOME_NSERROR]] :
362+ // CHECK-NEXT: apply [[BORROWED_BLOCK]]([[ZERO_FLOAT]], [[BORROWED_SOME_NSERROR]])
0 commit comments