From af106375a95ed6e386cac9bc9c285aef08ed9e5f Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 19 Jun 2022 11:16:34 +0200 Subject: [PATCH] #2589 --- TestSuite/generics65.pas | 13 ++++++++ TreeConverter/TreeRealization/types.cs | 41 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 TestSuite/generics65.pas diff --git a/TestSuite/generics65.pas b/TestSuite/generics65.pas new file mode 100644 index 000000000..f8c344690 --- /dev/null +++ b/TestSuite/generics65.pas @@ -0,0 +1,13 @@ +type + // Не важно запись или класс, но обязательно пользовательский тип + t1 = class end; + +procedure p1(l: TList); where TList: IList; +begin + assert(l.Count = 0); + assert(not l.Contains(new t1)); +end; + +begin + p1(new t1[0]); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index 1f5e02451..669432b23 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -2195,6 +2195,47 @@ namespace PascalABCCompiler.TreeRealization if (si.sym_info is function_node && (si.sym_info as function_node).is_extension_method && sil.FindIndex(ssi=> ssi.sym_info == si.sym_info)==-1) // SSM 12.12.18 - за счёт методов интерфейсов тоже могут добавляться одинаковые - исключаем их sil.Add(si); + else if (si.sym_info is common_property_node && (si.sym_info as common_property_node).common_comprehensive_type is generic_instance_type_node + && sil.FindIndex(ssi => ssi.sym_info == si.sym_info) == -1) + { + bool insert = false; + var cmpn = si.sym_info as common_property_node; + foreach (var si2 in sil) + { + if (si2.sym_info is compiled_property_node) + { + var cppn = si2.sym_info as compiled_property_node; + if (string.Compare(cppn.name, cmpn.name, true) == 0 && cppn.compiled_comprehensive_type.original_generic == cmpn.common_comprehensive_type.original_generic) + { + insert = true; + break; + } + } + } + if (insert) + sil.Insert(0, si); + } + else if (si.sym_info is common_method_node && (si.sym_info as common_method_node).common_comprehensive_type is generic_instance_type_node + && sil.FindIndex(ssi => ssi.sym_info == si.sym_info) == -1) + { + bool insert = false; + var cmn = si.sym_info as common_method_node; + foreach (var si2 in sil) + { + if (si2.sym_info is compiled_function_node) + { + var cfn = si2.sym_info as compiled_function_node; + if (string.Compare(cmn.name, cfn.name, true) == 0 && cfn.cont_type.original_generic == cmn.cont_type.original_generic && convertion_data_and_alghoritms.function_eq_params_and_result(cmn, cfn)) + { + insert = true; + break; + } + } + } + if (insert) + sil.Insert(0, si); + } + cache.Add(si.sym_info, si.sym_info); } }