From 4baf57d45f7a840f30b02aead37b267c6f60ce6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 16 Sep 2018 18:32:46 +0200 Subject: [PATCH] bug fix #1160 --- NETGenerator/NETGenerator.cs | 8 +++++--- TestSuite/generics23.pas | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 TestSuite/generics23.pas 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