diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-01-09 14:53:08 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-01-26 14:49:04 +0100 |
commit | 7babdab9ace07884ce844af923c93e0dcd49f7ea (patch) | |
tree | 4c02c41d5551de0104a7b055509b8e4d8979b594 /src | |
parent | cff09340327ddcfd3d39aca69dfb719e7a501b5f (diff) | |
download | scala-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')
-rw-r--r-- | src/reflect/scala/reflect/internal/Trees.scala | 16 |
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 => |