diff --git a/TestSuite/generics38.pas b/TestSuite/generics38.pas new file mode 100644 index 000000000..cbf8f648f --- /dev/null +++ b/TestSuite/generics38.pas @@ -0,0 +1,42 @@ +type + Comp1 = class(System.Collections.Generic.EqualityComparer) + + public function Equals(x, y: byte): boolean; override := + x = y; + + public function GetHashCode(obj: byte): integer; override := + obj.GetHashCode; + + end; + + t0 = class end; + + + Comp2 = class(System.Collections.Generic.EqualityComparer) + + public function Equals(x, y: t0): boolean; override := + x = y; + + public function GetHashCode(obj: t0): integer; override := + obj.GetHashCode; + + end; + + Comp = class(System.Collections.Generic.EqualityComparer) + + public function Equals(x, y: T): boolean; override := + x = y; + + public function GetHashCode(obj: T): integer; override := + obj.GetHashCode; + + end; + +begin + var o := new Comp2; + var t0obj := new t0; + assert(o.Equals(new t0, new t0) = false); + assert(o.Equals(t0obj, t0obj)); + var o2 := new Comp; + assert(o2.Equals(2, 2)); +end. \ No newline at end of file diff --git a/TreeConverter/NetWrappers/NetHelper.cs b/TreeConverter/NetWrappers/NetHelper.cs index f4a37371e..e015ff094 100644 --- a/TreeConverter/NetWrappers/NetHelper.cs +++ b/TreeConverter/NetWrappers/NetHelper.cs @@ -1388,7 +1388,7 @@ namespace PascalABCCompiler.NetHelper } common_type_node curr_type = SystemLibrary.SystemLibrary.syn_visitor.context.converted_type; compiled_type_node comp_node = compiled_type_node.get_type_node(mi.DeclaringType); - return curr_type != null && type_table.is_derived(comp_node, curr_type); + return curr_type != null && type_table.is_derived(comp_node, curr_type, true); } public static List GetConstructor(Type t) diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index f41a373ef..e52d04b13 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1333,6 +1333,7 @@ namespace PascalABCCompiler.TreeRealization } } } + return false; } diff --git a/TreeConverter/TreeRealization/type_table.cs b/TreeConverter/TreeRealization/type_table.cs index d2397bd2d..676923ddc 100644 --- a/TreeConverter/TreeRealization/type_table.cs +++ b/TreeConverter/TreeRealization/type_table.cs @@ -345,13 +345,15 @@ namespace PascalABCCompiler.TreeRealization } } - public static bool is_derived(type_node base_class, type_node derived_class) + public static bool is_derived(type_node base_class, type_node derived_class, bool ignore_generic_instances=false) { if (derived_class == null) //void? return false; if (base_class == null) return false; type_node tn = derived_class.base_type; + if (tn is compiled_generic_instance_type_node && ignore_generic_instances) + tn = tn.original_generic; //TODO: Проверить на ссылочный и размерный тип. if (derived_class.semantic_node_type == semantic_node_type.null_type_node) if (is_with_nil_allowed(base_class) || base_class.IsPointer)