From 13cad2a8208523229fd0de3a8cbaad3ccb13b9ab Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 23 Jan 2023 18:02:19 +0100 Subject: [PATCH] Don't save constant value for non-resolved array expression in K1 #KT-55912 Fixed --- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../checkers/ValueClassDeclarationChecker.kt | 14 +------------- .../evaluate/ConstantExpressionEvaluator.kt | 7 +++++++ compiler/testData/codegen/box/evaluate/kt55912.kt | 8 ++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../src/org/jetbrains/kotlin/types/TypeUtils.kt | 9 +++++++++ .../kotlin/js/test/JsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/fir/FirJsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsES6CodegenBoxTestGenerated.java | 6 ++++++ .../semantics/IrCodegenBoxWasmTestGenerated.java | 5 +++++ .../K2NativeCodegenBoxTestGenerated.java | 6 ++++++ .../NativeCodegenBoxTestGenerated.java | 6 ++++++ 15 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/codegen/box/evaluate/kt55912.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 3a81c24e4d5..32ac5071f09 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -17063,6 +17063,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/evaluate/intrinsics.kt"); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ValueClassDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ValueClassDeclarationChecker.kt index 4ead1103089..fb724a18bc3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ValueClassDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ValueClassDeclarationChecker.kt @@ -19,10 +19,7 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperClassifiers import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.typeUtil.isNothing -import org.jetbrains.kotlin.types.typeUtil.isTypeParameter -import org.jetbrains.kotlin.types.typeUtil.isUnit -import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections +import org.jetbrains.kotlin.types.typeUtil.* private val javaLangCloneable = FqNameUnsafe("java.lang.Cloneable") @@ -193,15 +190,6 @@ object ValueClassDeclarationChecker : DeclarationChecker { private fun KotlinType.isInapplicableParameterType() = isUnit() || isNothing() - private fun KotlinType.isGenericArrayOfTypeParameter(): Boolean { - if (!KotlinBuiltIns.isArray(this)) return false - val argument0 = arguments[0] - if (argument0.isStarProjection) return false - val argument0type = argument0.type - return argument0type.isTypeParameter() || - argument0type.isGenericArrayOfTypeParameter() - } - private fun isParameterAcceptableForInlineClass(parameter: KtParameter): Boolean { val isOpen = parameter.modalityModifier()?.node?.elementType == KtTokens.OPEN_KEYWORD return parameter.hasValOrVar() && !parameter.isMutable && !parameter.isVarArg && !isOpen diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index 19ed9c1e6f5..3aed3aaee13 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -49,6 +49,7 @@ import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.types.isError import org.jetbrains.kotlin.types.typeUtil.isBoolean +import org.jetbrains.kotlin.types.typeUtil.isGenericArrayOfTypeParameter import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.kotlin.util.OperatorNameConventions import java.math.BigInteger @@ -408,6 +409,12 @@ private class ConstantExpressionEvaluatorVisitor( if (shouldSkipComplexBooleanValue(expression, compileTimeConstant)) { return null } + + // If constant is `Array` and its argument is some generic type, then we must wait for full resolve and only when we can record value + if (compileTimeConstant is TypedCompileTimeConstant && compileTimeConstant.type.isGenericArrayOfTypeParameter()) { + return compileTimeConstant + } + trace.record(BindingContext.COMPILE_TIME_VALUE, expression, compileTimeConstant) return compileTimeConstant } diff --git a/compiler/testData/codegen/box/evaluate/kt55912.kt b/compiler/testData/codegen/box/evaluate/kt55912.kt new file mode 100644 index 00000000000..2fef4515ea2 --- /dev/null +++ b/compiler/testData/codegen/box/evaluate/kt55912.kt @@ -0,0 +1,8 @@ +public annotation class Entity(val foreignKeys: Array) + +@Entity(foreignKeys = kotlin.arrayOf("id")) // works without "kotlin." +class Record + +fun box(): String { + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index f6c68be7056..306e5ab0985 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -16757,6 +16757,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/evaluate/intrinsics.kt"); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 1371f58040f..fbc4d13e716 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -17063,6 +17063,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/evaluate/intrinsics.kt"); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index ca8781eac92..8b5f3cb0e32 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13830,6 +13830,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/evaluate/intrinsics.kt"); } + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { runTest("compiler/testData/codegen/box/evaluate/kt9443.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt index 8042154d442..a6c25adfd63 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt @@ -101,6 +101,15 @@ fun KotlinType?.isArrayOfNothing(): Boolean { return typeArg != null && KotlinBuiltIns.isNothingOrNullableNothing(typeArg) } +fun KotlinType.isGenericArrayOfTypeParameter(): Boolean { + if (!KotlinBuiltIns.isArray(this)) return false + val argument0 = arguments[0] + if (argument0.isStarProjection) return false + val argument0type = argument0.type + return argument0type.isTypeParameter() || + argument0type.isGenericArrayOfTypeParameter() +} + fun KotlinType.isSubtypeOf(superType: KotlinType): Boolean = KotlinTypeChecker.DEFAULT.isSubtypeOf(this, superType) diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index eb61490dd13..0cba85dc22c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -12913,6 +12913,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index fc401a3621f..1d60840785d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -13009,6 +13009,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 7019e499242..d5d4a45fcff 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -13009,6 +13009,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index bcf923c3fc3..ac2bc7926ec 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -13009,6 +13009,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 88ac9b48056..ff5378228af 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -11535,6 +11535,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true); } + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { runTest("compiler/testData/codegen/box/evaluate/kt9443.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java index f21101d538d..a02a7bc8b9a 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java @@ -14188,6 +14188,12 @@ public class K2NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index c382d3e01d4..534bc70e535 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -14023,6 +14023,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true); } + @Test + @TestMetadata("kt55912.kt") + public void testKt55912() throws Exception { + runTest("compiler/testData/codegen/box/evaluate/kt55912.kt"); + } + @Test @TestMetadata("kt9443.kt") public void testKt9443() throws Exception {