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);
|
||||
if (intrinsic != null) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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)[1].equals(4));
|
||||
}
|
||||
|
||||
public void testKt581() {
|
||||
createEnvironmentWithFullJdk();
|
||||
blackBoxFile("regressions/kt581.jet");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user