summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-10-25 10:11:39 -0700
committerJason Zaugg <jzaugg@gmail.com>2013-10-25 10:11:39 -0700
commit3eee4b7c4419df007a4c089acb4aa6304a9a2970 (patch)
treebb05be0c4eb64b4ea1c8fa2b10537a833c452d1d
parenta06afaf08d67b7519718f5ef6765a8c98e104145 (diff)
parent80767383fdc52a444295fdc2ab5f4b9fbfa1c352 (diff)
downloadscala-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.scala6
-rw-r--r--test/files/pos/t7928.scala16
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]
+ }
+}