Skip to content

Commit d2bad83

Browse files
committed
Do not store to non-existent fields in trait setters.
1 parent f96b144 commit d2bad83

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

compiler/src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,13 @@ object NameOps {
259259
def setterName: TermName = name.exclude(FieldName) ++ str.SETTER_SUFFIX
260260

261261
def getterName: TermName =
262-
name.exclude(FieldName).mapLast(n =>
263-
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
264-
else n)
262+
if name.is(TraitSetterName) then
263+
val TraitSetterName(_, original) = name
264+
original.getterName
265+
else
266+
name.exclude(FieldName).mapLast(n =>
267+
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
268+
else n)
265269

266270
def fieldName: TermName =
267271
if (name.isSetterName)

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import SymUtils._
1111
import Constants._
1212
import ast.Trees._
1313
import MegaPhase._
14+
import NameKinds.TraitSetterName
1415
import NameOps._
1516
import Flags._
1617
import Decorators._
@@ -114,7 +115,8 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
114115
EmptyTree
115116
}
116117

117-
if (sym.is(Accessor, butNot = NoFieldNeeded)) {
118+
if (sym.is(Accessor, butNot = NoFieldNeeded)
119+
&& (!sym.name.is(TraitSetterName) || sym.getter.is(Accessor, butNot = NoFieldNeeded))) {
118120
val field = sym.field.orElse(newField).asTerm
119121

120122
def adaptToField(tree: Tree): Tree =

tests/run/final-fields.check

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ T.f1
22
T.f2
33
T.f3
44
T.f4
5-
3 2 0 0
5+
3 2 -3 -4
66
3
77
g

0 commit comments

Comments
 (0)