From 145c7811a80b40dca3292f69beea69931c33070d Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Wed, 18 Dec 2013 12:02:40 +0400 Subject: [PATCH] Named vararg arguments: don't allow to use array without spread, allow to use one value of vararg type #KT-3802 Fixed --- .../lang/resolve/calls/CandidateResolver.java | 12 ++-- .../boxWithStdlib/vararg/varargInFunParam.kt | 69 +++++++++++++++++++ .../tests/checkArguments/SpreadVarargs.kt | 7 +- 3 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 compiler/testData/codegen/boxWithStdlib/vararg/varargInFunParam.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 1e65415e97b..140cacfced1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -931,16 +931,12 @@ public class CandidateResolver { } } else { - if (argument.isNamed()) { - return parameterDescriptor.getType(); - } - else { - JetType varargElementType = parameterDescriptor.getVarargElementType(); - if (varargElementType == null) { - return parameterDescriptor.getType(); - } + JetType varargElementType = parameterDescriptor.getVarargElementType(); + if (varargElementType != null) { return varargElementType; } + + return parameterDescriptor.getType(); } } diff --git a/compiler/testData/codegen/boxWithStdlib/vararg/varargInFunParam.kt b/compiler/testData/codegen/boxWithStdlib/vararg/varargInFunParam.kt new file mode 100644 index 00000000000..90ae040fba8 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/vararg/varargInFunParam.kt @@ -0,0 +1,69 @@ +fun box(): String { + if (test1() != "") return "fail 1" + if (test1(1) != "1") return "fail 2" + if (test1(1, 2) != "12") return "fail 3" + + if (test1(*intArray()) != "") return "fail 4" + if (test1(*intArray(1)) != "1") return "fail 5" + if (test1(*intArray(1, 2)) != "12") return "fail 6" + + if (test1(p = 1) != "1") return "fail 7" + + if (test1(p = *intArray()) != "") return "fail 8" + if (test1(p = *intArray(1)) != "1") return "fail 9" + if (test1(p = *intArray(1, 2)) != "12") return "fail 10" + + if (test2() != "") return "fail 11" + if (test2("1") != "1") return "fail 12" + if (test2("1", "2") != "12") return "fail 13" + + if (test2(*array()) != "") return "fail 14" + if (test2(*array("1")) != "1") return "fail 15" + if (test2(*array("1", "2")) != "12") return "fail 16" + + if (test2(p = "1") != "1") return "fail 17" + + if (test2(p = *array()) != "") return "fail 18" + if (test2(p = *array("1")) != "1") return "fail 19" + if (test2(p = *array("1", "2")) != "12") return "fail 20" + + if (test3() != "") return "fail 21" + if (test3("1") != "1") return "fail 22" + if (test3("1", "2") != "12") return "fail 23" + + if (test3(*array()) != "") return "fail 24" + if (test3(*array("1")) != "1") return "fail 25" + if (test3(*array("1", "2")) != "12") return "fail 26" + + if (test3(p = "1") != "1") return "fail 27" + + if (test3(p = *array()) != "") return "fail 28" + if (test3(p = *array("1")) != "1") return "fail 29" + if (test3(p = *array("1", "2")) != "12") return "fail 30" + + return "OK" +} + +fun test1(vararg p: Int): String { + var result = "" + for (i in p) { + result += i + } + return result +} + +fun test2(vararg p: String): String { + var result = "" + for (i in p) { + result += i + } + return result +} + +fun test3(vararg p: T): String { + var result = "" + for (i in p) { + result += i + } + return result +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt index 5ce4e606fff..1c1ef66583f 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/SpreadVarargs.kt @@ -8,7 +8,7 @@ fun main(args : Array) { join(1, "2", "3") join(*1, "2") join(1, *"2") - join(x = 1, a = "2") + join(x = 1, a = "2") join(x = *1, a = *"2") join(x = 1, a = *a) join(x = 1, a = *b) @@ -23,12 +23,13 @@ fun main(args : Array) { join(1, "4", *a, *b, "3") join(a = *a, x = 1) join(a = *b, x = 1) + join(a = a, x = 1) joinG(1, "2") joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = *a) - joinG(x = 1, a = "2") + joinG(x = 1, a = "2") joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3") @@ -41,7 +42,7 @@ fun main(args : Array) { joinG(*1, "2") joinG(1, *"2") joinG(x = 1, a = *a) - joinG(x = 1, a = "2") + joinG(x = 1, a = "2") joinG(x = *1, a = *"2") joinG(1, *a) joinG(1, *a, "3")