[mono] Handle enum return type when inlining CreateInstance (#91061)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Mon, 28 Aug 2023 16:10:28 +0000 (09:10 -0700)
committerGitHub <noreply@github.com>
Mon, 28 Aug 2023 16:10:28 +0000 (09:10 -0700)
Use underlying base type when deciding how to inline a
CreateInstance invocation in mini_emit_inst_for_method.

Fixes https://github.com/dotnet/runtime/issues/90292
(Mono abort causing .NET 8 msbuild regression).

Co-authored-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Co-authored-by: Larry Ewing <lewing@microsoft.com>
src/mono/mono/mini/intrinsics.c

index b1e5e76..ef77b7d 100644 (file)
@@ -2079,7 +2079,9 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        MonoType *t = method_context->method_inst->type_argv [0];
                        MonoClass *arg0 = mono_class_from_mono_type_internal (t);
                        if (m_class_is_valuetype (arg0) && !mono_class_has_default_constructor (arg0, FALSE)) {
-                               if (m_class_is_primitive (arg0)) {
+                               if (m_class_is_primitive (arg0) || m_class_is_enumtype (arg0)) {
+                                       if (m_class_is_enumtype (arg0))
+                                               t = mono_class_enum_basetype_internal (arg0);
                                        int dreg = alloc_dreg (cfg, mini_type_to_stack_type (cfg, t));
                                        mini_emit_init_rvar (cfg, dreg, t);
                                        ins = cfg->cbb->last_ins;