summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-03-05 18:10:07 +0000
committerMartin Odersky <odersky@gmail.com>2011-03-05 18:10:07 +0000
commitff0dd07133f4467221c74d5ccaa2f3bc9cf6383e (patch)
tree5ed570b12f13de148485aed46ef5ccd3f6e47fb6
parent2cc16420f3435b910dabdf2df4c6ecd31bafd68b (diff)
downloadscala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.tar.gz
scala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.tar.bz2
scala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.zip
Fixes underlying "...
-rw-r--r--src/compiler/scala/tools/nsc/ast/Trees.scala17
-rw-r--r--test/pending/neg/t3152.scala8
2 files changed, 19 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala
index 90d1135517..f7c56db113 100644
--- a/src/compiler/scala/tools/nsc/ast/Trees.scala
+++ b/src/compiler/scala/tools/nsc/ast/Trees.scala
@@ -1093,10 +1093,15 @@ trait Trees extends reflect.generic.Trees { self: SymbolTable =>
def resetLocalAttrs[A<:Tree](x:A): A = { new ResetLocalAttrsTraverser().traverse(x); x }
/** A traverser which resets symbol and tpe fields of all nodes in a given tree
- * except for (1) TypeTree nodes, whose <code>.tpe</code> field is kept and
- * (2) if a <code>.symbol</code> field refers to a symbol which is defined
+ * except for (1) TypeTree nodes, whose <code>.tpe</code> field is kept, and
+ * (2) This(pkg) nodes, where pkg refers to a package symbol -- their attributes are kept, and
+ * (3) if a <code>.symbol</code> field refers to a symbol which is defined
* outside the tree, it is also kept.
*
+ * (2) is necessary because some This(pkg) are generated where pkg is not
+ * an enclosing package.n In that case, resetting the symbol would cause the
+ * next type checking run to fail. See #3152.
+ *
* (bq:) This traverser has mutable state and should be discarded after use
*/
private class ResetAttrsTraverser extends Traverser {
@@ -1108,15 +1113,15 @@ trait Trees extends reflect.generic.Trees { self: SymbolTable =>
tree match {
case _: DefTree | Function(_, _) | Template(_, _, _) =>
resetDef(tree)
- case _ =>
- if (tree.hasSymbol && isLocal(tree.symbol)) tree.symbol = NoSymbol
- }
- tree match {
+ tree.tpe = null
case tpt: TypeTree =>
if (tpt.wasEmpty) tree.tpe = null
+ case This(_) if tree.symbol != null && tree.symbol.isPackageClass =>
+ ;
case EmptyTree =>
;
case _ =>
+ if (tree.hasSymbol && isLocal(tree.symbol)) tree.symbol = NoSymbol
tree.tpe = null
}
super.traverse(tree)
diff --git a/test/pending/neg/t3152.scala b/test/pending/neg/t3152.scala
new file mode 100644
index 0000000000..27a314c484
--- /dev/null
+++ b/test/pending/neg/t3152.scala
@@ -0,0 +1,8 @@
+package test
+
+object NotEnclosing {
+ def main(args : Array[String]) : Unit = {}
+ def compare[T](x: Ordered[T], y: Ordered[T]) = error("")
+ def mkEx: Ordered[_] = error("")
+ compare(mkEx, mkEx)
+}