summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-03-14 10:40:43 +0000
committerMartin Odersky <odersky@gmail.com>2007-03-14 10:40:43 +0000
commita1e615c9253d9caad1385e163e271510c3c798b5 (patch)
treec59a3d89da15a7b8fa315a52df2e7fe3c3f8ea3d
parent2bca03b1f530b69874e45aa07e51f6aeacc28a40 (diff)
downloadscala-a1e615c9253d9caad1385e163e271510c3c798b5.tar.gz
scala-a1e615c9253d9caad1385e163e271510c3c798b5.tar.bz2
scala-a1e615c9253d9caad1385e163e271510c3c798b5.zip
re-fixed bug 1000
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala8
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala12
2 files changed, 18 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala
index 487cfb312c..3f82afde11 100644
--- a/src/compiler/scala/tools/nsc/symtab/Types.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Types.scala
@@ -305,6 +305,10 @@ trait Types requires SymbolTable {
*/
def matches(that: Type): boolean = matchesType(this, that, !phase.erasedTypes)
+ /** Same as matches, except that non-method types are always assumed to match.
+ */
+ def looselyMatches(that: Type): boolean = matchesType(this, that, true)
+
/** The shortest sorted upwards closed array of types that contains
* this type as first element.
*
@@ -447,7 +451,7 @@ trait Types requires SymbolTable {
member.owner != sym.owner &&
!sym.hasFlag(PRIVATE) && {
if (self eq null) self = this.narrow;
- matchesType(self.memberType(member), self.memberType(sym), !phase.erasedTypes)
+ (self.memberType(member) matches self.memberType(sym))
})) {
members = newScope(List(member, sym))
}
@@ -458,7 +462,7 @@ trait Types requires SymbolTable {
prevEntry.sym.owner != sym.owner &&
!sym.hasFlag(PRIVATE) && {
if (self eq null) self = this.narrow;
- matchesType(self.memberType(prevEntry.sym), self.memberType(sym), !phase.erasedTypes)
+ (self.memberType(prevEntry.sym) matches self.memberType(sym))
})) {
prevEntry = members lookupNextEntry prevEntry
}
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index d0150971a1..72639afa6f 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -484,6 +484,18 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
copy.Match(tree1, selector, cases map adaptCase)
case Try(block, catches, finalizer) =>
copy.Try(tree1, adaptBranch(block), catches map adaptCase, finalizer)
+ case Ident(_) | Select(_, _) =>
+ if (tree1.symbol hasFlag OVERLOADED) {
+ val first = tree1.symbol.alternatives.head
+ val sym1 = tree1.symbol.filter {
+ alt => alt == first || !(first.tpe looselyMatches alt.tpe)
+ }
+ if (tree.symbol ne sym1) {
+ tree1.symbol = sym1
+ tree1.tpe = sym1.tpe
+ }
+ }
+ tree1
case _ =>
tree1
}