diff --git a/TestSuite/implicitexplicit7.pas b/TestSuite/implicitexplicit7.pas new file mode 100644 index 000000000..7427f3722 --- /dev/null +++ b/TestSuite/implicitexplicit7.pas @@ -0,0 +1,25 @@ +type + t1 = class + static instance: t1; + + static function operator implicit(val: ^T): t1; + begin + if instance = nil then + instance := new t1; + Result := instance; + end; + end; + +procedure p1; +begin + var i := default(T); + var a: t1 := @i; + assert(a = t1.instance); +end; + +begin + var i := 5; + var a: t1 := @i; + assert(a = t1.instance); + p1&; +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/type_table.cs b/TreeConverter/TreeRealization/type_table.cs index ef1d3eba1..99d8cd4a6 100644 --- a/TreeConverter/TreeRealization/type_table.cs +++ b/TreeConverter/TreeRealization/type_table.cs @@ -851,6 +851,8 @@ namespace PascalABCCompiler.TreeRealization if (left.type_special_kind == SemanticTree.type_special_kind.set_type && right == SystemLibrary.SystemLibInitializer.TypedSetType.sym_info || right.type_special_kind == SemanticTree.type_special_kind.set_type && left == SystemLibrary.SystemLibInitializer.TypedSetType.sym_info) return true; + if (left is ref_type_node && right is ref_type_node) + return is_type_or_original_generics_equal((left as ref_type_node).pointed_type, (right as ref_type_node).pointed_type); return left == right; } diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index 2028d5e64..87d3efd79 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -2366,6 +2366,8 @@ namespace PascalABCCompiler.TreeRealization } else if (fn.get_generic_params_list() != null && fn.get_generic_params_list().Count > 0) { + if (ctn is ref_type_node) + ctn = (ctn as ref_type_node).pointed_type; if (ctn.IsPointer) continue; fn = fn.get_instance(new List(new type_node[] { ctn }), true, null);