summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2009-11-12 12:31:49 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2009-11-12 12:31:49 +0000
commit0e4ff57c1c34f237edb0ac8c463ebad0acb4f7d0 (patch)
tree8a5b12cad8900c7fd7971961b2e2c6a45e2964b7
parentf5a525aaceb9415e4339f7b2aa86f5de4fb1c6b7 (diff)
downloadscala-0e4ff57c1c34f237edb0ac8c463ebad0acb4f7d0.tar.gz
scala-0e4ff57c1c34f237edb0ac8c463ebad0acb4f7d0.tar.bz2
scala-0e4ff57c1c34f237edb0ac8c463ebad0acb4f7d0.zip
fix #2488.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala5
-rw-r--r--test/files/neg/names-defaults-neg.check49
-rw-r--r--test/files/neg/names-defaults-neg.scala1
-rw-r--r--test/files/run/names-defaults.check4
-rw-r--r--test/files/run/names-defaults.scala2
5 files changed, 33 insertions, 28 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
index f19f5516c0..773b2cf561 100644
--- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
@@ -388,7 +388,10 @@ trait NamesDefaults { self: Analyzer =>
}
val res = typer.silent(_.typed(arg, subst(paramtpe))) match {
case _: TypeError =>
- positionalAllowed = false
+ // if the named argument is on the original parameter
+ // position, positional after named is allowed.
+ if (index != pos)
+ positionalAllowed = false
argPos(index) = pos
rhs
case t: Tree =>
diff --git a/test/files/neg/names-defaults-neg.check b/test/files/neg/names-defaults-neg.check
index e47cf8c420..39347cd5db 100644
--- a/test/files/neg/names-defaults-neg.check
+++ b/test/files/neg/names-defaults-neg.check
@@ -1,4 +1,4 @@
-names-defaults-neg.scala:66: error: not enough arguments for method apply: (a: Int,b: String)(c: Int*)Fact in object Fact.
+names-defaults-neg.scala:65: error: not enough arguments for method apply: (a: Int,b: String)(c: Int*)Fact in object Fact.
Unspecified value parameter b.
val fac = Fact(1)(2, 3)
^
@@ -8,87 +8,84 @@ names-defaults-neg.scala:5: error: type mismatch;
test1(b = 2, a = "#")
^
names-defaults-neg.scala:8: error: positional after named argument.
- test1(a = 1, "*")
- ^
-names-defaults-neg.scala:9: error: positional after named argument.
test1(b = "(*", 23)
^
-names-defaults-neg.scala:14: error: reference to x is ambiguous; it is both, a parameter
+names-defaults-neg.scala:13: error: reference to x is ambiguous; it is both, a parameter
name of the method and the name of a variable currently in scope.
test2(x = 1)
^
-names-defaults-neg.scala:16: error: not found: value c
+names-defaults-neg.scala:15: error: not found: value c
test1(c = 0, b = "joke")
^
-names-defaults-neg.scala:17: error: not found: value m
+names-defaults-neg.scala:16: error: not found: value m
test7((m = 1)) // named arguments must be top-level assignments
^
-names-defaults-neg.scala:18: error: not found: value m
+names-defaults-neg.scala:17: error: not found: value m
test7({m = 1})
^
-names-defaults-neg.scala:19: error: not found: value m
+names-defaults-neg.scala:18: error: not found: value m
test7 { m = 1 } // no named arguments in argument block
^
-names-defaults-neg.scala:20: error: reference to x is ambiguous; it is both, a parameter
+names-defaults-neg.scala:19: error: reference to x is ambiguous; it is both, a parameter
name of the method and the name of a variable currently in scope.
test8(x = 1)
^
-names-defaults-neg.scala:23: error: parameter specified twice: a
+names-defaults-neg.scala:22: error: parameter specified twice: a
test1(1, a = 2)
^
-names-defaults-neg.scala:24: error: parameter specified twice: b
+names-defaults-neg.scala:23: error: parameter specified twice: b
test1(b = 1, b = "2")
^
-names-defaults-neg.scala:27: error: {
+names-defaults-neg.scala:26: error: {
val x$1: Int(3) = 3;
val x$2: Int(1) = 1;
Test.this.test3(1, 3)
} of type Int does not take parameters
test3(b = 3, a = 1)(3)
^
-names-defaults-neg.scala:36: error: ambiguous reference to overloaded definition,
+names-defaults-neg.scala:35: error: ambiguous reference to overloaded definition,
both method f in object t1 of type (b: String,a: Int)java.lang.String
and method f in object t1 of type (a: Int,b: String)java.lang.String
match argument types (b: java.lang.String,a: Int)
t1.f(b = "dkljf", a = 1)
^
-names-defaults-neg.scala:43: error: ambiguous reference to overloaded definition,
+names-defaults-neg.scala:42: error: ambiguous reference to overloaded definition,
both method f in object t3 of type (a2: Int)(b: Int)java.lang.String
and method f in object t3 of type (a1: Int)java.lang.String
match argument types (Int)
t3.f(1)
^
-names-defaults-neg.scala:44: error: ambiguous reference to overloaded definition,
+names-defaults-neg.scala:43: error: ambiguous reference to overloaded definition,
both method f in object t3 of type (a2: Int)(b: Int)java.lang.String
and method f in object t3 of type (a1: Int)java.lang.String
match argument types (Int)
t3.f(1)(2)
^
-names-defaults-neg.scala:50: error: ambiguous reference to overloaded definition,
+names-defaults-neg.scala:49: error: ambiguous reference to overloaded definition,
both method g in object t7 of type (a: B)java.lang.String
and method g in object t7 of type (a: C,b: Int*)java.lang.String
match argument types (C)
t7.g(new C()) // ambigous reference
^
-names-defaults-neg.scala:54: error: parameter specified twice: b
+names-defaults-neg.scala:53: error: parameter specified twice: b
test5(a = 1, b = "dkjl", b = "dkj")
^
-names-defaults-neg.scala:55: error: parameter specified twice: b
+names-defaults-neg.scala:54: error: parameter specified twice: b
test5(1, "2", b = 3)
^
-names-defaults-neg.scala:56: error: when using named arguments, the vararg parameter has to be specified exactly once
+names-defaults-neg.scala:55: error: when using named arguments, the vararg parameter has to be specified exactly once
test5(b = "dlkj")
^
-names-defaults-neg.scala:62: error: ambiguous reference to overloaded definition,
+names-defaults-neg.scala:61: error: ambiguous reference to overloaded definition,
both method f in object t8 of type (b: String,a: Int)java.lang.String
and method f in object t8 of type (a: Int,b: java.lang.Object)java.lang.String
match argument types (a: Int,b: java.lang.String) and expected result type Any
println(t8.f(a = 0, b = "1")) // ambigous reference
^
-names-defaults-neg.scala:70: error: wrong number of arguments for <none>: (x: Int,y: String)A1
+names-defaults-neg.scala:69: error: wrong number of arguments for <none>: (x: Int,y: String)A1
A1() match { case A1(_) => () }
^
-names-defaults-neg.scala:77: error: no type parameters for method test4: (x: T[T[List[T[X forSome { type X }]]]])T[T[List[T[X forSome { type X }]]]] exist so that it can be applied to arguments (List[Int])
+names-defaults-neg.scala:76: error: no type parameters for method test4: (x: T[T[List[T[X forSome { type X }]]]])T[T[List[T[X forSome { type X }]]]] exist so that it can be applied to arguments (List[Int])
--- because ---
argument expression's type is not compatible with formal parameter type;
found : List[Int]
@@ -96,15 +93,15 @@ argument expression's type is not compatible with formal parameter type;
Error occured in an application involving default arguments.
test4()
^
-names-defaults-neg.scala:80: error: type mismatch;
+names-defaults-neg.scala:79: error: type mismatch;
found : List[Int]
required: scala.List[scala.List[?]]
def test6[T](x: List[List[T]] = List(1,2)) = x
^
-names-defaults-neg.scala:83: error: type mismatch;
+names-defaults-neg.scala:82: error: type mismatch;
found : Int
required: String
Error occured in an application involving default arguments.
new A2[String]()
^
-25 errors found
+24 errors found
diff --git a/test/files/neg/names-defaults-neg.scala b/test/files/neg/names-defaults-neg.scala
index 5829da361c..3babd56c6f 100644
--- a/test/files/neg/names-defaults-neg.scala
+++ b/test/files/neg/names-defaults-neg.scala
@@ -5,7 +5,6 @@ object Test extends Application {
test1(b = 2, a = "#")
// mixing named and positional
- test1(a = 1, "*")
test1(b = "(*", 23)
// assignment / names
diff --git a/test/files/run/names-defaults.check b/test/files/run/names-defaults.check
index 937f95962b..47d09a5083 100644
--- a/test/files/run/names-defaults.check
+++ b/test/files/run/names-defaults.check
@@ -18,12 +18,16 @@ get: [
get: 4
get: @
4: @
+get: 10
+get: flu
+10: flu
get: 8
get: 9
get: %
get: 5
5: %, 17
12: ', 13, 16
+1: bird, swine, 10
6: ~
get: 7
get: +
diff --git a/test/files/run/names-defaults.scala b/test/files/run/names-defaults.scala
index 008939cc9d..d5524b95ab 100644
--- a/test/files/run/names-defaults.scala
+++ b/test/files/run/names-defaults.scala
@@ -13,8 +13,10 @@ object Test extends Application {
// mixing named and positional
test1(get(4), b = get("@"))
+ test1(a = get(10), get("flu"))
test2(get(8), v = get(9))(get("%"), l = get(5))
test3(12, 13)("'", d = 16)
+ test3(a = 1, "swine")(c = "bird", d = 10L)
// anonymous functions