Skip to content

Commit 11de1d3

Browse files
committed
Do not store to non-existent fields in trait setters.
1 parent d495ee0 commit 11de1d3

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
@@ -274,9 +274,13 @@ object NameOps {
274274
def setterName: TermName = name.exclude(FieldName) ++ str.SETTER_SUFFIX
275275

276276
def getterName: TermName =
277-
name.exclude(FieldName).mapLast(n =>
278-
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
279-
else n)
277+
if name.is(TraitSetterName) then
278+
val TraitSetterName(_, original) = name
279+
original.getterName
280+
else
281+
name.exclude(FieldName).mapLast(n =>
282+
if (n.endsWith(str.SETTER_SUFFIX)) n.take(n.length - str.SETTER_SUFFIX.length).asSimpleName
283+
else n)
280284

281285
def fieldName: TermName =
282286
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
@@ -12,6 +12,7 @@ import SymUtils._
1212
import Constants._
1313
import ast.Trees._
1414
import MegaPhase._
15+
import NameKinds.TraitSetterName
1516
import NameOps._
1617
import Flags._
1718
import Decorators._
@@ -119,7 +120,8 @@ class Memoize extends MiniPhase with IdentityDenotTransformer { thisPhase =>
119120

120121
val constantFinalVal = sym.isAllOf(Accessor | Final, butNot = Mutable) && tree.rhs.isInstanceOf[Literal]
121122

122-
if (sym.is(Accessor, butNot = NoFieldNeeded) && !constantFinalVal) {
123+
if (sym.is(Accessor, butNot = NoFieldNeeded) && !constantFinalVal
124+
&& (!sym.name.is(TraitSetterName) || sym.getter.is(Accessor, butNot = NoFieldNeeded))) {
123125
val field = sym.field.orElse(newField).asTerm
124126

125127
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)