diff options
author | Iulian Dragos <jaguarul@gmail.com> | 2011-01-05 17:37:24 +0000 |
---|---|---|
committer | Iulian Dragos <jaguarul@gmail.com> | 2011-01-05 17:37:24 +0000 |
commit | 86044e0e548442024af79b7076c02df59473792d (patch) | |
tree | 5ff235c6965e512c808f3886d56fca556844d6a4 /src/compiler | |
parent | 66c9b6a949da26ac31119ed1c4cd57d3d637cc0f (diff) | |
download | scala-86044e0e548442024af79b7076c02df59473792d.tar.gz scala-86044e0e548442024af79b7076c02df59473792d.tar.bz2 scala-86044e0e548442024af79b7076c02df59473792d.zip |
Fixed a bad interaction between overloading, de...
Fixed a bad interaction between overloading, default parameters and
specialization. Closes #3896, no review.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index 5f4a90b84b..387f069875 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -416,6 +416,13 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { def enterMember(sym: Symbol): Symbol = { typeEnv(sym) = fullEnv ++ typeEnv(sym) // append the full environment sym.setInfo(sym.info.substThis(clazz, ThisType(cls)).subst(oldClassTParams, newClassTParams map (_.tpe))) + + // we remove any default parameters. At this point, they have been all + // resolved by the type checker. Later on, erasure re-typechecks everything and + // chokes if it finds default parameters for specialized members, even though + // they are never needed. + sym.info.paramss.flatten foreach (_.resetFlag(DEFAULTPARAM)) + decls1.enter(subst(fullEnv)(sym)) } @@ -1052,7 +1059,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { log("[specSym] checking for rerouting: %s with \n\tsym.tpe: %s, \n\ttree.tpe: %s \n\tenv: %s \n\tname: %s" .format(tree, symbol.tpe, tree.tpe, env, specializedName(symbol, env))) if (!env.isEmpty) { // a method? - val specMember = qual.tpe.member(specializedName(symbol, env)) + val specMember = qual.tpe.member(specializedName(symbol, env)) suchThat (_.tpe =:= qual.tpe) if (specMember ne NoSymbol) if (typeEnv(specMember) == env) Some(specMember) else { @@ -1135,8 +1142,8 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { } else overloads(symbol).find(_.sym.info =:= symbol.info) match { case Some(specMember) => val qual1 = transform(qual) - if (settings.debug.value) log("** routing " + tree + " to " + specMember.sym.fullName + " tree: " + Select(qual1, specMember.sym.name)) - localTyper.typedOperator(atPos(tree.pos)(Select(qual1, specMember.sym.name))) + if (settings.debug.value) log("** routing " + tree + " to " + specMember.sym.fullName + " tree: " + Select(qual1, specMember.sym)) + localTyper.typedOperator(atPos(tree.pos)(Select(qual1, specMember.sym))) case None => super.transform(tree) } |