parent
a33a42cc10
commit
86e2a05db0
|
|
@ -7283,6 +7283,8 @@ namespace PascalABCCompiler.NETGenerator
|
||||||
_box = value.obj.conversion_type.is_value_type;
|
_box = value.obj.conversion_type.is_value_type;
|
||||||
if (_box)
|
if (_box)
|
||||||
is_dot_expr = false;
|
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);
|
value.obj.visit(this);
|
||||||
if (value.obj.type.is_value_type && !value.compiled_method.method_info.DeclaringType.IsValueType)
|
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 (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)
|
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);
|
il.Emit(OpCodes.Ldloc, lb);
|
||||||
|
|
|
||||||
15
TestSuite/generics61.pas
Normal file
15
TestSuite/generics61.pas
Normal 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.
|
||||||
Loading…
Reference in a new issue