diff --git a/TestSuite/partial_generics1.pas b/TestSuite/partial_generics1.pas new file mode 100644 index 000000000..b21f91573 --- /dev/null +++ b/TestSuite/partial_generics1.pas @@ -0,0 +1,22 @@ +type + T1 = partial class + i: integer; + procedure Test; + begin + Inc(i); + end; + end; + + T1 = partial class + procedure Test2; + begin + Inc(i); + end; + end; + +begin + var obj := new T1; + obj.Test; + obj.Test2; + assert(obj.i = 2); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index bf951aebc..7c5327f26 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -2550,6 +2550,7 @@ namespace PascalABCCompiler.TreeConverter //cnode.ForwardDeclarationOnly = false; return cnode; } + if (cnode != null && is_partial && cnode.IsPartial) { return cnode; diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 25a4063c7..fd73327d1 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -11697,7 +11697,7 @@ namespace PascalABCCompiler.TreeConverter { List sil = context.find_only_in_namespace(_type_declaration.type_name.name + compiler_string_consts.generic_params_infix + cl_def.template_args.idents.Count.ToString()); - if (!(sil != null && sil.FirstOrDefault().sym_info is common_type_node && context.types_predefined.IndexOf(sil.FirstOrDefault().sym_info as common_type_node) != -1)) + if (!(sil != null && sil.FirstOrDefault().sym_info is common_type_node && ((sil.FirstOrDefault().sym_info as common_type_node).IsPartial || context.types_predefined.IndexOf(sil.FirstOrDefault().sym_info as common_type_node) != -1))) { context.check_name_free(_type_declaration.type_name.name, get_location(_type_declaration.type_name)); }