Overridable val should not be treated as constant

#KT-9443 fixed
This commit is contained in:
Alexey Tsvetkov
2015-10-26 18:04:22 +03:00
parent 0a69cca066
commit 294559a94f
6 changed files with 56 additions and 0 deletions
@@ -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
}
@@ -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"
}