summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2009-03-02 15:51:07 +0000
committerPaul Phillips <paulp@improving.org>2009-03-02 15:51:07 +0000
commit3d96a4aa3230a5e1558378b409e84a65f85ac107 (patch)
treea8fdb6d95cd31ce61e64e9b9d2d9d93296cc1f65
parent9fc30e17b2b6550850933b499a211bb7532ff51b (diff)
downloadscala-3d96a4aa3230a5e1558378b409e84a65f85ac107.tar.gz
scala-3d96a4aa3230a5e1558378b409e84a65f85ac107.tar.bz2
scala-3d96a4aa3230a5e1558378b409e84a65f85ac107.zip
Fix and test case for #1107, many long days in ...
Fix and test case for #1107, many long days in the making. If you fully understand why this change causes #1107 to work I implore you to add a comment or two to Symbols.scala.
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternNodes.scala5
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala3
-rw-r--r--test/files/pos/t1107/O.scala13
-rw-r--r--test/files/pos/t1107/T.scala7
4 files changed, 25 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/PatternNodes.scala b/src/compiler/scala/tools/nsc/matching/PatternNodes.scala
index 53dcdc1bb6..83fb17c213 100644
--- a/src/compiler/scala/tools/nsc/matching/PatternNodes.scala
+++ b/src/compiler/scala/tools/nsc/matching/PatternNodes.scala
@@ -83,9 +83,10 @@ trait PatternNodes {
def cmp(other: Type): TypeComparison = TypeComparison(tpe, tpeWRTEquality(other))
def coversSym(sym: Symbol) = {
+ lazy val lmoc = sym.linkedModuleOfClass
val symtpe =
- if ((sym hasFlag Flags.MODULE) && (sym.linkedModuleOfClass ne NoSymbol))
- singleType(sym.tpe.prefix, sym.linkedModuleOfClass) // e.g. None, Nil
+ if ((sym hasFlag Flags.MODULE) && (lmoc ne NoSymbol))
+ singleType(sym.tpe.prefix, lmoc) // e.g. None, Nil
else sym.tpe
(tpe.typeSymbol == sym) ||
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index 47048f2acc..0e91e1b5bb 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -1029,7 +1029,8 @@ trait Symbols {
*/
final def linkedClassOfModule: Symbol = {
if (this != NoSymbol)
- owner.info.decl(name.toTypeName).suchThat(_ isCoDefinedWith this)
+ owner.rawInfo.decl(name.toTypeName).suchThat(
+ sym => !sym.hasFlag(MODULE) && (sym isCoDefinedWith this))
else NoSymbol
}
diff --git a/test/files/pos/t1107/O.scala b/test/files/pos/t1107/O.scala
new file mode 100644
index 0000000000..ffc2f767a8
--- /dev/null
+++ b/test/files/pos/t1107/O.scala
@@ -0,0 +1,13 @@
+object O
+{
+ def d(t: Top) = t match {
+ case s: Sub => true
+ case _ => false
+ }
+
+ def main(args: Array[String]): Unit = {
+ val c = new AnyRef with C
+
+ c.bob.toString + c.bob2.toString
+ }
+} \ No newline at end of file
diff --git a/test/files/pos/t1107/T.scala b/test/files/pos/t1107/T.scala
new file mode 100644
index 0000000000..583ee11c0a
--- /dev/null
+++ b/test/files/pos/t1107/T.scala
@@ -0,0 +1,7 @@
+sealed trait Top
+sealed trait Sub extends Top
+trait C {
+ private object P extends Sub
+ def bob() = P.getClass
+ def bob2() = O.d(P)
+} \ No newline at end of file