From 86315dde9baa4233b34d522eece04df0d97de0c3 Mon Sep 17 00:00:00 2001 From: Zelentsov Dmitry Date: Wed, 30 Apr 2025 18:35:58 +0300 Subject: [PATCH] Fix union type cast to primitive Signed-off-by: Zelentsov Dmitry --- .../compiler/lowering/ets/unboxLowering.cpp | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/ets2panda/compiler/lowering/ets/unboxLowering.cpp b/ets2panda/compiler/lowering/ets/unboxLowering.cpp index 9826b156f3..a2b945c3c4 100644 --- a/ets2panda/compiler/lowering/ets/unboxLowering.cpp +++ b/ets2panda/compiler/lowering/ets/unboxLowering.cpp @@ -485,12 +485,31 @@ static ir::Expression *InsertPrimitiveConversionIfNeeded(UnboxContext *uctx, ir: toConvert = tp; } }; - checkSubtyping(checker->GlobalByteBuiltinType()); - checkSubtyping(checker->GlobalShortBuiltinType()); - checkSubtyping(checker->GlobalIntBuiltinType()); - checkSubtyping(checker->GlobalLongBuiltinType()); - checkSubtyping(checker->GlobalFloatBuiltinType()); - checkSubtyping(checker->GlobalDoubleBuiltinType()); + + switch (checker->ETSType(MaybeRecursivelyUnboxType(uctx, actualType))) { + case checker::TypeFlag::BYTE: + checkSubtyping(checker->GlobalByteBuiltinType()); + [[fallthrough]]; + case checker::TypeFlag::SHORT: + checkSubtyping(checker->GlobalShortBuiltinType()); + [[fallthrough]]; + case checker::TypeFlag::CHAR: + case checker::TypeFlag::INT: + checkSubtyping(checker->GlobalIntBuiltinType()); + [[fallthrough]]; + case checker::TypeFlag::LONG: + checkSubtyping(checker->GlobalLongBuiltinType()); + [[fallthrough]]; + case checker::TypeFlag::FLOAT: + checkSubtyping(checker->GlobalFloatBuiltinType()); + [[fallthrough]]; + case checker::TypeFlag::DOUBLE: + checkSubtyping(checker->GlobalDoubleBuiltinType()); + [[fallthrough]]; + default: + break; + } + if (toConvert == nullptr && actualType->IsCharType() && relation->IsSupertypeOf(expectedType, checker->GlobalBuiltinETSStringType())) { toConvert = uctx->checker->GlobalBuiltinETSStringType(); -- Gitee