diff --git a/TestSuite/generics33.pas b/TestSuite/generics33.pas new file mode 100644 index 000000000..8bbb54e89 --- /dev/null +++ b/TestSuite/generics33.pas @@ -0,0 +1,24 @@ +var i: integer; + +type + t1 = class + + function f1: T; virtual := default(T); + + end; + + t2 = class(t1) + + function f1: T; override; + begin + i := 1; + Result := default(T); + end; + + end; + +begin + var o: t1 := new t2; + assert(o.f1& = 0); + assert(i = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index 8c476283b..284f22bb3 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -1409,9 +1409,6 @@ namespace PascalABCCompiler.TreeConverter return method_compare.not_comparable_methods; } - //DS добавил этот метод - //А так ли это надо делать? - //Сергей, может ты знаеш? internal static bool eq_type_nodes(type_node tn1, type_node tn2, bool strong) { if (tn1 == tn2) @@ -1550,6 +1547,13 @@ namespace PascalABCCompiler.TreeConverter } else { + if (left.return_value_type != null && right.return_value_type != null && left.return_value_type.is_generic_parameter && right.return_value_type.is_generic_parameter) + { + if (string.Compare(left.return_value_type.name, right.return_value_type.name, true) != 0) + return false; + return eq_type_nodes(left.return_value_type, right.return_value_type, false); + } + return eq_type_nodes(left.return_value_type, right.return_value_type, weak); } }