diff options
author | Martin Odersky <odersky@gmail.com> | 2006-03-27 17:27:51 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-03-27 17:27:51 +0000 |
commit | a959828b60b7bacbdeff23f0ac1b7304d416df54 (patch) | |
tree | e8ba00a1729697d096a5bf50ad2081b5bf344ccb /src | |
parent | 20978ce7ae2c5db051cea483f2247c30f0e816ec (diff) | |
download | scala-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.scala | 50 |
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] = { |