From d56b2b1009aa1e17aec04d5d26099c48e53ea6e4 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, 14 Jul 2019 18:59:07 +0200 Subject: [PATCH] bug fix #1309 --- NETGenerator/NETGenerator.cs | 6 +++--- TestSuite/generics29.pas | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 TestSuite/generics29.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 8be352ffa..4b8b694af 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -6984,7 +6984,7 @@ namespace PascalABCCompiler.NETGenerator } EmitFreePinnedVariables(); - if (tmp_dot == true) + if (tmp_dot) { //MethodInfo mi = value.compiled_method.method_info; if ((mi.ReturnType.IsValueType || mi.ReturnType.IsGenericParameter) && !NETGeneratorTools.IsPointer(mi.ReturnType)) @@ -7118,7 +7118,7 @@ namespace PascalABCCompiler.NETGenerator //Для правильной работы шаблонов поменял условие (ssyy, 15.05.2009) if ((value.method.return_value_type != null && value.method.return_value_type.is_value_type /*|| value.method.return_value_type != null && value.method.return_value_type.is_generic_parameter*/) && !NETGeneratorTools.IsPointer(mi.ReturnType)) { - LocalBuilder lb = mi.ReturnType.IsGenericParameter ? + LocalBuilder lb = (mi.ReturnType.IsGenericType || mi.ReturnType.IsGenericParameter) ? il.DeclareLocal(helper.GetTypeReference(value.method.return_value_type).tp) : il.DeclareLocal(mi.ReturnType); il.Emit(OpCodes.Stloc, lb); @@ -7473,7 +7473,7 @@ namespace PascalABCCompiler.NETGenerator { if (value.namespace_function.return_value_type != null && value.namespace_function.return_value_type.is_value_type && !NETGeneratorTools.IsPointer(mi.ReturnType)) { - LocalBuilder lb = mi.ReturnType.IsGenericParameter ? + LocalBuilder lb = (mi.ReturnType.IsGenericType || mi.ReturnType.IsGenericParameter) ? il.DeclareLocal(helper.GetTypeReference(value.namespace_function.return_value_type).tp) : il.DeclareLocal(mi.ReturnType); il.Emit(OpCodes.Stloc, lb); diff --git a/TestSuite/generics29.pas b/TestSuite/generics29.pas new file mode 100644 index 000000000..8f1c6247b --- /dev/null +++ b/TestSuite/generics29.pas @@ -0,0 +1,27 @@ +function DQNToNullable(v: T): System.Nullable; where T: record; +begin + Result := new System.Nullable(v); +end; + +type TClass = class + function DQNToNullable(v: T): System.Nullable; where T: record; + begin + Result := new System.Nullable(v); + end; +end; + +type TClass2 = class + static function DQNToNullable(v: T): System.Nullable; where T: record; + begin + Result := new System.Nullable(v); + end; +end; + +begin + var x := DQNToNullable(2); + assert(x.Value = 2); + assert(DQNToNullable(2).Value = 2); + var o := new TClass;; + assert(o.DQNToNullable(3).Value = 3); + assert(TClass2.DQNToNullable(3).Value = 3); +end. \ No newline at end of file