From fe52cb070db7321ab515c4758daa4f9bd187608a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Mon, 10 Aug 2009 15:28:12 +0000 Subject: Fixed #1642 --- src/compiler/scala/tools/nsc/symtab/Types.scala | 11 +++++++++++ src/compiler/scala/tools/nsc/transform/Erasure.scala | 4 ++-- test/files/neg/implicits.scala | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 5375f77569..c2f915e570 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -191,6 +191,7 @@ trait Types { override def instantiateTypeParams(formals: List[Symbol], actuals: List[Type]) = underlying.instantiateTypeParams(formals, actuals) override def skolemizeExistential(owner: Symbol, origin: AnyRef) = underlying.skolemizeExistential(owner, origin) override def normalize = maybeRewrap(underlying.normalize) + override def dealias = maybeRewrap(underlying.dealias) override def cloneInfo(owner: Symbol) = maybeRewrap(underlying.cloneInfo(owner)) override def prefixString = underlying.prefixString override def isComplete = underlying.isComplete @@ -348,6 +349,9 @@ trait Types { /** Reduce to beta eta-long normal form. Expands type aliases and converts higher-kinded TypeRef's to PolyTypes. @M */ def normalize = this // @MAT + /** Expands type aliases. */ + def dealias = this + /** Is this type produced as a repair for an error? */ def isError: Boolean = typeSymbol.isError || termSymbol.isError @@ -1493,6 +1497,13 @@ A type's typeSymbol should never be inspected directly. private var normalized: Type = null + override def dealias: Type = + if (sym.isAliasType && sym.info.typeParams.length == args.length) { + val xform = transform(sym.info.resultType) + assert(xform ne this, this) + xform.dealias + } else this + def normalize0: Type = if (sym.isAliasType) { // beta-reduce if (sym.info.typeParams.length == args.length || !isHigherKinded) { diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 806b054ee6..4da5a59789 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -168,7 +168,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. def jsig(tp: Type): String = jsig2(false, List(), tp) def jsig2(toplevel: Boolean, tparams: List[Symbol], tp0: Type): String = { - val tp = tp0.normalize + val tp = tp0.dealias tp match { case st: SubType => jsig2(toplevel, tparams, st.supertype) @@ -251,7 +251,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. } if (needsJavaSig(info)) { try { - //println("Java sig of "+sym+" is "+jsig2(true, List(), sym.info))//DEBUG + println("Java sig of "+sym+" is "+jsig2(true, List(), sym.info))//DEBUG Some(jsig2(true, List(), info)) } catch { case ex: UnknownSig => None diff --git a/test/files/neg/implicits.scala b/test/files/neg/implicits.scala index 710ffc94fc..056e0be6ca 100644 --- a/test/files/neg/implicits.scala +++ b/test/files/neg/implicits.scala @@ -20,3 +20,20 @@ object Test { def f(x: int): int = x f(p+1) } + +object test2 { + sealed trait HMap { + def +[T](v: T) = HSome(v,this) + } + + final case class HSome[T, L <: HMap](head: T, tail: L) extends HMap + + final object HEmpty extends HMap + + val set = HEmpty + 3 + "3" + implicit def select[T](t: HSome[T,_]) = t.head + implicit def selectTail[L](t: HSome[_,L]) = t.tail + + def foo(x: Int) = 3 + foo(set) +} -- cgit v1.2.3