summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/reflect/internal/Types.scala21
-rw-r--r--test/files/pos/t5313.scala30
2 files changed, 40 insertions, 11 deletions
diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala
index 02e11ddd59..a839e44182 100644
--- a/src/compiler/scala/reflect/internal/Types.scala
+++ b/src/compiler/scala/reflect/internal/Types.scala
@@ -749,12 +749,18 @@ trait Types extends api.Types { self: SymbolTable =>
def substThis(from: Symbol, to: Symbol): Type =
substThis(from, to.thisType)
- /** Performs both substThis and substSym in one traversal.
+ /** Performs both substThis and substSym, in that order.
+ *
+ * [JZ] Reverted `SubstThisAndSymMap` from 334872, which was not the same as
+ * `substThis(from, to).substSym(symsFrom, symsTo)`.
+ *
+ * `SubstThisAndSymMap` performs a breadth-first map over this type, which meant that
+ * symbol substitution occured before `ThisType` substitution. Consequently, in substitution
+ * of a `SingleType(ThisType(`from`), sym), symbols were rebound to `from` rather than `to`.
*/
- def substThisAndSym(from: Symbol, to: Type, symsFrom: List[Symbol], symsTo: List[Symbol]): Type = {
+ def substThisAndSym(from: Symbol, to: Type, symsFrom: List[Symbol], symsTo: List[Symbol]): Type =
if (symsFrom eq symsTo) substThis(from, to)
- else new SubstThisAndSymMap(from, to, symsFrom, symsTo) apply this
- }
+ else substThis(from, to).substSym(symsFrom, symsTo)
/** Returns all parts of this type which satisfy predicate `p` */
def filter(p: Type => Boolean): List[Type] = new FilterTypeCollector(p) collect this
@@ -4518,13 +4524,6 @@ trait Types extends api.Types { self: SymbolTable =>
case _ => mapOver(tp)
}
}
- class SubstThisAndSymMap(fromThis: Symbol, toThis: Type, fromSyms: List[Symbol], toSyms: List[Symbol])
- extends SubstSymMap(fromSyms, toSyms) {
- override def apply(tp: Type): Type = tp match {
- case ThisType(sym) if sym == fromThis => apply(toThis)
- case _ => super.apply(tp)
- }
- }
class SubstWildcardMap(from: List[Symbol]) extends TypeMap {
def apply(tp: Type): Type = try {
diff --git a/test/files/pos/t5313.scala b/test/files/pos/t5313.scala
new file mode 100644
index 0000000000..e77b73ca4c
--- /dev/null
+++ b/test/files/pos/t5313.scala
@@ -0,0 +1,30 @@
+object DepBug {
+ class A {
+ class B
+ def mkB = new B
+ def m(b : B) = b
+ }
+
+ trait Dep {
+ val a : A
+ val b : a.B
+ }
+
+ val dep = new Dep {
+ val a = new A
+ val b = a.mkB
+ }
+
+ def useDep(d : Dep) {
+ import d._
+ a.m(b) // OK
+ }
+
+ {
+ import dep._
+ a.m(b) // OK with 2.9.1.final, error on trunk
+ }
+
+ dep.a.m(dep.b)
+
+}