diff --git a/Compiler/PCU/PCUReader.cs b/Compiler/PCU/PCUReader.cs index e85c100f6..8eced8003 100644 --- a/Compiler/PCU/PCUReader.cs +++ b/Compiler/PCU/PCUReader.cs @@ -1434,21 +1434,30 @@ namespace PascalABCCompiler.PCU { common_namespace_function_node orig = GetNamespaceFunctionByOffset(); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null) as generic_namespace_function_instance_node; + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null) as generic_namespace_function_instance_node; + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private function_node GetCompiledGenericMethodInstanceReference() { compiled_function_node orig = GetCompiledMethod(br.ReadInt32()); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null); + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null); + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private generic_method_instance_node GetCommonGenericMethodInstanceReference() { common_method_node orig = GetMethodByOffset(); List parameters = GetTypesList(); - return orig.get_instance(parameters, false, null) as generic_method_instance_node; + int tmp_pos = (int)br.BaseStream.Position; + var instance = orig.get_instance(parameters, false, null) as generic_method_instance_node; + br.BaseStream.Seek(tmp_pos, SeekOrigin.Begin); + return instance; } private common_type_node GetGenericParameterOfType() @@ -4553,6 +4562,16 @@ namespace PascalABCCompiler.PCU return lab; } + public int GetStreamPosition() + { + return (int)br.BaseStream.Position; + } + + public void SetStreamPosition(int pos) + { + br.BaseStream.Seek(pos, SeekOrigin.Begin); + } + /*private List CreateLabels() { int count = br.ReadInt32(); diff --git a/TestSuite/units/u_where1.pas b/TestSuite/units/u_where1.pas new file mode 100644 index 000000000..3aadbf0cd --- /dev/null +++ b/TestSuite/units/u_where1.pas @@ -0,0 +1,20 @@ +unit u_where1; + +var i: integer; + +type + t1 = class end; + +procedure p0(a: T); where T: t1; +begin + i := 1; +end; + +procedure p1; +begin + p0&,byte>(new t1); +end; +begin + p1; + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/units/u_while1.pas b/TestSuite/units/u_while1.pas index 5a98adea2..137dca609 100644 --- a/TestSuite/units/u_while1.pas +++ b/TestSuite/units/u_while1.pas @@ -1,4 +1,4 @@ -unit u_while1; +unit u_while1; begin var i := 1; var s := 0; diff --git a/TestSuite/usesunits/use_where1.pas b/TestSuite/usesunits/use_where1.pas new file mode 100644 index 000000000..1adc3c21b --- /dev/null +++ b/TestSuite/usesunits/use_where1.pas @@ -0,0 +1 @@ +uses u_where1; begin end. \ No newline at end of file