summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2011-01-05 17:37:24 +0000
committerIulian Dragos <jaguarul@gmail.com>2011-01-05 17:37:24 +0000
commit86044e0e548442024af79b7076c02df59473792d (patch)
tree5ff235c6965e512c808f3886d56fca556844d6a4 /src/compiler
parent66c9b6a949da26ac31119ed1c4cd57d3d637cc0f (diff)
downloadscala-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.scala13
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)
}