From 9f4de084cc56e9e35a0efdb6c7339d30d3bffe4d Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 7 Nov 2021 10:14:35 +0100 Subject: [PATCH] bug fix #2555 --- TestSuite/sizeof1.pas | 8 +++++++- TreeConverter/TreeConversion/syntax_tree_visitor.cs | 4 +++- TreeConverter/TreeRealization/generics.cs | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/TestSuite/sizeof1.pas b/TestSuite/sizeof1.pas index 05e6db5e7..8683e1b67 100644 --- a/TestSuite/sizeof1.pas +++ b/TestSuite/sizeof1.pas @@ -1,13 +1,19 @@ -type TRec = record +type TRec = record a: integer; b: real; c: char; end; +type + t1 = class + o: t1; + end; + begin assert(sizeof(integer)=4); assert(sizeof(real)=8); assert(sizeof(char)=2); assert(sizeof(pointer)=System.Runtime.InteropServices.Marshal.SizeOf(typeof(pointer))); assert(sizeof(TRec)=System.Runtime.InteropServices.Marshal.SizeOf(typeof(TRec))); + assert(sizeof(t1) > 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 c11756043..753ebaab5 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -3731,6 +3731,8 @@ namespace PascalABCCompiler.TreeConverter switch (_class_definition.keyword) { case PascalABCCompiler.SyntaxTree.class_keyword.Class: + //if (context.converted_type.IsPartial) + // generic_convertions.remove_type_instances(context.converted_type); if (context.converted_type.is_value || context.converted_type.IsInterface) { AddError(get_location(_class_definition), "FORWARD_DECLARATION_OF_{0}_MISMATCH_DECLARATION", context.converted_type.name); @@ -19445,7 +19447,7 @@ namespace PascalABCCompiler.TreeConverter if (tn.is_generic_parameter || tn.is_generic_type_definition || tn.is_generic_type_instance) return false; foreach (class_field cf in ctn.fields) - if (!cf.IsStatic) + if (!cf.IsStatic && cf.type != tn) if (!can_evaluate_size(cf.type)) return false; } diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index e29a97fed..9c9702b46 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -243,6 +243,12 @@ namespace PascalABCCompiler.TreeRealization return instances; } + public static void remove_type_instances(type_node original_generic_type) + { + if (generic_instances[original_generic_type] != null) + generic_instances.Remove(original_generic_type); + } + public static List get_function_instances(function_node original_generic_function) { List instances = generic_instances[original_generic_function] as List;