From 55aa0f6c9a9052ed604a8b902c788d30b9582713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B5=D0=BC=D0=BB=D1=8F=D0=BA?= <92867056+AlexanderZemlyak@users.noreply.github.com> Date: Thu, 9 Apr 2026 09:46:58 +0300 Subject: [PATCH] Add shallow copying of default_value fields in generic function instance creation (#3410) --- TreeConverter/TreeRealization/base_nodes.cs | 8 ++++++++ TreeConverter/TreeRealization/generics.cs | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/TreeConverter/TreeRealization/base_nodes.cs b/TreeConverter/TreeRealization/base_nodes.cs index c62fb1ced..b2875706a 100644 --- a/TreeConverter/TreeRealization/base_nodes.cs +++ b/TreeConverter/TreeRealization/base_nodes.cs @@ -334,6 +334,14 @@ namespace PascalABCCompiler.TreeRealization return this.conversion_type; } } + + /// + /// Возвращает поверхностную копию объекта + /// + public expression_node ShallowCopy() + { + return (expression_node)this.MemberwiseClone(); + } } [Serializable] diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 17d6193e4..3bfef5fbd 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -2665,15 +2665,15 @@ namespace PascalABCCompiler.TreeRealization generic_convertions.determine_type(par.type, _instance_params, true, orig_gen_params), par.parameter_type, this, (par.parameter_type == SemanticTree.parameter_type.var) ? concrete_parameter_type.cpt_var : concrete_parameter_type.cpt_none, - par.default_value, null); + par.default_value?.ShallowCopy(), null); cpar.inital_value = par.inital_value; - cpar.default_value = par.default_value; if (cpar.default_value is default_operator_node) (cpar.default_value as default_operator_node).type = generic_convertions.determine_type(cpar.default_value.type, _instance_params, true, orig_gen_params); - else if (cpar.default_value is default_operator_node_as_constant) + else if (cpar.default_value is default_operator_node_as_constant def_oper_as_constant) { - (cpar.default_value as default_operator_node_as_constant).type = generic_convertions.determine_type(cpar.default_value.type, _instance_params, true, orig_gen_params); - (cpar.default_value as default_operator_node_as_constant).default_operator.type = (cpar.default_value as default_operator_node_as_constant).type; + def_oper_as_constant.type = generic_convertions.determine_type(cpar.default_value.type, _instance_params, true, orig_gen_params); + def_oper_as_constant.default_operator = (default_operator_node)def_oper_as_constant.default_operator.ShallowCopy(); // ShallowCopy здесь и выше, чтобы не портить исходный тип шаблона EVA 26.03.2026 + def_oper_as_constant.default_operator.type = def_oper_as_constant.type; } cpar.intrenal_is_params = par.is_params;