diff --git a/TestSuite/generics43.pas b/TestSuite/generics43.pas new file mode 100644 index 000000000..40ef7a6ce --- /dev/null +++ b/TestSuite/generics43.pas @@ -0,0 +1,28 @@ +var i: integer; +procedure p1(a: array of T); +begin + i := 1; +end; +procedure p1(a: T); +begin + i := 2; +end; + +procedure p2(a: array[,] of T); +begin + i := 1; +end; +procedure p2(a: T); +begin + i := 2; +end; + + +begin + var a := new byte[5]; + p1(a); + assert(i = 1); + i := 0; + p2(a); + assert(i = 2); +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 d667f86b6..1f116103a 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -2602,7 +2602,25 @@ namespace PascalABCCompiler.TreeConverter } }*/ } - + } + List to_remove = new List(); + foreach (function_node fn in funcs) + { + if (fn.is_generic_function_instance) + foreach (parameter p in fn.original_function.parameters) + { + if (p.type.is_generic_parameter) + { + to_remove.Add(fn); + break; + } + } + } + if (set_of_possible_functions.Count - to_remove.Count == 1) + { + foreach (function_node fn in to_remove) + set_of_possible_functions.Remove(fn); + return set_of_possible_functions[0]; } }