diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java index c04474dac30..44c37c97435 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/OverloadingConflictResolver.java @@ -94,10 +94,24 @@ public class OverloadingConflictResolver { List gParams = g.getValueParameters(); int fSize = fParams.size(); - if (fSize != gParams.size()) return false; - for (int i = 0; i < fSize; i++) { + int gSize = gParams.size(); + if (fSize > gSize) return false; + for (int i = 0; i < gSize; i++) { + ValueParameterDescriptor gParam = gParams.get(i); + JetType gParamType = gParam.getType(); + + if (i >= fSize) { + // f() has fewer parameters than g() + // The point is: g() may have a last vararg that doesn't get any arguments + // In this case f() is more specific, because one can explicitly pass + // an empty array to g() and make it preferred + if (i != gSize - 1 || gParam.getVarargElementType() == null) { + return false; + } + return true; + } + JetType fParamType = fParams.get(i).getType(); - JetType gParamType = gParams.get(i).getType(); if (!typeMoreSpecific(fParamType, gParamType)) { return false; diff --git a/compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.jet b/compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.jet new file mode 100644 index 00000000000..cf52df1fbd1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/AmbiguousVararg.jet @@ -0,0 +1,6 @@ +fun foo(vararg t : String) = "" +fun foo(vararg t : Int) = "" + +fun test() { + foo() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/NilaryVsVararg.jet b/compiler/testData/diagnostics/tests/varargs/NilaryVsVararg.jet new file mode 100644 index 00000000000..9cd35047fae --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/NilaryVsVararg.jet @@ -0,0 +1,10 @@ +fun foo0() : String = "noarg" + +fun foo0(vararg t : Int) : String = "vararg" + +fun test0() { + foo0() + foo0(1) + val a = IntArray(0) + foo0(*a) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/UnaryVsVararg.jet b/compiler/testData/diagnostics/tests/varargs/UnaryVsVararg.jet new file mode 100644 index 00000000000..3fea2a65369 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/UnaryVsVararg.jet @@ -0,0 +1,9 @@ +fun foo1(a : Int) : String = "noarg" + +fun foo1(a : Int, vararg t : Int) : String = "vararg" + +fun test1() { + foo1(1) + val a = IntArray(0) + foo1(1, *a) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/kt1781.jet b/compiler/testData/diagnostics/tests/varargs/kt1781.jet new file mode 100644 index 00000000000..f34215e5342 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt1781.jet @@ -0,0 +1,13 @@ +// FILE: kotlin.kt +fun foo() { + JavaClass() + JavaClass("") +} + +// FILE: JavaClass.java + +public class JavaClass { + public JavaClass() { } + + public JavaClass(String... ss) { } +} diff --git a/compiler/testData/resolve/varargs/NilaryVsVararg.jet b/compiler/testData/resolve/varargs/NilaryVsVararg.jet new file mode 100644 index 00000000000..b85e7863138 --- /dev/null +++ b/compiler/testData/resolve/varargs/NilaryVsVararg.jet @@ -0,0 +1,10 @@ +~nilary~fun foo0() : String = "noarg" + +~vararg~fun foo0(vararg t : Int) : String = "vararg" + +fun test0() { + `nilary`foo0() + `vararg`foo0(1) + val a = intArray() + `vararg`foo0(*a) +} diff --git a/compiler/testData/resolve/varargs/UnaryVsVararg.jet b/compiler/testData/resolve/varargs/UnaryVsVararg.jet new file mode 100644 index 00000000000..3089f4271dc --- /dev/null +++ b/compiler/testData/resolve/varargs/UnaryVsVararg.jet @@ -0,0 +1,10 @@ +~unary~fun foo1(a : Int) : String = "noarg" + +~vararg~fun foo1(a : Int, vararg t : Int) : String = "vararg" + +fun test1() { + `unary`foo1(1) + `vararg`foo1(1, 1) + val a = intArray() + `vararg`foo1(1, *a) +}