diff --git a/TestSuite/lambdas20.pas b/TestSuite/lambdas20.pas new file mode 100644 index 000000000..fa7836ab7 --- /dev/null +++ b/TestSuite/lambdas20.pas @@ -0,0 +1,22 @@ +type + // Обязательно внутри класса + t1 = class + + // Не важно, статический ли метод + // + // Обязательно имя Equals + // + // Обязательно первый параметр - класс + // (из .dll или паскалевский - не важно) + // + // Обязательно p должен принимать параметр, + // чтобы лямбда ниже его авто-вычисляла + public static function Equals(o: Exception; p: byte->()) := true; + + end; + +begin + // Обязательно передать именно лямбду, + // а не существующую подпрограмму + assert(t1.Equals(nil, l->begin end)); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 87f850905..7a3ed0f1f 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -15462,7 +15462,15 @@ namespace PascalABCCompiler.TreeConverter { common_type_node del = convertion_data_and_alghoritms.type_constructor.create_delegate(context.get_delegate_type_name(), fn.return_value_type, fn.parameters, context.converted_namespace, null); - context.converted_namespace.types.AddElement(del); + bool has_lambda_any_type = false; + foreach (common_method_node cmn in del.methods) + if (cmn.parameters.Count > 0 && cmn.parameters[0].type is lambda_any_type_node) + { + has_lambda_any_type = true; + break; + } + if (!has_lambda_any_type) + context.converted_namespace.types.AddElement(del); return del; }