diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index cc2187067..8deffde7c 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -7353,11 +7353,13 @@ namespace PascalABCCompiler.NETGenerator EmitArguments(parameters, real_parameters); il.EmitCall(OpCodes.Call, mi, null); EmitFreePinnedVariables(); - if (tmp_dot == true) + if (tmp_dot) { - if (mi.ReturnType.IsValueType && !NETGeneratorTools.IsPointer(mi.ReturnType)) + if (value.namespace_function.return_value_type != null && value.namespace_function.return_value_type.is_value_type && !NETGeneratorTools.IsPointer(mi.ReturnType)) { - LocalBuilder lb = il.DeclareLocal(mi.ReturnType); + LocalBuilder lb = mi.ReturnType.IsGenericParameter ? + il.DeclareLocal(helper.GetTypeReference(value.namespace_function.return_value_type).tp) : + il.DeclareLocal(mi.ReturnType); il.Emit(OpCodes.Stloc, lb); il.Emit(OpCodes.Ldloca, lb); } diff --git a/TestSuite/generics23.pas b/TestSuite/generics23.pas new file mode 100644 index 000000000..5e436f6e9 --- /dev/null +++ b/TestSuite/generics23.pas @@ -0,0 +1,11 @@ +type + TSome = record + fX: integer := 1; + function Method() := fX; + end; + +function CastTo(reference: object) := T(reference); + +begin + assert(CastTo&(new TSome()).Method() = 1); +end. \ No newline at end of file