From c4d647f4101316ed49792d35f9e60aeebeacec40 Mon Sep 17 00:00:00 2001 From: fcc Date: Mon, 14 Jul 2025 16:35:36 +0800 Subject: [PATCH] Fix crash when checking union field access When downcasting a node, checking its type before cast. Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/ICM69K Signed-off-by: fcc --- ets2panda/checker/ets/typeCheckingHelpers.cpp | 4 +++- .../test/ast/compiler/ets/union_field_access.ets | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ets2panda/checker/ets/typeCheckingHelpers.cpp b/ets2panda/checker/ets/typeCheckingHelpers.cpp index 01d4584093..c3cb5f3263 100644 --- a/ets2panda/checker/ets/typeCheckingHelpers.cpp +++ b/ets2panda/checker/ets/typeCheckingHelpers.cpp @@ -685,7 +685,9 @@ Type *ETSChecker::GuaranteedTypeForUnionFieldAccess(ir::MemberExpression *member const auto &types = etsUnionType->ConstituentTypes(); ArenaVector apparentTypes {ProgramAllocator()->Adapter()}; const auto *prop = memberExpression->Property(); - const auto &propertyName = prop->IsIdentifier() ? prop->AsIdentifier()->Name() : prop->AsStringLiteral()->Str(); + const auto &propertyName = prop->IsIdentifier() ? prop->AsIdentifier()->Name() + : prop->IsStringLiteral() ? prop->AsStringLiteral()->Str() + : ""; for (auto *type : types) { auto searchFlags = PropertySearchFlags::SEARCH_FIELD | PropertySearchFlags::SEARCH_METHOD | PropertySearchFlags::SEARCH_IN_BASE; diff --git a/ets2panda/test/ast/compiler/ets/union_field_access.ets b/ets2panda/test/ast/compiler/ets/union_field_access.ets index 33cb90075f..942376e3ac 100644 --- a/ets2panda/test/ast/compiler/ets/union_field_access.ets +++ b/ets2panda/test/ast/compiler/ets/union_field_access.ets @@ -25,7 +25,19 @@ interface TypeB { } function IfWithString(val: U) { - return /* @@ label */val['kind'] === 'B' + return val['kind'] === 'B' } -/* @@@ label Error TypeError: Indexed access is not supported for such expression type. */ +(a ? delete arguments==({: false, Float64Array: []}) : [ArrayBuffer[false]]) + +/* @@? 28:12 Error TypeError: Indexed access is not supported for such expression type. */ +/* @@? 31:1 Error TypeError: Indexed access is not supported for such expression type. */ +/* @@? 31:2 Error TypeError: Unresolved reference a */ +/* @@? 31:6 Error TypeError: Unresolved reference delete */ +/* @@? 31:13 Error SyntaxError: Unexpected token. */ +/* @@? 31:13 Error TypeError: Unresolved reference arguments */ +/* @@? 31:24 Error TypeError: need to specify target type for class composite */ +/* @@? 31:26 Error SyntaxError: Unexpected token. */ +/* @@? 31:28 Error SyntaxError: Unexpected token. */ +/* @@? 31:54 Error SyntaxError: Unexpected token, expected ')'. */ +/* @@? 31:76 Error SyntaxError: Unexpected token ')'. */ -- Gitee