Fix for KT-12125: Wrong increment/decrement on Byte/Char/Short.MAX_VALUE/MIN_VALUE

#KT-12125 Fixed
This commit is contained in:
Mikhael Bogdanov
2016-05-10 15:49:22 +03:00
parent 8425304866
commit d6a64af929
8 changed files with 98 additions and 12 deletions
@@ -64,9 +64,6 @@ public class SpecialFiles {
excludedFiles.add("kt684.kt"); // StackOverflow with StringBuilder (escape())
excludedFiles.add("kt529.kt"); // Bug
excludedFiles.add("kt344.kt"); // Bug
excludedFiles.add("genericBackingFieldSignature.kt"); // Wrong signature after package renaming
excludedFiles.add("genericMethodSignature.kt"); // Wrong signature after package renaming
@@ -562,11 +562,6 @@ public class AsmUtil {
v.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "areEqual", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false);
}
public static void genIncrement(Type expectedType, int myDelta, InstructionAdapter v) {
numConst(myDelta, expectedType, v);
v.add(expectedType);
}
public static void numConst(int value, Type type, InstructionAdapter v) {
if (type == Type.FLOAT_TYPE) {
v.fconst(value);
@@ -585,9 +580,11 @@ public class AsmUtil {
}
}
public static void genIncrement(Type expectedType, Type baseType, int myDelta, InstructionAdapter v) {
genIncrement(baseType, myDelta, v);
StackValue.coerce(baseType, expectedType, v);
public static void genIncrement(Type baseType, int myDelta, InstructionAdapter v) {
Type operationType = numberFunctionOperandType(baseType);
numConst(myDelta, operationType, v);
v.add(operationType);
StackValue.coerce(operationType, baseType, v);
}
public static void swap(InstructionAdapter v, Type stackTop, Type afterTop) {
@@ -3348,7 +3348,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
Type storeType;
if (isPrimitiveNumberClassDescriptor && AsmUtil.isPrimitive(asmBaseType)) {
genIncrement(asmResultType, asmBaseType, increment, v);
genIncrement(asmBaseType, increment, v);
storeType = asmBaseType;
}
else {
+17
View File
@@ -0,0 +1,17 @@
fun test(i: Int): Int {
return i
}
fun box(): String {
var b = Byte.MAX_VALUE
b++
var result = test(b.toInt())
if (result != Byte.MIN_VALUE.toInt()) return "fail 1: $result"
var s = Short.MIN_VALUE
s--
result = test(s.toInt())
if (result != Short.MAX_VALUE.toInt()) return "fail 2: $result"
return "OK"
}
+16
View File
@@ -0,0 +1,16 @@
fun box(): String {
var aByte: Byte? = 0
var bByte: Byte = 0
if (aByte != null) aByte--
bByte--
if (aByte != bByte) return "Failed post-decrement Byte: $aByte != $bByte"
if (aByte != null) aByte++
bByte++
if (aByte != bByte) return "Failed post-increment Byte: $aByte != $bByte"
aByte = null
return "OK"
}
+15
View File
@@ -0,0 +1,15 @@
fun test(i: Int): Int {
return i
}
fun box(): String {
var b = Byte.MAX_VALUE
var result = test(b.inc().toInt())
if (result != Byte.MIN_VALUE.toInt()) return "fail 1: $result"
var s = Short.MAX_VALUE
result = test(s.inc().toInt())
if (result != Short.MIN_VALUE.toInt()) return "fail 2: $result"
return "OK"
}
@@ -0,0 +1,20 @@
fun test(i: Int): Int {
return i
}
fun box(): String {
var aByte: Byte? = 0
var bByte: Byte = 0
if (aByte != null) {
if (aByte.dec() != bByte.dec()) return "Failed post-decrement Byte: ${aByte.dec()} != ${bByte.dec()}"
}
if (aByte != null) {
if (aByte.inc() != bByte.inc()) return "Failed post-increment Byte: ${aByte.inc()} != ${bByte.inc()}"
}
aByte = null
return "OK"
}
@@ -7000,6 +7000,30 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName);
}
@TestMetadata("kt12125.kt")
public void testKt12125() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt12125.kt");
doTest(fileName);
}
@TestMetadata("kt12125_2.kt")
public void testKt12125_2() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt12125_2.kt");
doTest(fileName);
}
@TestMetadata("kt12125_inc.kt")
public void testKt12125_inc() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt12125_inc.kt");
doTest(fileName);
}
@TestMetadata("kt12125_inc_2.kt")
public void testKt12125_inc_2() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt12125_inc_2.kt");
doTest(fileName);
}
@TestMetadata("kt5937.kt")
public void testKt5937() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/intrinsics/kt5937.kt");