diff options
author | Martin Odersky <odersky@gmail.com> | 2011-03-05 18:10:07 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-03-05 18:10:07 +0000 |
commit | ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e (patch) | |
tree | 5ed570b12f13de148485aed46ef5ccd3f6e47fb6 | |
parent | 2cc16420f3435b910dabdf2df4c6ecd31bafd68b (diff) | |
download | scala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.tar.gz scala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.tar.bz2 scala-ff0dd07133f4467221c74d5ccaa2f3bc9cf6383e.zip |
Fixes underlying "...
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/Trees.scala | 17 | ||||
-rw-r--r-- | test/pending/neg/t3152.scala | 8 |
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) +} |