summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-08-10 15:28:12 +0000
committerMartin Odersky <odersky@gmail.com>2009-08-10 15:28:12 +0000
commitfe52cb070db7321ab515c4758daa4f9bd187608a (patch)
treeee89343201b399980ce3cfef997523b5942276d8
parent1e15c075c1ae03cf1d356e45606894efdc57093a (diff)
downloadscala-fe52cb070db7321ab515c4758daa4f9bd187608a.tar.gz
scala-fe52cb070db7321ab515c4758daa4f9bd187608a.tar.bz2
scala-fe52cb070db7321ab515c4758daa4f9bd187608a.zip
Fixed #1642
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala11
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala4
-rw-r--r--test/files/neg/implicits.scala17
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)
+}