summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@epfl.ch>2009-09-11 08:18:50 +0000
committerLukas Rytz <lukas.rytz@epfl.ch>2009-09-11 08:18:50 +0000
commit10cf73815b04d3d3d214adc1d5176daa81916e8f (patch)
treec8f9316bba98f33ed288a0b9b534e128e4e6e2b4
parent0250956d2dab3df8d8c72a94fbc886bf655dc690 (diff)
downloadscala-10cf73815b04d3d3d214adc1d5176daa81916e8f.tar.gz
scala-10cf73815b04d3d3d214adc1d5176daa81916e8f.tar.bz2
scala-10cf73815b04d3d3d214adc1d5176daa81916e8f.zip
fix #2268
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala6
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala6
-rw-r--r--test/files/run/names-defaults.check5
-rw-r--r--test/files/run/names-defaults.scala6
4 files changed, 21 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 8f91c823aa..d7c5ed2b33 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -1007,7 +1007,11 @@ trait Namers { self: Analyzer =>
}
}
- val defTpt = subst(copyUntyped(vparam.tpt))
+ val defTpt = subst(copyUntyped(vparam.tpt match {
+ // default getter for by-name params
+ case AppliedTypeTree(_, List(arg)) if sym.hasFlag(BYNAMEPARAM) => arg
+ case t => t
+ }))
val defRhs = copyUntyped(vparam.rhs)
val defaultTree = atPos(vparam.pos.focus) {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index fef0dd0282..d9471c6008 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1412,7 +1412,11 @@ trait Typers { self: Analyzer =>
else if (sym1.isSkolem) matches(sym, sym1.deSkolemize)
else super[SubstTypeMap].matches(sym, sym1)
}
- subst(tpt1.tpe)
+ // allow defaults on by-name parameters
+ if (sym hasFlag BYNAMEPARAM)
+ if (tpt1.tpe.typeArgs.isEmpty) WildcardType // during erasure tpt1 is Funciton0
+ else subst(tpt1.tpe.typeArgs(0))
+ else subst(tpt1.tpe)
} else tpt1.tpe
newTyper(typer1.context.make(vdef, sym)).transformedOrTyped(vdef.rhs, tpt2)
}
diff --git a/test/files/run/names-defaults.check b/test/files/run/names-defaults.check
index e9381760ce..937f95962b 100644
--- a/test/files/run/names-defaults.check
+++ b/test/files/run/names-defaults.check
@@ -72,6 +72,11 @@ get: 1
get: 2
get: 2
3
+0
+get: 20
+get: 20
+20
+0
dlkfj0dlkfj102
lskf2dkflj2
dlkd5nixda10nixdadklfj1dklfj
diff --git a/test/files/run/names-defaults.scala b/test/files/run/names-defaults.scala
index 1d737bb0c7..8e8c8a1e4a 100644
--- a/test/files/run/names-defaults.scala
+++ b/test/files/run/names-defaults.scala
@@ -127,6 +127,12 @@ object Test extends Application {
def bn2(a: Int, b: => Int)(c: Int = b) = a + b
println(bn2(b = get(2), a = get(1))()) // should get: 1, 2, 2
+ def bn3(a: => Int = get(10)) = 0
+ def bn4(a: => Int = get(20)) = {a; a}
+ println(bn3())
+ println(bn4())
+ println(bn4(a = 0))
+
// constructors
val a1 = new A(b = "dlkfj")(d = 102)