Fix for KT-12125: Wrong increment/decrement on Byte/Char/Short.MAX_VALUE/MIN_VALUE
#KT-12125 Fixed
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user