Skip to content

Commit c3a78cf

Browse files
committed
Memoize: perform required tree adaptation in setter.
Otherwise can create trees that do not pas Ycheck.
1 parent 8fe3218 commit c3a78cf

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

src/dotty/tools/dotc/transform/Memoize.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ import Decorators._
6868
}
6969

7070
lazy val field = sym.field.orElse(newField).asTerm
71+
72+
def adaptToField(tree: Tree) =
73+
if (tree.isEmpty) tree else tree.ensureConforms(field.info.widen)
74+
7175
if (sym.is(Accessor, butNot = NoFieldNeeded))
7276
if (sym.isGetter) {
7377
def skipBlocks(t: Tree): Tree = t match {
@@ -85,14 +89,15 @@ import Decorators._
8589
case _ =>
8690
var rhs = tree.rhs.changeOwnerAfter(sym, field, thisTransform)
8791
if (isWildcardArg(rhs)) rhs = EmptyTree
88-
val fieldDef = transformFollowing(ValDef(field, rhs))
92+
93+
val fieldDef = transformFollowing(ValDef(field, adaptToField(rhs)))
8994
val getterDef = cpy.DefDef(tree)(rhs = transformFollowingDeep(ref(field))(ctx.withOwner(sym), info))
9095
Thicket(fieldDef, getterDef)
9196
}
9297
} else if (sym.isSetter) {
9398
if (!sym.is(ParamAccessor)) { val Literal(Constant(())) = tree.rhs } // this is intended as an assertion
9499
field.setFlag(Mutable) // necessary for vals mixed in from Scala2 traits
95-
val initializer = Assign(ref(field), ref(tree.vparamss.head.head.symbol))
100+
val initializer = Assign(ref(field), adaptToField(ref(tree.vparamss.head.head.symbol)))
96101
cpy.DefDef(tree)(rhs = transformFollowingDeep(initializer)(ctx.withOwner(sym), info))
97102
}
98103
else tree // curiously, some accessors from Scala2 have ' ' suffixes. They count as

0 commit comments

Comments
 (0)