From 16274ab9585714150a969723dd861acdfab1984e Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 10 Jan 2021 18:21:39 +0100 Subject: [PATCH] fix #2105 fix #1645 --- TestSuite/errors/err0401.pas | 4 ++++ TestSuite/generics45.pas | 9 +++++++++ TestSuite/generics46.pas | 6 ++++++ .../TreeConversion/convertion_data_and_alghoritms.cs | 2 +- TreeConverter/TreeConversion/syntax_tree_visitor.cs | 7 +++++++ 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 TestSuite/errors/err0401.pas create mode 100644 TestSuite/generics45.pas create mode 100644 TestSuite/generics46.pas diff --git a/TestSuite/errors/err0401.pas b/TestSuite/errors/err0401.pas new file mode 100644 index 000000000..ad278877e --- /dev/null +++ b/TestSuite/errors/err0401.pas @@ -0,0 +1,4 @@ +begin + var s: sequence of byte; + var e: IEnumerator := s.OrderBy(b->b).GetEnumerator; +end. \ No newline at end of file diff --git a/TestSuite/generics45.pas b/TestSuite/generics45.pas new file mode 100644 index 000000000..3edbf570d --- /dev/null +++ b/TestSuite/generics45.pas @@ -0,0 +1,9 @@ +begin + var s: sequence of integer := Arr(3,2,1).AsEnumerable(); + var e: IEnumerator := s.OrderBy(b->b).GetEnumerator; + e.MoveNext(); + assert(e.Current = 1); + var e2: IEnumerator := s.OrderBy(b->b).GetEnumerator(); + e2.MoveNext(); + assert(e2.Current = 1); +end. \ No newline at end of file diff --git a/TestSuite/generics46.pas b/TestSuite/generics46.pas new file mode 100644 index 000000000..febb364ad --- /dev/null +++ b/TestSuite/generics46.pas @@ -0,0 +1,6 @@ +begin + var o: ICollection := Arr(1,2,3); + var enm: IEnumerator := o.GetEnumerator; + enm.MoveNext(); + assert(enm.Current = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index aeb6159d0..5fd71ec2f 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -663,7 +663,7 @@ namespace PascalABCCompiler.TreeConverter en.location = loc; if (en.type is delegated_methods dm && dm.proper_methods[0].parameters.Count == 0 && dm.proper_methods[0].ret_type != null) { - if (to != SystemLibrary.SystemLibrary.object_type) + if (to != SystemLibrary.SystemLibrary.object_type && to.IsDelegate) AddError(new CanNotConvertTypes(en, dm.proper_methods[0].ret_type, to, loc)); // SSM 18/06/20 #2261 else return en; diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 3fc6f1755..997cac9d1 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -16570,6 +16570,13 @@ namespace PascalABCCompiler.TreeConverter _var_def_statement.inital_value = get_possible_array_const(_var_def_statement.inital_value,tn); var ivc = convert_strong(_var_def_statement.inital_value); inital_value = convert_strong_to_constant_or_function_call_for_varinit(ivc, tn); + if (!tn.IsDelegate && tn != SystemLibrary.SystemLibrary.object_type && inital_value is typed_expression && _var_def_statement.inital_value is addressed_value) + { + method_call mc = new method_call(); + mc.dereferencing_value = _var_def_statement.inital_value as addressed_value; + ivc = convert_strong(mc); + inital_value = convert_strong_to_constant_or_function_call_for_varinit(ivc, tn); + } } } else