From 3115f470df17fbfb54e2b1ed8688150adc80cb54 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Fri, 17 Jun 2022 17:14:17 +0200 Subject: [PATCH] #2650 --- TestSuite/implicitexplicit26.pas | 29 ++++++++++++++++++++++++++ TreeConverter/TreeRealization/types.cs | 15 ++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 TestSuite/implicitexplicit26.pas diff --git a/TestSuite/implicitexplicit26.pas b/TestSuite/implicitexplicit26.pas new file mode 100644 index 000000000..09ace6bd6 --- /dev/null +++ b/TestSuite/implicitexplicit26.pas @@ -0,0 +1,29 @@ +var i: integer; +type + t1 = class + + static function operator implicit(val: T): t1; + begin + i := 1; + end; + + static function operator implicit(val: byte): t1; + begin + i := 2; + end; + + static function operator implicit(val: integer): t1; + begin + i := 3; + end; + + end; + +begin + var o: t1 := 0; + assert(i = 3); + o := 2.3; + assert(i = 1); + o := byte(1); + assert(i = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeRealization/types.cs b/TreeConverter/TreeRealization/types.cs index fd57c1c96..1f5e02451 100644 --- a/TreeConverter/TreeRealization/types.cs +++ b/TreeConverter/TreeRealization/types.cs @@ -2437,7 +2437,20 @@ namespace PascalABCCompiler.TreeRealization if (sil != null) { function_node fn = null; - foreach(var si in sil) + foreach (var si in sil) + { + fn = si.sym_info as function_node; + if (fn != null && fn.parameters.Count == 1 && type_table.is_type_or_original_generics_equal(fn.parameters[0].type, ctn) && type_table.is_type_or_original_generics_equal(fn.return_value_type, this)) + { + if (!fn.is_generic_function) + { + if (fn.parameters[0].type.is_generic_parameter && type_table.is_derived(ctn, this)) + continue; + return fn; + } + } + } + foreach (var si in sil) { fn = si.sym_info as function_node; if (fn != null && fn.parameters.Count == 1 && type_table.is_type_or_original_generics_equal(fn.parameters[0].type, ctn) && type_table.is_type_or_original_generics_equal(fn.return_value_type, this))