summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2010-04-13 17:37:24 +0000
committerMartin Odersky <odersky@gmail.com>2010-04-13 17:37:24 +0000
commit765864526dc6c68ca38085b3c521f2e7171e8047 (patch)
tree8c39cf75fa561d110f24a77f5edd3a2701d40165 /src/compiler
parent9024ffbfbfee948388595936a68a74bfe9ce1fb0 (diff)
downloadscala-765864526dc6c68ca38085b3c521f2e7171e8047.tar.gz
scala-765864526dc6c68ca38085b3c521f2e7171e8047.tar.bz2
scala-765864526dc6c68ca38085b3c521f2e7171e8047.zip
attempted fix for the TypeSkolem problem under ...
attempted fix for the TypeSkolem problem under specialize.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala2
-rw-r--r--src/compiler/scala/tools/nsc/Phase.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala18
3 files changed, 19 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 3e54b68daf..16bff5d399 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -255,6 +255,8 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
override def flatClasses: Boolean = isFlat
private val isDevirtualized = prev.name == "devirtualize" || prev.devirtualized
override def devirtualized: Boolean = isDevirtualized // (part of DEVIRTUALIZE)
+ private val isSpecialized = prev.name == "specialize" || prev.specialized
+ override def specialized: Boolean = isSpecialized
/** Is current phase cancelled on this unit? */
def cancelled(unit: CompilationUnit) =
diff --git a/src/compiler/scala/tools/nsc/Phase.scala b/src/compiler/scala/tools/nsc/Phase.scala
index cd5a399c12..98f0f840ff 100644
--- a/src/compiler/scala/tools/nsc/Phase.scala
+++ b/src/compiler/scala/tools/nsc/Phase.scala
@@ -34,6 +34,7 @@ abstract class Phase(val prev: Phase) {
// Will running with -Ycheck:name work?
def checkable: Boolean = true
def devirtualized: Boolean = false
+ def specialized: Boolean = false
def erasedTypes: Boolean = false
def flatClasses: Boolean = false
def keepsTypeParams = true
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 2cd690fbbf..7af61a009f 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -3801,6 +3801,19 @@ A type's typeSymbol should never be inspected directly.
private def isUnifiable(pre1: Type, pre2: Type) =
(beginsWithTypeVarOrIsRefined(pre1) || beginsWithTypeVarOrIsRefined(pre2)) && (pre1 =:= pre2)
+ /** Returns true iff we are past phase specialize,
+ * sym1 and sym2 are two existential skolems with equal names and bounds,
+ * and pre1 and pre2 are equal prefixes
+ */
+ private def isSameSpecializedSkolem(sym1: Symbol, sym2: Symbol, pre1: Type, pre2: Type) = {
+ sym1.isExistentialSkolem && sym2.isExistentialSkolem &&
+ util.trace("is same specialized skolem "+sym1+" "+sym2+" at "+phase+phase.specialized+" ?") {
+ sym1.name == sym2.name &&
+ phase.specialized &&
+ sym1.info =:= sym2.info
+ pre1 =:= pre2
+ }}
+
private def equalSymsAndPrefixes(sym1: Symbol, pre1: Type, sym2: Symbol, pre2: Type): Boolean =
if (sym1 == sym2) sym1.hasFlag(PACKAGE) || phase.erasedTypes || pre1 =:= pre2
else (sym1.name == sym2.name) && isUnifiable(pre1, pre2)
@@ -4264,8 +4277,9 @@ A type's typeSymbol should never be inspected directly.
val pre1 = tr1.pre
val pre2 = tr2.pre
(((if (sym1 == sym2) phase.erasedTypes || pre1 <:< pre2
- else (sym1.name == sym2.name && isUnifiable(pre1, pre2))) &&
- isSubArgs(tr1.args, tr2.args, sym1.typeParams))
+ else (sym1.name == sym2.name &&
+ (isUnifiable(pre1, pre2) || isSameSpecializedSkolem(sym1, sym2, pre1, pre2)))) &&
+ isSubArgs(tr1.args, tr2.args, sym1.typeParams))
||
sym2.isClass && {
val base = tr1 baseType sym2