From 990afcc06fae48dc36503ab50804f8f7095d591d Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 20 Sep 2021 18:40:17 +0300 Subject: [PATCH] Native: improve exception messages when building DFG vtable/itable --- .../backend/konan/optimizations/DataFlowIR.kt | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index f239118b74d..906d88a124e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -513,11 +513,34 @@ internal object DataFlowIR { if (!isAbstract) { val layoutBuilder = context.getLayoutBuilder(irClass) type.vtable += layoutBuilder.vtableEntries.map { - mapFunction(it.getImplementation(context)!!) + val implementation = it.getImplementation(context) + ?: error( + irClass.getContainingFile(), + irClass, + """ + no implementation found for ${it.overriddenFunction.render()} + when building vtable for ${irClass.render()} + """.trimIndent() + ) + + mapFunction(implementation) } val interfaces = irClass.implementedInterfaces.map { context.getLayoutBuilder(it) } for (iface in interfaces) { - type.itable[iface.classId] = iface.interfaceVTableEntries.map { mapFunction(layoutBuilder.overridingOf(it)!!) } + type.itable[iface.classId] = iface.interfaceVTableEntries.map { + val implementation = layoutBuilder.overridingOf(it) + ?: error( + irClass.getContainingFile(), + irClass, + """ + no implementation found for ${it.render()} + when building itable for ${iface.irClass.render()} + implementation in ${irClass.render()} + """.trimIndent() + ) + + mapFunction(implementation) + } } } else if (irClass.isInterface) { // Warmup interface table so it is computed before DCE.