Skip to content

Commit 4a5edb2

Browse files
committed
Fix #2928: Add special mode for computing the type of a LHS
To fix #2928, we need to compute the member type of an assigment's left-hand side using negative variance.
1 parent 45ffdf0 commit 4a5edb2

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

compiler/src/dotty/tools/dotc/typer/Typer.scala

+7-2
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,13 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
587587
lhsCore.tpe match {
588588
case ref: TermRef =>
589589
val lhsVal = lhsCore.denot.suchThat(!_.is(Method))
590-
if (canAssign(lhsVal.symbol))
591-
assignType(cpy.Assign(tree)(lhs1, typed(tree.rhs, lhsVal.info)))
590+
if (canAssign(lhsVal.symbol)) {
591+
// lhsBounds: (T .. Any) as seen from lhs prefix, where T is the type of lhsVal.symbol
592+
// This ensures we do the as-seen-from on T with variance -1. Test case neg/i2928.scala
593+
val lhsBounds =
594+
TypeBounds.lower(lhsVal.symbol.info).asSeenFrom(ref.prefix, lhsVal.symbol.owner)
595+
assignType(cpy.Assign(tree)(lhs1, typed(tree.rhs, lhsBounds.loBound)))
596+
}
592597
else {
593598
val pre = ref.prefix
594599
val setterName = ref.name.setterName

0 commit comments

Comments
 (0)