From e948a54bf44a5c26001517ea8c0836010774ef87 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 31 Mar 2024 11:47:31 +0200 Subject: [PATCH] #3062 --- TestSuite/tuple_var2.pas | 12 ++++++++++ .../semantic_checks_for_sugar.cs | 10 ++++++++- .../TreeConversion/syntax_tree_visitor.cs | 22 +++++++++++++++---- 3 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 TestSuite/tuple_var2.pas diff --git a/TestSuite/tuple_var2.pas b/TestSuite/tuple_var2.pas new file mode 100644 index 000000000..e7c8167ea --- /dev/null +++ b/TestSuite/tuple_var2.pas @@ -0,0 +1,12 @@ +type c1 = class end; + +begin + + // OK + var (a,b) := |new object, new object|; + //Ошибка: Ожидался кортеж или последовательность + var (c,d) := |new c1, new c1|; + assert(c <> nil); + assert(d <> nil); + assert(c <> d); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/semantic_checks_for_sugar.cs b/TreeConverter/TreeConversion/semantic_checks_for_sugar.cs index 962b8fba1..1d0d14f9f 100644 --- a/TreeConverter/TreeConversion/semantic_checks_for_sugar.cs +++ b/TreeConverter/TreeConversion/semantic_checks_for_sugar.cs @@ -44,7 +44,15 @@ namespace PascalABCCompiler.TreeConverter var t = ConvertSemanticTypeNodeToNETType(expr.type); if (t == null) - AddError(expr.location, "TUPLE_OR_SEQUENCE_EXPECTED"); + { + bool bb; + type_node elem_type = null; + var b = FindIEnumerableElementType(expr.type, ref elem_type, out bb); + if (!b) + AddError(expr.location, "TUPLE_OR_SEQUENCE_EXPECTED"); + return; + } + var IsTuple = IsTupleType(t); var IsSequence = !IsTuple && IsSequenceType(t); diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 564d975d5..9d64c853e 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -21778,14 +21778,28 @@ namespace PascalABCCompiler.TreeConverter public override void visit(semantic_ith_element_of ith) { + var IsSequence = false; + var IsTuple = false; var sem_ex = convert_strong(ith.id); sem_ex = convert_if_typed_expression_to_function_call(sem_ex); var t = ConvertSemanticTypeNodeToNETType(sem_ex.type); if (t == null) - AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED"); - - var IsTuple = IsTupleType(t); - var IsSequence = !IsTuple && IsSequenceType(t); + { + bool bb; + type_node elem_type = null; + var b = FindIEnumerableElementType(sem_ex.type, ref elem_type, out bb); + if (b) + IsSequence = true; + else + AddError(sem_ex.location, "TUPLE_OR_SEQUENCE_EXPECTED"); + + } + + if (t != null) + IsTuple = IsTupleType(t); + + if (t != null) + IsSequence = !IsTuple && IsSequenceType(t); if (!IsTuple && !IsSequence) {