diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 6ab550beaa7..a5a738953a6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -174,7 +174,8 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va var receiver = when (receiverExpr) { is KtCallExpression, - is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable + is KtBinaryExpression, + is KtDotQualifiedExpression-> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable is KtNameReferenceExpression -> { val referenceContext = state.bindingContext.get(BindingContext.REFERENCE_TARGET, receiverExpr) variableManager[receiverName] @@ -731,7 +732,11 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va codeBuilder.addUnconditionalJump(if (isElse) successConditionsLabel else elseLabel) codeBuilder.markWithLabel(successConditionsLabel) - val successExpression = evaluateExpression(item.expression, scopeDepth + 1) + var successExpression = evaluateExpression(item.expression, scopeDepth + 1) + while (successExpression is LLVMVariable && successExpression.pointer > 0) { + successExpression = codeBuilder.loadAndGetVariable(successExpression) + } + codeBuilder.storeVariable(resultVariable, successExpression ?: return) codeBuilder.addUnconditionalJump(endLabel) codeBuilder.addComment("end last condition item") diff --git a/translator/src/test/kotlin/tests/input/enum_inner_fields.txt b/translator/src/test/kotlin/tests/input/enum_inner_fields.txt new file mode 100644 index 00000000000..b569ec5c82d --- /dev/null +++ b/translator/src/test/kotlin/tests/input/enum_inner_fields.txt @@ -0,0 +1,2 @@ +enum_field_test1_Byte(1) == 1 +enum_field_test1_Byte(2) == 2 diff --git a/translator/src/test/kotlin/tests/kotlin/enum_inner_fields.kt b/translator/src/test/kotlin/tests/kotlin/enum_inner_fields.kt new file mode 100644 index 00000000000..78f43fdf07a --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/enum_inner_fields.kt @@ -0,0 +1,28 @@ + +enum class WireType(val id: Int) { + VARINT(0), // int32, int64, uint32, uint64, sint32, sint64, bool, enum + FIX_64(1), // fixed64, sfixed64, double + LENGTH_DELIMITED(2), // string, bytes, embedded messages, packed repeated fields + START_GROUP(3), // groups (deprecated) + END_GROUP(4), // groups (deprecated) + FIX_32(5), // fixed32, sfixed32, float + UNDEFINED(6); // indicates error when parsing from Int + + companion object { + fun from (value: Byte): WireType { + return when (value) { + 0.toByte() -> VARINT + 1.toByte() -> FIX_64 + 2.toByte() -> LENGTH_DELIMITED + 3.toByte() -> START_GROUP + 4.toByte() -> END_GROUP + 5.toByte() -> FIX_32 + else -> UNDEFINED + } + } + } +} + +fun enum_field_test1(i: Byte): Int { + return WireType.from(i).id +}