This commit is contained in:
Ivan Bondarev 2022-06-17 17:14:17 +02:00
parent b13ef78416
commit 3115f470df
2 changed files with 43 additions and 1 deletions

View file

@ -0,0 +1,29 @@
var i: integer;
type
t1 = class
static function operator implicit<T>(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.

View file

@ -2437,7 +2437,20 @@ namespace PascalABCCompiler.TreeRealization
if (sil != null) if (sil != null)
{ {
function_node fn = 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; 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 != 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))