diff options
author | Martin Odersky <odersky@gmail.com> | 2010-05-11 09:34:56 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-05-11 09:34:56 +0000 |
commit | 57a0b3d1657468c037751a2a6c833f6814ae78c0 (patch) | |
tree | 2cb41c8c6281270b7e4a4f965bd72cd3fc39852e | |
parent | e6ff7d3557fee8f3d7dcb6355dc218e8eaca13b8 (diff) | |
download | scala-57a0b3d1657468c037751a2a6c833f6814ae78c0.tar.gz scala-57a0b3d1657468c037751a2a6c833f6814ae78c0.tar.bz2 scala-57a0b3d1657468c037751a2a6c833f6814ae78c0.zip |
Closes #t3363. Review by extempore.
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 11 | ||||
-rwxr-xr-x | test/files/pos/t3363.scala | 18 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 8f1ece5b9e..dc59587c4a 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -1179,18 +1179,19 @@ trait Types extends reflect.generic.Types { self: SymbolTable => if (!isValidForBaseClasses(period)) { if (parents.exists(_.exists(_.isInstanceOf[TypeVar]))) { // rename type vars to fresh type params, take base type sequence of - // resulting type, and rename back allthe entries in thats sequence + // resulting type, and rename back all the entries in that sequence var tvs = Set[TypeVar]() for (p <- parents) for (t <- p) t match { case tv: TypeVar => tvs += tv case _ => } - val varToParamMap = (Map[Type, Symbol]() /: tvs)((m, tv) => m + (tv -> tv.origin.typeSymbol.cloneSymbol)) - val paramToVarMap = Map[Symbol, Type]() ++ (varToParamMap map { case (t, tsym) => (tsym -> t) }) + val varToParamMap: Map[Type, Symbol] = tvs map (tv => tv -> tv.origin.typeSymbol.cloneSymbol) toMap + val paramToVarMap = varToParamMap map (_.swap) + val varToParam = new TypeMap { - def apply(tp: Type): Type = tp match { - case tv: TypeVar => varToParamMap(tp).tpe + def apply(tp: Type) = varToParamMap get tp match { + case Some(sym) => sym.tpe case _ => mapOver(tp) } } diff --git a/test/files/pos/t3363.scala b/test/files/pos/t3363.scala new file mode 100755 index 0000000000..bae54084ea --- /dev/null +++ b/test/files/pos/t3363.scala @@ -0,0 +1,18 @@ +object TestCase { + + //now matter if you put (abstract) class or trait it will fail in all cases + trait MapOps[T] + + //if fs was reduced to List (generic type with one parameter) then the code compiles + //if you inherit from MapOps[T] instead of MapOps[F] then code compiles fine + implicit def map2ops[T,F](fs: Map[T,F]) = new MapOps[F] { + //if you remove this line, then code compiles + lazy val m: Manifest[T] = error("just something to make it compile") + def is(xs: List[T]) = List(xs) + } + + def main(args: Array[String]) { + println(Map(1 -> "2") is List(2)) + } + + } |