From 7ab585ab5d1552e2b41b5be72b653948ae861c10 Mon Sep 17 00:00:00 2001 From: Zelentsov Dmitry Date: Fri, 23 May 2025 10:01:15 +0300 Subject: [PATCH] Fix tuple element type inferring Signed-off-by: Zelentsov Dmitry --- ets2panda/checker/ETSAnalyzer.cpp | 28 ++++++++++--------- .../ast/parser/ets/recordKeyTypeCheck02.ets | 4 +-- .../ast/parser/ets/recordKeyTypeCheck03.ets | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index 858c20fee..70188c61d 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -709,7 +709,12 @@ static ArenaVector> GetElementTypes(ETSCheck { ArenaVector> elementTypes(checker->ProgramAllocator()->Adapter()); - for (std::size_t idx = 0; idx < expr->Elements().size(); ++idx) { + auto *const exprPreferredType = expr->PreferredType(); + auto *const exprTupleType = exprPreferredType->IsETSTupleType() ? exprPreferredType->AsETSTupleType() : nullptr; + checker::Type *elemPreferredType = + exprPreferredType->IsETSTupleType() ? nullptr : checker->GetElementTypeOfArray(exprPreferredType); + + for (std::size_t idx = 0U; idx < expr->Elements().size(); ++idx) { ir::Expression *const element = expr->Elements()[idx]; if (element->IsSpreadElement()) { @@ -717,20 +722,17 @@ static ArenaVector> GetElementTypes(ETSCheck continue; } - auto *const exprPreferredType = expr->PreferredType(); - - if (expr->PreferredType()->IsETSTupleType() && idx < expr->PreferredType()->AsETSTupleType()->GetTupleSize() && - !ValidArrayExprSizeForTupleSize(checker, exprPreferredType->AsETSTupleType()->GetTypeAtIndex(idx), - element)) { - elementTypes.emplace_back(checker->GlobalTypeError(), element); - continue; + if (exprPreferredType->IsETSTupleType()) { + if (idx >= exprTupleType->GetTupleSize() || + !ValidArrayExprSizeForTupleSize(checker, exprTupleType->GetTypeAtIndex(idx), element)) { + elementTypes.emplace_back(element->SetTsType(checker->GlobalTypeError()), element); + continue; + } else { + elemPreferredType = exprTupleType->GetTypeAtIndex(idx); + } } - auto *const targetPreferredType = exprPreferredType->IsETSTupleType() - ? exprPreferredType->AsETSTupleType()->GetTypeAtIndex(idx) - : checker->GetElementTypeOfArray(exprPreferredType); - element->SetPreferredType(targetPreferredType); - + element->SetPreferredType(elemPreferredType); elementTypes.emplace_back(element->Check(checker), element); } diff --git a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets index a8af2cbfa..d65646705 100644 --- a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets +++ b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck02.ets @@ -19,6 +19,6 @@ function main(){ let a: Record/* @@ label */ = { 1: 1, 2: 2 - } + } } -/* @@@ label Error TypeError: Type argument 'A|Double' should be a subtype of 'Numeric|String|BaseEnum'-constraint */ +/* @@@ label Error TypeError: Type argument 'A|Double' should be a subtype of 'Numeric|String|BaseEnum|BaseEnum|BaseEnum'-constraint */ diff --git a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets index a1fcd36cf..5d863c0d0 100644 --- a/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets +++ b/ets2panda/test/ast/parser/ets/recordKeyTypeCheck03.ets @@ -18,4 +18,4 @@ class A{} function main(){ let a: Record/* @@ label */ } -/* @@@ label Error TypeError: Type argument 'BigInt' should be a subtype of 'Numeric|String|BaseEnum'-constraint */ +/* @@@ label Error TypeError: Type argument 'BigInt' should be a subtype of 'Numeric|String|BaseEnum|BaseEnum|BaseEnum'-constraint */ -- Gitee