diff options
author | Martin Odersky <odersky@gmail.com> | 2015-08-21 15:08:47 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-08-21 15:08:47 +0200 |
commit | aaae0df80376668d1c502857695b43d42083c888 (patch) | |
tree | 83aba7b1a390563c26b79a7f5cbfdc4b47a8a66b /src/dotty/tools/dotc/transform/ResolveSuper.scala | |
parent | cc5dce545e1150021bcd3d312574bdf3b657512c (diff) | |
download | dotty-aaae0df80376668d1c502857695b43d42083c888.tar.gz dotty-aaae0df80376668d1c502857695b43d42083c888.tar.bz2 dotty-aaae0df80376668d1c502857695b43d42083c888.zip |
Workaround for #765
Avoid using unexpanded name because it can give wrong results for super accessors
of symbolic names. See #765. Without this commit t2183.scala crashes the compiler.
Diffstat (limited to 'src/dotty/tools/dotc/transform/ResolveSuper.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/ResolveSuper.scala | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/transform/ResolveSuper.scala b/src/dotty/tools/dotc/transform/ResolveSuper.scala index c699476bb..26128cf33 100644 --- a/src/dotty/tools/dotc/transform/ResolveSuper.scala +++ b/src/dotty/tools/dotc/transform/ResolveSuper.scala @@ -59,9 +59,13 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th private def rebindSuper(base: Symbol, acc: Symbol)(implicit ctx: Context): Symbol = { var bcs = base.info.baseClasses.dropWhile(acc.owner != _).tail var sym: Symbol = NoSymbol - val originalAccName = - if (acc.is(ExpandedName)) acc.name.unexpandedName else acc.name - val SuperAccessorName(memberName) = originalAccName: Name // dotty deviation: ": Name" needed otherwise pattern type is neither a subtype nor a supertype of selector type + val unexpandedAccName = + if (acc.is(ExpandedName)) // Cannot use unexpandedName because of #765. t2183.scala would fail if we did. + acc.name + .drop(acc.name.indexOfSlice(nme.EXPAND_SEPARATOR ++ nme.SUPER_PREFIX)) + .drop(nme.EXPAND_SEPARATOR.length) + else acc.name + val SuperAccessorName(memberName) = unexpandedAccName: Name // dotty deviation: ": Name" needed otherwise pattern type is neither a subtype nor a supertype of selector type ctx.debuglog(i"starting rebindsuper from $base of ${acc.showLocated}: ${acc.info} in $bcs, name = $memberName") while (bcs.nonEmpty && sym == NoSymbol) { val other = bcs.head.info.nonPrivateDecl(memberName) |