diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt index 0298beb12b7..20315f9280e 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBuilder.kt @@ -221,7 +221,11 @@ class StubsBuildingContextImpl( get() = stubIrContext.getKotlinName(this) override fun tryCreateIntegralStub(type: Type, value: Long): IntegralConstantStub? { - val integerType = type.unwrapTypedefs() as? IntegerType ?: return null + val integerType = when (val unwrappedType = type.unwrapTypedefs()) { + is IntegerType -> unwrappedType + CharType -> IntegerType(1, true, "char") + else -> return null + } val size = integerType.size if (size != 1 && size != 2 && size != 4 && size != 8) return null return IntegralConstantStub(value, size, declarationMapper.isMappedToSigned(integerType)) @@ -386,4 +390,4 @@ class StubIrBuilder(private val context: StubIrContext) { private fun generateStubsForObjCCategory(objCCategory: ObjCCategory) { addStubs(ObjCCategoryStubBuilder(buildingContext, objCCategory).build()) } -} \ No newline at end of file +} diff --git a/backend.native/tests/interop/basics/ctypes.def b/backend.native/tests/interop/basics/ctypes.def index a02b35e53a6..a153a95ebd9 100644 --- a/backend.native/tests/interop/basics/ctypes.def +++ b/backend.native/tests/interop/basics/ctypes.def @@ -71,6 +71,23 @@ enum NonStrictEnum2 { NonStrictEnum2B __attribute__((unused)) = 1 }; +// KT-34025 +typedef char Char; +enum EnumCharBase : Char { + EnumCharBaseA, + EnumCharBaseB +}; + +static int sendEnum(enum EnumCharBase x) { + return (int)x + 2; +} + +enum EnumExplicitChar : char { + EnumExplicitCharA = 'a', + EnumExplicitCharB = 'b', + EnumExplicitCharDup = 'a' +}; + typedef float __attribute__ ((__vector_size__ (16))) KVector4f; typedef int __attribute__ ((__vector_size__ (16))) KVector4i32; diff --git a/backend.native/tests/interop/basics/types.kt b/backend.native/tests/interop/basics/types.kt index 07a557290a2..2e05122541b 100644 --- a/backend.native/tests/interop/basics/types.kt +++ b/backend.native/tests/interop/basics/types.kt @@ -21,6 +21,11 @@ fun main() { assertEquals(1u, StrictEnum2.StrictEnum2B.value) assertEquals(0u, NonStrictEnum1A) assertEquals(1u, NonStrictEnum2B) + assertEquals(1, EnumCharBase.EnumCharBaseB.value) + assertEquals(3, sendEnum(EnumCharBase.EnumCharBaseB)) + assertEquals('a'.toByte(), EnumExplicitCharA) + assertEquals('b'.toByte(), EnumExplicitCharB) + assertEquals(EnumExplicitCharA, EnumExplicitCharDup) assertEquals(49, sendV4I(vectorOf(1, 2, 3, 4))) assertEquals(49, (sendV4F(vectorOf(1f, 2f, 3f, 4f)) + 0.00001).toInt())