diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index e593d9149..491793d5d 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -7343,7 +7343,7 @@ namespace PascalABCCompiler.NETGenerator bool tmp_dot = is_dot_expr; if (!tmp_dot) is_dot_expr = true; - if ((value.method.polymorphic_state == polymorphic_state.ps_virtual || value.method.polymorphic_state == polymorphic_state.ps_virtual_abstract) && (value.obj is ICommonParameterReferenceNode || value.obj is ICommonClassFieldReferenceNode)) + if ((value.method.polymorphic_state == polymorphic_state.ps_virtual || value.method.polymorphic_state == polymorphic_state.ps_virtual_abstract || value.method.polymorphic_state == polymorphic_state.ps_common) && (value.obj is ICommonParameterReferenceNode || value.obj is ICommonClassFieldReferenceNode)) virtual_method_call = true; value.obj.visit(this); virtual_method_call = false; diff --git a/TestSuite/generics56.pas b/TestSuite/generics56.pas new file mode 100644 index 000000000..a20b39131 --- /dev/null +++ b/TestSuite/generics56.pas @@ -0,0 +1,20 @@ +var i: integer; +type + t1 = class + // Обязательно НЕ виртуальный метод + procedure p1(x: integer); + begin + i := x; + end; + end; + +procedure p0(a: T); +where T: t1; +begin + a.p1(1); +end; + +begin + p0(new t1); + assert(i = 1); +end. \ No newline at end of file diff --git a/TestSuite/generics57.pas b/TestSuite/generics57.pas new file mode 100644 index 000000000..47a650c9e --- /dev/null +++ b/TestSuite/generics57.pas @@ -0,0 +1,23 @@ +var i: integer; +type + IInt = interface + procedure p1(x: integer); + end; + + t1 = class(IInt) + public procedure p1(x: integer); + begin + i := x; + end; + end; + +procedure p0(a: T); +where T: IInt; +begin + a.p1(1); +end; + +begin + p0(new t1); + assert(i = 1); +end. \ No newline at end of file