summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/Trees.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-01-09 14:53:08 +0100
committerJason Zaugg <jzaugg@gmail.com>2013-01-26 14:49:04 +0100
commit7babdab9ace07884ce844af923c93e0dcd49f7ea (patch)
tree4c02c41d5551de0104a7b055509b8e4d8979b594 /src/reflect/scala/reflect/internal/Trees.scala
parentcff09340327ddcfd3d39aca69dfb719e7a501b5f (diff)
downloadscala-7babdab9ace07884ce844af923c93e0dcd49f7ea.tar.gz
scala-7babdab9ace07884ce844af923c93e0dcd49f7ea.tar.bz2
scala-7babdab9ace07884ce844af923c93e0dcd49f7ea.zip
SI-6891 Fix value class + tailrec crasher.
rhs.substituteSymbols(old, new) leaves us with: def loop#12225(x#12226: A#15491): scala#21.this.Unit#1615 = loop#12225(x#12226) In which the TermSymbol x#12226 has a stale info, pointing at the A#7274, the class type parameter, rather than A#15491, the corresponding type parameter of the synthetic backing method. I've improved `TreeSymSubstituter` to substitute not only `Tree#{tpe, symbol}`, but also `DefTree#sym.info`. The `pos` test that triggered the new code path are listed here: https://gist.github.com/4575687 AFAICS, no special treatment of Function, Return, or Import is needed in TreeSymSubstutor.
Diffstat (limited to 'src/reflect/scala/reflect/internal/Trees.scala')
-rw-r--r--src/reflect/scala/reflect/internal/Trees.scala16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala
index 62998ef6cb..a528a9ced8 100644
--- a/src/reflect/scala/reflect/internal/Trees.scala
+++ b/src/reflect/scala/reflect/internal/Trees.scala
@@ -1440,6 +1440,22 @@ trait Trees extends api.Trees { self: SymbolTable =>
if (tree.hasSymbol) {
subst(from, to)
tree match {
+ case _: DefTree =>
+ val newInfo = symSubst(tree.symbol.info)
+ if (!(newInfo =:= tree.symbol.info)) {
+ debuglog(sm"""
+ |TreeSymSubstituter: updated info of symbol ${tree.symbol}
+ | Old: ${showRaw(tree.symbol.info, printTypes = true, printIds = true)}
+ | New: ${showRaw(newInfo, printTypes = true, printIds = true)}""")
+ tree.symbol updateInfo newInfo
+ }
+ case _ =>
+ // no special handling is required for Function or Import nodes here.
+ // as they don't have interesting infos attached to their symbols.
+ // Subsitution of the referenced symbol of Return nodes is handled
+ // in .ChangeOwnerTraverser
+ }
+ tree match {
case Ident(name0) if tree.symbol != NoSymbol =>
treeCopy.Ident(tree, tree.symbol.name)
case Select(qual, name0) if tree.symbol != NoSymbol =>