Overridable val should not be treated as constant
#KT-9443 fixed
This commit is contained in:
+2
@@ -518,6 +518,8 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
if (resolvedCall != null) {
|
||||
val callableDescriptor = resolvedCall.getResultingDescriptor()
|
||||
if (callableDescriptor is VariableDescriptor) {
|
||||
if (callableDescriptor is PropertyDescriptor && callableDescriptor.modality.isOverridable) return null
|
||||
|
||||
val variableInitializer = callableDescriptor.getCompileTimeInitializer() ?: return null
|
||||
|
||||
return createConstant(
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
abstract class BaseClass {
|
||||
protected open val menuId: Int = 0
|
||||
|
||||
public fun run(): Pair<String, Boolean> =
|
||||
"$menuId" to (menuId == 0)
|
||||
}
|
||||
|
||||
class ImplClass: BaseClass() {
|
||||
override val menuId: Int = 3
|
||||
}
|
||||
|
||||
public fun box(): String {
|
||||
val result = ImplClass().run()
|
||||
|
||||
if (result != ("3" to false)) return "Fail: $result"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -13,6 +13,12 @@ class A {
|
||||
// val prop4: 2
|
||||
val prop4 = A.a + 1
|
||||
|
||||
// val prop7: 0
|
||||
open val prop7 = 0
|
||||
|
||||
// val prop8: null
|
||||
val prop8 = prop7
|
||||
|
||||
companion object {
|
||||
val a = 1
|
||||
}
|
||||
|
||||
+6
@@ -1516,6 +1516,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
||||
doTestWithStdlib(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt9443.kt")
|
||||
public void testKt9443() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/evaluate/kt9443.kt");
|
||||
doTestWithStdlib(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("maxValue.kt")
|
||||
public void testMaxValue() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/evaluate/maxValue.kt");
|
||||
|
||||
@@ -56,6 +56,10 @@ public final class MiscTest extends AbstractExpressionTest {
|
||||
checkOutput("KT-1052.kt", "true\n");
|
||||
}
|
||||
|
||||
public void testKt9443() throws Exception {
|
||||
checkFooBoxIsOk("kt9443.kt");
|
||||
}
|
||||
|
||||
public void testKt740_1() throws Exception {
|
||||
checkFooBoxIsTrue("KT-740.kt");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package foo
|
||||
|
||||
abstract class BaseClass {
|
||||
protected open val menuId: Int = 0
|
||||
|
||||
public fun run(): Pair<String, Boolean> =
|
||||
"$menuId" to (menuId == 0)
|
||||
}
|
||||
|
||||
class ImplClass: BaseClass() {
|
||||
override val menuId: Int = 3
|
||||
}
|
||||
|
||||
public fun box(): String {
|
||||
val result = ImplClass().run()
|
||||
|
||||
if (result != ("3" to false)) return "Fail: $result"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user