#2648
This commit is contained in:
Ivan Bondarev 2022-04-03 11:50:10 +02:00
parent a33a42cc10
commit 86e2a05db0
2 changed files with 18 additions and 1 deletions

View file

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

15
TestSuite/generics61.pas Normal file
View file

@ -0,0 +1,15 @@
procedure p1<T>(o: T); where T: Exception;
begin
assert(o.ToString = Exception.Create.ToString);
end;
procedure p2<T>(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.