@@ -1276,16 +1276,16 @@ function code_typed_by_type(@nospecialize(tt::Type);
1276
1276
return asts
1277
1277
end
1278
1278
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 , __... )
1283
1281
ccall (:jl_is_in_pure_context , Bool, ()) && error (" code reflection cannot be used from generated functions" )
1284
- m = closure . source
1282
+ m = oc . source
1285
1283
if isa (m, Method)
1286
1284
code = _uncompressed_ir (m, m. source)
1287
1285
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]
1289
1289
else
1290
1290
error (" encountered invalid Core.OpaqueClosure object" )
1291
1291
end
@@ -1295,6 +1295,10 @@ function return_types(@nospecialize(f), @nospecialize(types=default_tt(f));
1295
1295
world = get_world_counter (),
1296
1296
interp = Core. Compiler. NativeInterpreter (world))
1297
1297
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
1298
1302
types = to_tuple_type (types)
1299
1303
rt = []
1300
1304
for match in _methods (f, types, - 1 , world):: Vector
0 commit comments