summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-12-12 05:44:53 -0800
committerJason Zaugg <jzaugg@gmail.com>2013-12-12 05:44:53 -0800
commitfcf1adad75553d25ea4e6afe37c971902b11f35e (patch)
tree15415858005bd3bc59dda8350955917f9f0330d0
parent312f45d437e48a47f16cb3fe276485adc38345ac (diff)
parent369f370b1e894893d315de3bd861c9292695f71d (diff)
downloadscala-fcf1adad75553d25ea4e6afe37c971902b11f35e.tar.gz
scala-fcf1adad75553d25ea4e6afe37c971902b11f35e.tar.bz2
scala-fcf1adad75553d25ea4e6afe37c971902b11f35e.zip
Merge pull request #3241 from retronym/ticket/8054
SI-8054 Fix regression in TypeRef rebind with val overriding object
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala13
-rw-r--r--test/files/pos/t8054.scala31
2 files changed, 39 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index e483fa6ba8..99e6ae633f 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -3392,11 +3392,14 @@ 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 =>
- // 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
+ else pre.nonPrivateMember(sym.name).suchThat { sym =>
+ // SI-7928 `isModuleNotMethod` is here to avoid crashing with spuriously "overloaded" module accessor and module symbols.
+ // These appear after refchecks eliminates ModuleDefs that implement an interface.
+ // Here, we exclude the module symbol, which allows us to bind to the accessor.
+ // SI-8054 We must only do this after refchecks, otherwise we exclude the module symbol which does not yet have an accessor!
+ val isModuleWithAccessor = phase.refChecked && sym.isModuleNotMethod
+ sym.isType || (!isModuleWithAccessor && 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/t8054.scala b/test/files/pos/t8054.scala
new file mode 100644
index 0000000000..a7bb44b1ed
--- /dev/null
+++ b/test/files/pos/t8054.scala
@@ -0,0 +1,31 @@
+trait D {
+ trait Manifest {
+ class Entry
+ }
+
+ val M: Manifest
+
+ def m: M.Entry = ???
+}
+
+object D1 extends D {
+ object M extends Manifest
+}
+
+object D2 extends D {
+ val M: Manifest = ???
+}
+
+object Hello {
+
+ def main(args: Array[String]) {
+ // 2.10.3 - ok
+ // 2.11.0-M7 - type mismatch; found : Seq[DB1.MANIFEST.Entry]
+ // required: Seq[DB1.MANIFEST.Entry]
+ val t1: D1.M.Entry = D1.m
+
+ // 2.10.3 - ok
+ // 2.11.0-M7 - ok
+ val t2: D2.M.Entry = D2.m
+ }
+}