diff --git a/TestSuite/cast3.pas b/TestSuite/cast3.pas new file mode 100644 index 000000000..0e5e74510 --- /dev/null +++ b/TestSuite/cast3.pas @@ -0,0 +1,38 @@ +type TClass = class(System.Collections.Generic.IComparer>) + i: integer; + public function Compare(a, b: TClass): integer; + begin + Result := integer(a.i > b.i); + end; +end; + +begin + var o:object := new System.Collections.Generic.List(); + var e := System.Collections.Generic.List&(o); + assert(e.Count = 0); + e := o as System.Collections.Generic.List; + assert(e.Count = 0); + var a := 0; + if o is System.Collections.Generic.List& then + a := 1; + assert(a = 1); + o := 'abc'; + var s := string(o); + var s1 := o as string; + assert(o as string = 'abc'); + assert(string(o) = 'abc'); + assert(s = 'abc'); + assert(s1 = 'abc'); + o := 2; + assert(integer(o) = 2); + o := new List; + assert((o as List).Count = 0); + assert(List&(o).Count = 0); + o := new TClass; + (o as TClass).i := 2; + assert((o as System.Collections.Generic.IComparer>) <> nil); + var cmp := System.Collections.Generic.IComparer&>(o); + assert(cmp.Compare(o as TClass,o as TClass) = 0); + cmp := o as System.Collections.Generic.IComparer>; + assert(cmp.Compare(TClass&(o),TClass&(o)) = 0); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index bce1aabf7..00d9a0d6b 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -5401,12 +5401,18 @@ namespace PascalABCCompiler.TreeConverter sil = nsn.find(id_right.name); if (templ_args_count != 0) { - SymbolInfo conv = ConvertTypeToInstance(sil?.FirstOrDefault(), iwt.template_params.params_list, get_location(id_right)); + sil = nsn.find(id_right.name + compiler_string_consts.generic_params_infix + templ_args_count.ToString()); + if (sil != null) + { + sil = new List { new SymbolInfo(get_generic_instance(sil?.FirstOrDefault(), iwt.template_params.params_list)) }; + iwt = null; + } + /*SymbolInfo conv = ConvertTypeToInstance(sil?.FirstOrDefault(), iwt.template_params.params_list, get_location(id_right)); if (conv != null) { sil = new List { conv }; iwt = null; - } + }*/ } } }