From 86e2a05db0fdff843e04b139f5f0a3f34fb5dbb7 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 3 Apr 2022 11:50:10 +0200 Subject: [PATCH] #2638 #2648 --- NETGenerator/NETGenerator.cs | 4 +++- TestSuite/generics61.pas | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 TestSuite/generics61.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 3c1b60153..141234291 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -7283,6 +7283,8 @@ namespace PascalABCCompiler.NETGenerator _box = value.obj.conversion_type.is_value_type; if (_box) is_dot_expr = false; + if ((value.compiled_method.polymorphic_state == polymorphic_state.ps_virtual || value.compiled_method.polymorphic_state == polymorphic_state.ps_virtual_abstract || value.compiled_method.polymorphic_state == polymorphic_state.ps_common) && (value.obj is ICommonParameterReferenceNode || value.obj is ICommonClassFieldReferenceNode)) + virtual_method_call = true; value.obj.visit(this); if (value.obj.type.is_value_type && !value.compiled_method.method_info.DeclaringType.IsValueType) { @@ -11444,7 +11446,7 @@ namespace PascalABCCompiler.NETGenerator { if (is_dot_expr == true) //если после перем. в выражении стоит точка { - if (lb.LocalType.IsValueType == true || value.type.is_generic_parameter) + if (lb.LocalType.IsValueType || value.type.is_generic_parameter) { if (is_field_reference && value.type.is_generic_parameter && value.type.base_type != null && value.type.base_type.is_class && value.type.base_type.base_type != null) il.Emit(OpCodes.Ldloc, lb); diff --git a/TestSuite/generics61.pas b/TestSuite/generics61.pas new file mode 100644 index 000000000..7a9477a84 --- /dev/null +++ b/TestSuite/generics61.pas @@ -0,0 +1,15 @@ +procedure p1(o: T); where T: Exception; +begin + assert(o.ToString = Exception.Create.ToString); +end; + +procedure p2(a: T); where T: System.Array; +begin + assert(a.Length = 2); + assert((a as System.Array).Length = 2); +end; + +begin + p1(new Exception); + p2(new integer[2]); +end. \ No newline at end of file