diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-10-25 10:11:39 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-10-25 10:11:39 -0700 |
commit | 3eee4b7c4419df007a4c089acb4aa6304a9a2970 (patch) | |
tree | bb05be0c4eb64b4ea1c8fa2b10537a833c452d1d | |
parent | a06afaf08d67b7519718f5ef6765a8c98e104145 (diff) | |
parent | 80767383fdc52a444295fdc2ab5f4b9fbfa1c352 (diff) | |
download | scala-3eee4b7c4419df007a4c089acb4aa6304a9a2970.tar.gz scala-3eee4b7c4419df007a4c089acb4aa6304a9a2970.tar.bz2 scala-3eee4b7c4419df007a4c089acb4aa6304a9a2970.zip |
Merge pull request #3073 from retronym/ticket/7928
Favour module accessors symbols in rebind
-rw-r--r-- | src/reflect/scala/reflect/internal/Types.scala | 6 | ||||
-rw-r--r-- | test/files/pos/t7928.scala | 16 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala index 204a2e7088..59d1e13142 100644 --- a/src/reflect/scala/reflect/internal/Types.scala +++ b/src/reflect/scala/reflect/internal/Types.scala @@ -3385,7 +3385,11 @@ trait Types /** Rebind symbol `sym` to an overriding member in type `pre`. */ private def rebind(pre: Type, sym: Symbol): Symbol = { if (!sym.isOverridableMember || sym.owner == pre.typeSymbol) sym - else pre.nonPrivateMember(sym.name).suchThat(sym => sym.isType || (sym.isStable && !sym.hasVolatileType)) orElse sym + else pre.nonPrivateMember(sym.name).suchThat(sym => + // SI-7928 `isModuleNotMethod` is here to avoid crashing with overloaded module accessor and module symbols + // after refchecks eliminates a ModuleDef that implements and interface. + sym.isType || (!sym.isModuleNotMethod && sym.isStable && !sym.hasVolatileType) + ) orElse sym } /** Convert a `super` prefix to a this-type if `sym` is abstract or final. */ diff --git a/test/files/pos/t7928.scala b/test/files/pos/t7928.scala new file mode 100644 index 0000000000..d9e29935b3 --- /dev/null +++ b/test/files/pos/t7928.scala @@ -0,0 +1,16 @@ +trait OuterTrait { + trait InnerTrait { + type Element + type Collection <: Iterable[Inner.Element] + } + + val Inner: InnerTrait + +} + +object OuterObject extends OuterTrait { + object Inner extends InnerTrait { + type Element = String + override type Collection = Seq[Inner.Element] + } +} |