From 6b3169b799852c9a8577d29aaf22ddbefa4a1b4e Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Tue, 14 Dec 2021 20:42:39 +0100 Subject: [PATCH] #2569 --- TestSuite/generics59.pas | 11 +++++++++++ TreeConverter/TreeRealization/generics.cs | 10 ++++++++++ 2 files changed, 21 insertions(+) create mode 100644 TestSuite/generics59.pas diff --git a/TestSuite/generics59.pas b/TestSuite/generics59.pas new file mode 100644 index 000000000..cc1610877 --- /dev/null +++ b/TestSuite/generics59.pas @@ -0,0 +1,11 @@ +procedure p1(params a: array of T); +begin + assert(typeof(T) = typeof(integer)); +end; + +function f1: array of integer := nil; + +begin + p1(f1); + p1(f1()); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 54db1cf96..03f351e4e 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -878,10 +878,20 @@ namespace PascalABCCompiler.TreeRealization { //Проверяем фактические, попадающие под params... type_node tn = fact[i].type; + bool deduce_empty_func_call = false; + if (tn is delegated_methods && (tn as delegated_methods).empty_param_method != null && last_params_type.is_generic_parameter) + { + tn = (tn as delegated_methods).empty_param_method.ret_type; + deduce_empty_func_call = true; + } + if (tn.element_type != null && tn.type_special_kind != SemanticTree.type_special_kind.array_wrapper) tn = tn.element_type; + if (!DeduceInstanceTypes(last_params_type, tn, deduced, nils, generic_params)) { + if (deduce_empty_func_call && DeduceInstanceTypes(last_params_type, fact[i].type, deduced, nils, generic_params)) + continue; if (alone) throw new SimpleSemanticError(loc, "GENERIC_FUNCTION_{0}_CAN_NOT_BE_CALLED_WITH_THESE_PARAMETERS", func.name); return null;