From b099f21c7609dec9e3b4b50c9946e6f7f55f593f Mon Sep 17 00:00:00 2001 From: Muhammet Fevzi Bayiroglu Date: Sun, 22 Jun 2025 15:04:40 +0300 Subject: [PATCH] Fail gracefully when checking records Reason: Initializing record with spread element causes crash Description: Throw CTE for wrong types Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICGXIG?from=project-issue Testing: Added a new test for Record initializations with spreads Signed-off-by: Muhammet Fevzi Bayiroglu --- ets2panda/checker/ETSAnalyzer.cpp | 6 ++++++ ets2panda/checker/ets/helpers.cpp | 5 ++++- ets2panda/util/diagnostic/semantic.yaml | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index ca365e2a61..d8df2c6a49 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -21,6 +21,7 @@ #include "checker/types/ets/etsTupleType.h" #include "checker/types/gradualType.h" #include "evaluate/scopedDebugInfoPlugin.h" +#include "macros.h" #include "types/signature.h" #include "compiler/lowering/ets/setJumpTarget.h" #include "checker/types/ets/etsAsyncFuncReturnType.h" @@ -1910,6 +1911,11 @@ static void SetTypeforRecordProperties(const ir::ObjectExpression *expr, checker auto *const valueType = typeArguments[1]; // Record type arguments for (auto *const recordProperty : recordProperties) { + if (!recordProperty->IsProperty()) { + checker->LogError(diagnostic::WRONG_TYPE_FOR_RECORD, {ToString(recordProperty->Type())}, + recordProperty->Start()); + continue; + } auto *const recordPropertyExpr = recordProperty->AsProperty()->Value(); recordPropertyExpr->SetPreferredType(valueType); recordPropertyExpr->Check(checker); diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index 26ed9ad28c..037f315b0b 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -784,7 +784,10 @@ static void CheckRecordType(ir::Expression *init, checker::Type *annotationType, auto properties = objectExpr->Properties(); for (const auto &property : properties) { - ES2PANDA_ASSERT(property->IsProperty()); + if (!property->IsProperty()) { + checker->LogError(diagnostic::WRONG_TYPE_FOR_RECORD, {ToString(property->Type())}, property->Start()); + continue; + } auto p = property->AsProperty(); p->Key()->SetPreferredType(typeArguments[0]); diff --git a/ets2panda/util/diagnostic/semantic.yaml b/ets2panda/util/diagnostic/semantic.yaml index 4c4ae2e28e..9c7b6cd3ba 100644 --- a/ets2panda/util/diagnostic/semantic.yaml +++ b/ets2panda/util/diagnostic/semantic.yaml @@ -1514,3 +1514,7 @@ semantic: - name: DYMANIC_INIT_WITH_OBJEXPR id: 382 message: "Dymanic Type {} cannot be initialize with an object expression" + +- name: WRONG_TYPE_FOR_RECORD + id: 383 + message: "Record can't be initaized with {}" -- Gitee