KT-581 wrong implicit receiver for intrinsic method call
This commit is contained in:
@@ -790,6 +790,25 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
final IntrinsicMethod intrinsic = intrinsics.getIntrinsic(descriptor);
|
final IntrinsicMethod intrinsic = intrinsics.getIntrinsic(descriptor);
|
||||||
if (intrinsic != null) {
|
if (intrinsic != null) {
|
||||||
final Type expectedType = expressionType(expression);
|
final Type expectedType = expressionType(expression);
|
||||||
|
if(receiver == StackValue.none()) {
|
||||||
|
if (resolvedCall.getThisObject().exists()) {
|
||||||
|
if(resolvedCall.getReceiverArgument().exists()) {
|
||||||
|
generateFromResolvedCall(resolvedCall.getThisObject());
|
||||||
|
generateFromResolvedCall(resolvedCall.getReceiverArgument());
|
||||||
|
receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getReceiverArgument().getType()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
generateFromResolvedCall(resolvedCall.getThisObject());
|
||||||
|
receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getThisObject().getType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (resolvedCall.getReceiverArgument().exists()) {
|
||||||
|
generateFromResolvedCall(resolvedCall.getReceiverArgument());
|
||||||
|
receiver = StackValue.onStack(typeMapper.mapType(resolvedCall.getReceiverArgument().getType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return intrinsic.generate(this, v, expectedType, expression, Collections.<JetExpression>emptyList(), receiver);
|
return intrinsic.generate(this, v, expectedType, expression, Collections.<JetExpression>emptyList(), receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
namespace whats.the.difference
|
||||||
|
|
||||||
|
import java.util.HashSet
|
||||||
|
|
||||||
|
fun iarray(vararg a : Int) = a // BUG
|
||||||
|
|
||||||
|
fun IntArray.lastIndex() = size - 1
|
||||||
|
|
||||||
|
fun box() : String {
|
||||||
|
// Problematic code does not compile
|
||||||
|
// val vals = iarray(789, 678, 567, 456, 345, 234, 123, 012)
|
||||||
|
|
||||||
|
val vals = iarray(789, 678, 567, 456, 345, 234, 123, 12)
|
||||||
|
val diffs = HashSet<Int>
|
||||||
|
for (i in vals.indices)
|
||||||
|
for (j in i..vals.lastIndex())
|
||||||
|
diffs.add(vals[i] - vals[j])
|
||||||
|
System.out?.println(diffs.size())
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -69,4 +69,9 @@ public class VarArgTest extends CodegenTestCase {
|
|||||||
assertTrue(((Integer[])res)[0].equals(2));
|
assertTrue(((Integer[])res)[0].equals(2));
|
||||||
assertTrue(((Integer[])res)[1].equals(4));
|
assertTrue(((Integer[])res)[1].equals(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testKt581() {
|
||||||
|
createEnvironmentWithFullJdk();
|
||||||
|
blackBoxFile("regressions/kt581.jet");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user