diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index f084c61fc6b92fcfdba32c2d4ea7ca0d415841c2..534263417da1220f3c982677ed61c22d6c4e2f7b 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -1011,9 +1011,15 @@ checker::Type *ETSChecker::GetExtensionAccessorReturnType(ir::MemberExpression * // Smart cast support //==============================================================================// -static checker::Type *MaybeReadonlyType(ETSChecker *checker, checker::Type *sourceType, checker::Type const *targetType) +static checker::Type *MaybeReadonlyType(ETSChecker *checker, checker::Type *sourceType, checker::Type *targetType) { - if (targetType->HasTypeFlag(TypeFlag::READONLY)) { + // For left-hand variable of builtin type leave it as is. + if (targetType->IsBuiltinNumeric()) { + return targetType; + } + + // Preserve 'Readonly' type flag in smart type if it exists in declared type + if (targetType->HasTypeFlag(TypeFlag::READONLY) && !sourceType->HasTypeFlag(TypeFlag::READONLY)) { sourceType = sourceType->Clone(checker); sourceType->AddTypeFlag(TypeFlag::READONLY); } @@ -1036,11 +1042,6 @@ checker::Type *ETSChecker::ResolveSmartType(checker::Type *sourceType, checker:: return sourceType; } - // For left-hand variable of builtin type leave it as is. - if (targetType->IsETSObjectType() && targetType->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::BUILTIN_TYPE)) { - return targetType; - } - // In case of Union left-hand type we try to select the proper type from the Union if (targetType->IsETSUnionType() && !sourceType->IsUnionType()) { auto *constituentType = targetType->AsETSUnionType()->GetAssignableType(this, sourceType, value); diff --git a/ets2panda/checker/types/ets/etsUnionType.cpp b/ets2panda/checker/types/ets/etsUnionType.cpp index 7e1743576091523ad929e9da1a0494758e5bc800..cb112121c82df4692d0fcbafdbee36da4bc05c13 100644 --- a/ets2panda/checker/types/ets/etsUnionType.cpp +++ b/ets2panda/checker/types/ets/etsUnionType.cpp @@ -307,19 +307,15 @@ checker::Type *ETSUnionType::GetAssignableType(checker::ETSChecker *checker, che } } - if (!sourceType->IsETSObjectType()) { + if (!sourceType->IsBuiltinNumeric()) { return nullptr; } - auto *objectType = checker->GetNonConstantType(sourceType)->AsETSObjectType(); - - if (!objectType->IsBuiltinNumeric()) { - return sourceType; - } // NOTE (DZ): we still keep 'numericTypes` collection for possible processing cases like 'let x: short|double = 1` // Waiting for complete clearness in spec - now return the highest type in such a case or type itself. // Maybe 'value' will be used for this purpose std::map numericTypes {}; + auto *objectType = sourceType->AsETSObjectType(); if (auto *assignableType = GetAssignableBuiltinType(checker, objectType, numericTypes); assignableType != nullptr) { return assignableType; } diff --git a/ets2panda/test/ast/parser/ets/differentTypeCompare.ets b/ets2panda/test/ast/parser/ets/differentTypeCompare.ets index bc6decc66b7e172aae0973d508da4e90b5cf8900..a753a52689177eb37fdcdd4c679734e8b7c4e50f 100644 --- a/ets2panda/test/ast/parser/ets/differentTypeCompare.ets +++ b/ets2panda/test/ast/parser/ets/differentTypeCompare.ets @@ -23,4 +23,4 @@ function main(): void { foo(/* @@ label */a == b); } -/* @@@ label Error TypeError: Operator '==' cannot be applied to types 'String' and 'Int'. */ +/* @@@ label Error TypeError: Operator '==' cannot be applied to types '"alma"' and 'Int'. */