diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 882a7e2b547..7d3d8de31a8 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -518,6 +518,12 @@ Also sets `-jvm-target` value equal to the selected JDK version""" ) var enableDebugMode: Boolean by FreezableVar(false) + @Argument( + value = "-Xignore-const-optimization-errors", + description = "Ignore all compilation exceptions while optimizing some constant expressions." + ) + var ignoreConstOptimizationErrors: Boolean by FreezableVar(false) + override fun configureAnalysisFlags(collector: MessageCollector, languageVersion: LanguageVersion): MutableMap, Any> { val result = super.configureAnalysisFlags(collector, languageVersion) result[JvmAnalysisFlags.strictMetadataVersionSemantics] = strictMetadataVersionSemantics diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index f308dd0c66b..a3ee97bb85a 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -311,6 +311,7 @@ fun CompilerConfiguration.configureAdvancedJvmOptions(arguments: K2JVMCompilerAr put(JVMConfigurationKeys.LINK_VIA_SIGNATURES, arguments.linkViaSignatures) put(JVMConfigurationKeys.ENABLE_DEBUG_MODE, arguments.enableDebugMode) + put(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS, arguments.ignoreConstOptimizationErrors) val assertionsMode = JVMAssertionsMode.fromStringOrNull(arguments.assertionsMode) diff --git a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index 9d3a38b516f..6c33d4c8dd8 100644 --- a/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/config.jvm/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -159,4 +159,7 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey ENABLE_DEBUG_MODE = CompilerConfigurationKey.create("Enable debug mode"); + + public static final CompilerConfigurationKey IGNORE_CONST_OPTIMIZATION_ERRORS = + CompilerConfigurationKey.create("Ignore errors from IrConstTransformer"); } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ConstEvaluationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ConstEvaluationLowering.kt index 8ea21b1521b..e5ab7ad9f89 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ConstEvaluationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ConstEvaluationLowering.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.expressions.IrErrorExpression @@ -40,7 +41,10 @@ class ConstEvaluationLowering(val context: JvmBackendContext) : FileLoweringPass .report(JvmBackendErrors.EXCEPTION_IN_CONST_EXPRESSION, warning.description) } - val transformer = IrConstTransformer(interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError) + val suppressErrors = context.configuration.getBoolean(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS) + val transformer = IrConstTransformer( + interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError, suppressErrors + ) irFile.transformChildren(transformer, null) } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt index e861e591320..b7719476e7f 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt @@ -7,12 +7,14 @@ package org.jetbrains.kotlin.ir.interpreter.checker import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.interpreter.IrInterpreter import org.jetbrains.kotlin.ir.interpreter.isPrimitiveArray @@ -26,7 +28,8 @@ class IrConstTransformer( private val irFile: IrFile, private val mode: EvaluationMode, private val onWarning: (IrElement, IrErrorExpression) -> Unit = { _, _ -> }, - private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> } + private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> }, + private val suppressExceptions: Boolean = false, ) : IrElementTransformerVoid() { private fun IrExpression.warningIfError(original: IrExpression): IrExpression { if (this is IrErrorExpression) { @@ -52,7 +55,8 @@ class IrConstTransformer( val result = try { interpreter.interpret(this, irFile) } catch (e: Throwable) { - throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e) + if (!suppressExceptions) throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e) + return IrErrorExpressionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, this.type, e.message.toString()).warningIfError(this) } return if (failAsError) result.reportIfError(this) else result.warningIfError(this) diff --git a/compiler/testData/cli/jvm/extraHelp.out b/compiler/testData/cli/jvm/extraHelp.out index 0a9ecdfb355..cacacdfc2c7 100644 --- a/compiler/testData/cli/jvm/extraHelp.out +++ b/compiler/testData/cli/jvm/extraHelp.out @@ -35,6 +35,8 @@ where advanced options include: -Xenhance-type-parameter-types-to-def-not-null Enhance not null annotated type parameter's types to definitely not null types (@NotNull T => T & Any) -Xfriend-paths= Paths to output directories for friend modules (whose internals should be visible) + -Xignore-const-optimization-errors + Ignore all compilation exceptions while optimizing some constant expressions. -Xmultifile-parts-inherit Compile multifile classes as a hierarchy of parts and facade -Xmodule-path= Paths where to find Java 9+ modules -Xjava-package-prefix Package prefix for Java files