@@ -1276,16 +1276,16 @@ function code_typed_by_type(@nospecialize(tt::Type);
12761276 return asts
12771277end
12781278
1279- function code_typed_opaque_closure (@nospecialize (closure:: Core.OpaqueClosure );
1280- optimize= true ,
1281- debuginfo:: Symbol = :default ,
1282- interp = Core. Compiler. NativeInterpreter (closure. world))
1279+ function code_typed_opaque_closure (@nospecialize (oc:: Core.OpaqueClosure );
1280+ debuginfo:: Symbol = :default , __... )
12831281 ccall (:jl_is_in_pure_context , Bool, ()) && error (" code reflection cannot be used from generated functions" )
1284- m = closure . source
1282+ m = oc . source
12851283 if isa (m, Method)
12861284 code = _uncompressed_ir (m, m. source)
12871285 debuginfo === :none && remove_linenums! (code)
1288- return Any[(code => code. rettype)]
1286+ # intersect the declared return type and the inferred return type (if available)
1287+ rt = typeintersect (code. rettype, typeof (oc). parameters[2 ])
1288+ return Any[code => rt]
12891289 else
12901290 error (" encountered invalid Core.OpaqueClosure object" )
12911291 end
@@ -1295,6 +1295,10 @@ function return_types(@nospecialize(f), @nospecialize(types=default_tt(f));
12951295 world = get_world_counter (),
12961296 interp = Core. Compiler. NativeInterpreter (world))
12971297 ccall (:jl_is_in_pure_context , Bool, ()) && error (" code reflection cannot be used from generated functions" )
1298+ if isa (f, Core. OpaqueClosure)
1299+ _, rt = only (code_typed_opaque_closure (f))
1300+ return Any[rt]
1301+ end
12981302 types = to_tuple_type (types)
12991303 rt = []
13001304 for match in _methods (f, types, - 1 , world):: Vector
0 commit comments