summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-03-27 17:27:51 +0000
committerMartin Odersky <odersky@gmail.com>2006-03-27 17:27:51 +0000
commita959828b60b7bacbdeff23f0ac1b7304d416df54 (patch)
treee8ba00a1729697d096a5bf50ad2081b5bf344ccb /src
parent20978ce7ae2c5db051cea483f2247c30f0e816ec (diff)
downloadscala-a959828b60b7bacbdeff23f0ac1b7304d416df54.tar.gz
scala-a959828b60b7bacbdeff23f0ac1b7304d416df54.tar.bz2
scala-a959828b60b7bacbdeff23f0ac1b7304d416df54.zip
fixed bug 556
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala50
1 files changed, 27 insertions, 23 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 8e3716981e..d5e4320f19 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -23,7 +23,7 @@ trait Typers requires Analyzer {
var implcnt = 0
var impltime = 0l
- final val xviews = true
+ final val xviews = false
private val transformed = new HashMap[Tree, Tree]
@@ -903,29 +903,33 @@ trait Typers requires Analyzer {
val Triple(clazz, argpts, respt) =
decompose(if (pt.symbol isSubClass TypedCodeClass) pt.typeArgs.head else pt)
- val vparamSyms = List.map2(fun.vparams, argpts) { (vparam, argpt) =>
- if (vparam.tpt.isEmpty)
- vparam.tpt.tpe =
- if (argpt == NoType) { error(vparam.pos, "missing parameter type"); ErrorType }
- else argpt
- namer.enterSym(vparam)
- vparam.symbol
- }
- val vparams = List.mapConserve(fun.vparams)(typedValDef)
- for (val vparam <- vparams) {
- checkNoEscaping.locals(context.scope, WildcardType, vparam.tpt); ()
+ if (fun.vparams.length != argpts.length)
+ errorTree(fun, "wrong number of parameters; expected = "+argpts.length)
+ else {
+ val vparamSyms = List.map2(fun.vparams, argpts) { (vparam, argpt) =>
+ if (vparam.tpt.isEmpty)
+ vparam.tpt.tpe =
+ if (argpt == NoType) { error(vparam.pos, "missing parameter type"); ErrorType }
+ else argpt
+ namer.enterSym(vparam)
+ vparam.symbol
+ }
+ val vparams = List.mapConserve(fun.vparams)(typedValDef)
+ for (val vparam <- vparams) {
+ checkNoEscaping.locals(context.scope, WildcardType, vparam.tpt); ()
+ }
+ val body = checkNoEscaping.locals(context.scope, respt, typed(fun.body, respt))
+ val formals = vparamSyms map (.tpe)
+ val restpe = body.tpe.deconst
+ val funtpe = typeRef(clazz.tpe.prefix, clazz, formals ::: List(restpe))
+ val fun1 = copy.Function(fun, vparams, checkNoEscaping.locals(context.scope, restpe, body))
+ .setType(funtpe)
+ if (pt.symbol isSubClass TypedCodeClass) typed(atPos(fun.pos)(codify(fun1)))
+ // last line should be:
+ // if (pt.symbol isSubClass TypedCodeClass) typed(atPos(fun.pos)(Code(fun1)))
+ // except that we have to think how to preserve attributes
+ else fun1
}
- val body = checkNoEscaping.locals(context.scope, respt, typed(fun.body, respt))
- val formals = vparamSyms map (.tpe)
- val restpe = body.tpe.deconst
- val funtpe = typeRef(clazz.tpe.prefix, clazz, formals ::: List(restpe))
- val fun1 = copy.Function(fun, vparams, checkNoEscaping.locals(context.scope, restpe, body))
- .setType(funtpe)
- if (pt.symbol isSubClass TypedCodeClass) typed(atPos(fun.pos)(codify(fun1)))
- // last line should be:
- // if (pt.symbol isSubClass TypedCodeClass) typed(atPos(fun.pos)(Code(fun1)))
- // except that we have to think how to preserve attributes
- else fun1
}
def typedRefinement(stats: List[Tree]): List[Tree] = {