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) 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