From b46187a5601fd1565c07cb27c0a067484455e9d0 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 7 Sep 2012 18:24:12 +0400 Subject: [PATCH] KT-2739 Error type inferred for hashSet(Pair, Pair, Pair) #KT-2739 Fixed --- .../jet/lang/resolve/calls/CallResolver.java | 9 +++++--- .../testData/codegen/regressions/kt2739.kt | 10 +++++++++ .../tests/inference/varargs/varargsAndPair.kt | 8 +++++++ .../checkers/JetDiagnosticsTestGenerated.java | 21 ++++++++++++++----- .../jet/codegen/FunctionGenTest.java | 3 +++ 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2739.kt create mode 100644 compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 23155aa4ec1..561dc5cd121 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -798,9 +798,12 @@ public class CallResolver { JetType effectiveExpectedType = getEffectiveExpectedType(valueParameterDescriptor, valueArgument); TemporaryBindingTrace traceForUnknown = TemporaryBindingTrace.create(context.trace); JetExpression argumentExpression = valueArgument.getArgumentExpression(); - JetType type = argumentExpression != null ? expressionTypingServices.getType( - context.scope, argumentExpression, substitutor.substitute(valueParameterDescriptor.getType(), Variance.INVARIANT), - context.dataFlowInfo, traceForUnknown) : null; + JetType type = argumentExpression != null + ? expressionTypingServices.getType( + context.scope, argumentExpression, + substitutor.substitute(effectiveExpectedType, Variance.INVARIANT), + context.dataFlowInfo, traceForUnknown) + : null; constraintSystem.addSupertypeConstraint(effectiveExpectedType, type, ConstraintPosition.getValueParameterPosition( valueParameterDescriptor.getIndex())); //todo no return diff --git a/compiler/testData/codegen/regressions/kt2739.kt b/compiler/testData/codegen/regressions/kt2739.kt new file mode 100644 index 00000000000..dd2bdbf98df --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2739.kt @@ -0,0 +1,10 @@ +// KT-2739 Error type inferred for hashSet(Pair, Pair, Pair) + +fun foo(vararg ts: T): T? = null + +class Pair(a: A) + +fun box(): String { + val v = foo(Pair(1)) + return if (v == null) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt b/compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt new file mode 100644 index 00000000000..9d294ae34c7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt @@ -0,0 +1,8 @@ +fun foo(vararg ts: T): T? = null + +class Pair(a: A) + +fun test() { + val v = foo(Pair(1)) + v: Int // check that it is not error type +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 83164030807..c14beb98bcd 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -15,16 +15,13 @@ */ package org.jetbrains.jet.checkers; -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; - -import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve; +import java.io.File; /** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */ @InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class}) @@ -1471,7 +1468,7 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage } @TestMetadata("compiler/testData/diagnostics/tests/inference") - @InnerTestClasses({Inference.Regressions.class}) + @InnerTestClasses({Inference.Regressions.class, Inference.Varargs.class}) public static class Inference extends AbstractDiagnosticsTestWithEagerResolve { public void testAllFilesPresentInInference() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve", new File("compiler/testData/diagnostics/tests/inference"), "kt", true); @@ -1715,10 +1712,24 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage } + @TestMetadata("compiler/testData/diagnostics/tests/inference/varargs") + public static class Varargs extends AbstractDiagnosticsTestWithEagerResolve { + public void testAllFilesPresentInVarargs() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve", new File("compiler/testData/diagnostics/tests/inference/varargs"), "kt", true); + } + + @TestMetadata("varargsAndPair.kt") + public void testVarargsAndPair() throws Exception { + doTest("compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt"); + } + + } + public static Test innerSuite() { TestSuite suite = new TestSuite("Inference"); suite.addTestSuite(Inference.class); suite.addTestSuite(Regressions.class); + suite.addTestSuite(Varargs.class); return suite; } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java index 6de126c6881..d46c2e15c8d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/FunctionGenTest.java @@ -171,6 +171,9 @@ public class FunctionGenTest extends CodegenTestCase { blackBoxFile("regressions/kt1038.kt"); } + public void testKt2739() { + blackBoxFile("regressions/kt2739.kt"); + } public void testReferencesStaticInnerClassMethod() throws Exception { blackBoxFileWithJava("functions/referencesStaticInnerClassMethod.kt");