scala/scala — pull request #3518 by adriaanm (2014-02-13 01:50:43+00:00)
Title: SI-7753 InstantiateDependentMap narrows type of unstable args

Rebase of #3507, already LGTM'ed over there.

[Most of this comment and the initial fix were implemented by Jason Zaugg.
I just cleaned it up a bit.]

After a soundness fix in , instantiation of dependent
method type results behaved differently depending on whether the argument
from which we were propagating information had a stable type
or not. This is particular to substitution into singleton types
over the parameter in question.

If the argument was stable, it was substituted into singleton
types, such as the one below in the prefix in `a.type#B`
(which is the longhand version of `a.B`)

scala> class A { type B >: Null <: AnyRef }
defined class A

scala> object AA extends A { type B = String }
defined object AA

scala> def foo(a: A): a.B = null
foo: (a: A)a.B

scala> foo(AA)
res0: AA.B = null

But what if it isn't stable?

scala> foo({def a = AA; a: A { type B <: String}})
res1: a.B = null

This commit changes that to:

scala> foo({def a = AA; a: A { type B <: String}})
res1: A{type B <: String}#B = null