Skip to content

Commit ae7bc0e

Browse files
committed
Do not store to non-existent fields in trait setters.
1 parent 454659a commit ae7bc0e

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

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

+7-3
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

+3-1
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 =

0 commit comments

Comments
 (0)