From 180f1e55e60610a81857b94fb0dcef1be4fbe505 Mon Sep 17 00:00:00 2001 From: SunSerega Date: Tue, 11 Jun 2019 16:13:34 +0300 Subject: [PATCH 1/2] fix #1986 --- NETGenerator/NETGenerator.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 0843ecea9..62c4ed03b 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -5433,8 +5433,9 @@ namespace PascalABCCompiler.NETGenerator { if (lb.LocalType.IsGenericParameter) { - il.Emit(OpCodes.Ldloc, lb); - il.Emit(OpCodes.Box, lb.LocalType); + //il.Emit(OpCodes.Ldloc, lb); + //il.Emit(OpCodes.Box, lb.LocalType); + il.Emit(OpCodes.Ldloca, lb); // #1986 } else if (lb.LocalType.IsValueType) From dbc665a85b6a78d1617541c4a891d1501060b10a Mon Sep 17 00:00:00 2001 From: SunSerega Date: Tue, 11 Jun 2019 16:43:27 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TestSuite/where8.pas | 28 ++++++++++++++++++++++++++++ TestSuite/where9.pas | 18 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 TestSuite/where8.pas create mode 100644 TestSuite/where9.pas diff --git a/TestSuite/where8.pas b/TestSuite/where8.pas new file mode 100644 index 000000000..2dcfd08b8 --- /dev/null +++ b/TestSuite/where8.pas @@ -0,0 +1,28 @@ +type + t0 = abstract class + function f0: integer; abstract; + end; + t1 = class(t0) + i: integer; + function f0: integer; override := i; + constructor(i: integer) := self.i := i; + end; + +function f1: T; +where T: t0; +begin + + Result := T(t0( + new t1(10) + )); + + Result.f0.Println; // до #1986 было AccessViolationException + +end; + +begin + + f1&; + +// readln; +end. \ No newline at end of file diff --git a/TestSuite/where9.pas b/TestSuite/where9.pas new file mode 100644 index 000000000..33ff6faf4 --- /dev/null +++ b/TestSuite/where9.pas @@ -0,0 +1,18 @@ +function f1: TArray; +where TArray: System.Array; +begin + + Result := TArray(System.Array( + new integer[10] + )); + + Result.Length.Println; // до #1986 выводило 107, не зависимо от массива выше + +end; + +begin + + f1&; + +// readln; +end. \ No newline at end of file