From af1ac9b1c5c1aeedfddbf41b5004f7e3cbfaa7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 26 Nov 2017 14:36:02 +0100 Subject: [PATCH] bug fix #577 --- NETGenerator/NETGenerator.cs | 4 ++-- TestSuite/records6.pas | 11 +++++++++++ TreeConverter/TreeConversion/syntax_tree_visitor.cs | 4 ++-- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 TestSuite/records6.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index fae160da8..5d7189c9b 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -1338,7 +1338,7 @@ namespace PascalABCCompiler.NETGenerator { ITypeNode ctn = fld.type; TypeInfo ti = helper.GetTypeReference(ctn); - if (ctn is ICommonTypeNode && ti.tp.IsValueType && ti.tp is TypeBuilder) + if (ctn is ICommonTypeNode && ti.tp.IsValueType && ti.tp is TypeBuilder && tb != ti.tp) { BuildCloseTypeOrder((ICommonTypeNode)ctn, (TypeBuilder)ti.tp); } @@ -1724,7 +1724,7 @@ namespace PascalABCCompiler.NETGenerator cfn.type.type_special_kind == type_special_kind.binary_file || cfn.type.type_special_kind == type_special_kind.set_type)) return true; - if (cfn.type.type_special_kind == type_special_kind.record && cfn.type is ICommonTypeNode) + if (cfn.polymorphic_state != polymorphic_state.ps_static && cfn.type.type_special_kind == type_special_kind.record && cfn.type is ICommonTypeNode) if (NeedAddCloneMethods(cfn.type as ICommonTypeNode)) return true; } diff --git a/TestSuite/records6.pas b/TestSuite/records6.pas new file mode 100644 index 000000000..17badf58b --- /dev/null +++ b/TestSuite/records6.pas @@ -0,0 +1,11 @@ +type + r1=record + a: integer; + class Empty:r1; + end; + +begin + var r: r1; + r.a := 2; + assert(r1.Empty.a = 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 8b40ea09b..aa1537117 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -15185,7 +15185,7 @@ namespace PascalABCCompiler.TreeConverter check_for_type_allowed(tn,get_location(_var_def_statement.vars_type)); if (_var_def_statement.vars_type is function_header || _var_def_statement.vars_type is procedure_header) check_delegate_on_generic_parameters(tn as common_type_node, get_location(_var_def_statement.vars_type)); - if (context.converting_block() == block_type.type_block && context.converted_type.is_value_type) + if (context.converting_block() == block_type.type_block && context.converted_type.is_value_type && _var_def_statement.var_attr != SyntaxTree.definition_attribute.Static) CheckForCircuralInRecord(tn, get_location(_var_def_statement.vars_type)); if (_var_def_statement.inital_value != null) if (is_event) AddError(new NotSupportedError(get_location(_var_def_statement.inital_value))); @@ -15206,7 +15206,7 @@ namespace PascalABCCompiler.TreeConverter tn = inital_value.type; if (tn is null_type_node) AddError(cn.location, "CAN_NOT_DEDUCE_TYPE_{0}", tn.name); - if (context.converting_block() == block_type.type_block && context.converted_type.is_value_type) + if (context.converting_block() == block_type.type_block && context.converted_type.is_value_type && _var_def_statement.var_attr != SyntaxTree.definition_attribute.Static) CheckForCircuralInRecord(tn, get_location(_var_def_statement)); } if (inital_value != null && inital_value is typed_expression)