From 8d4bedfef64d86d010a6eb84f70ef11a0deef6a5 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 10 Jan 2018 11:40:42 +0300 Subject: [PATCH] Enable missing checkers for frontend: * Forbid super-calls with default arguments as in JVM; * Forbid passing incorrect types for reified parameters. Also suppress revealed errors with passing non-reified type to array constructor --- .../kotlin/backend/konan/KonanPlatformConfigurator.kt | 6 +++++- runtime/src/main/kotlin/konan/internal/RuntimeUtils.kt | 2 +- runtime/src/main/kotlin/kotlin/Array.kt | 1 + runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt | 3 ++- .../main/kotlin/kotlin/collections/MutableCollections.kt | 3 ++- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt index 62e19b56b61..ee3bebe79ff 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPlatformConfigurator.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker import org.jetbrains.kotlin.resolve.lazy.DelegationFilter @@ -32,7 +33,10 @@ import org.jetbrains.kotlin.types.DynamicTypesSettings object KonanPlatformConfigurator : PlatformConfigurator( DynamicTypesSettings(), additionalDeclarationCheckers = listOf(ExpectedActualDeclarationChecker), - additionalCallCheckers = listOf(), + additionalCallCheckers = listOf( + org.jetbrains.kotlin.resolve.jvm.checkers.SuperCallWithDefaultArgumentsChecker(), + ReifiedTypeParameterSubstitutionChecker() + ), additionalTypeCheckers = listOf(), additionalClassifierUsageCheckers = listOf(), additionalAnnotationCheckers = listOf(), diff --git a/runtime/src/main/kotlin/konan/internal/RuntimeUtils.kt b/runtime/src/main/kotlin/konan/internal/RuntimeUtils.kt index 4e9211d2c88..43685092dc7 100644 --- a/runtime/src/main/kotlin/konan/internal/RuntimeUtils.kt +++ b/runtime/src/main/kotlin/konan/internal/RuntimeUtils.kt @@ -102,7 +102,7 @@ fun > valueOfForEnum(name: String, values: Array) : T fun > valuesForEnum(values: Array): Array { - val result = Array(values.size) + val result = @Suppress("TYPE_PARAMETER_AS_REIFIED") Array(values.size) for (value in values) result[value.ordinal] = value @Suppress("UNCHECKED_CAST") diff --git a/runtime/src/main/kotlin/kotlin/Array.kt b/runtime/src/main/kotlin/kotlin/Array.kt index 63a14ded8c8..a06e3e85b8d 100644 --- a/runtime/src/main/kotlin/kotlin/Array.kt +++ b/runtime/src/main/kotlin/kotlin/Array.kt @@ -23,6 +23,7 @@ import konan.internal.InlineConstructor public final class Array { // Constructors are handled with compiler magic. @InlineConstructor + @Suppress("TYPE_PARAMETER_AS_REIFIED") public constructor(size: Int, init: (Int) -> T): this(size) { var index = 0 while (index < size) { diff --git a/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt b/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt index 2645bf02ed4..98ee13b0662 100644 --- a/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt +++ b/runtime/src/main/kotlin/kotlin/collections/ArrayUtil.kt @@ -24,6 +24,7 @@ package kotlin.collections @kotlin.internal.InlineExposed internal fun arrayOfUninitializedElements(size: Int): Array { // TODO: special case for size == 0? + @Suppress("TYPE_PARAMETER_AS_REIFIED") return Array(size) } @@ -51,7 +52,7 @@ fun Array.copyOfNulls(fromIndex: Int, toIndex: Int): Array { if (newSize < 0) { throw IllegalArgumentException("$fromIndex > $toIndex") } - val result = arrayOfNulls(newSize) + val result = @Suppress("TYPE_PARAMETER_AS_REIFIED") arrayOfNulls(newSize) copyRangeTo(result, fromIndex, if (toIndex > size) size else toIndex, 0) return result } diff --git a/runtime/src/main/kotlin/kotlin/collections/MutableCollections.kt b/runtime/src/main/kotlin/kotlin/collections/MutableCollections.kt index 00dfef90ad7..f306264eb96 100644 --- a/runtime/src/main/kotlin/kotlin/collections/MutableCollections.kt +++ b/runtime/src/main/kotlin/kotlin/collections/MutableCollections.kt @@ -282,7 +282,8 @@ public fun > MutableList.sort(): Unit = sortWith(Comparator public fun MutableList.sortWith(comparator: Comparator): Unit { if (size > 1) { val it = listIterator() - for (v in toTypedArray().apply { sortWith(comparator) }) { + val sortedArray = @Suppress("TYPE_PARAMETER_AS_REIFIED") toTypedArray().apply { sortWith(comparator) } + for (v in sortedArray) { it.next() it.set(v) }