Skip to content

Commit eaac472

Browse files
committed
Fix encoding of setters on anonymous classes with structural types
Also improve error message when a `var` appears in a refinement. Fixes #13703
1 parent 8c3e7a2 commit eaac472

File tree

5 files changed

+19
-1
lines changed

5 files changed

+19
-1
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3894,6 +3894,9 @@ object Parsers {
38943894
val stats = new ListBuffer[Tree]
38953895
def checkLegal(tree: Tree): List[Tree] =
38963896
val problem = tree match
3897+
case tree: ValDef if tree.mods.is(Mutable) =>
3898+
i"""refinement cannot be a mutable var.
3899+
|You can use an explicit getter ${tree.name} and setter ${tree.name}_= instead"""
38973900
case tree: MemberDef if !(tree.mods.flags & ModifierFlags).isEmpty =>
38983901
i"refinement cannot be ${(tree.mods.flags & ModifierFlags).flagStrings().mkString("`", "`, `", "`")}"
38993902
case tree: DefDef if tree.termParamss.nestedExists(!_.rhs.isEmpty) =>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ trait Dynamic {
186186
val base =
187187
untpd.Apply(
188188
untpd.TypedSplice(selectable.select(selectorName)).withSpan(fun.span),
189-
(Literal(Constant(name.toString)) :: Nil).map(untpd.TypedSplice(_)))
189+
(Literal(Constant(name.encode.toString)) :: Nil).map(untpd.TypedSplice(_)))
190190

191191
val scall =
192192
if (vargss.isEmpty) base

tests/neg/i13703.check

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- Error: tests/neg/i13703.scala:3:17 ----------------------------------------------------------------------------------
2+
3 |val f: Foo { var i: Int } = new Foo { var i: Int = 0 } // error
3+
| ^^^^^^^^^^
4+
| refinement cannot be a mutable var.
5+
| You can use an explicit getter i and setter i_= instead

tests/neg/i13703.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
trait Foo extends reflect.Selectable
2+
3+
val f: Foo { var i: Int } = new Foo { var i: Int = 0 } // error
4+
5+
val f2: Foo { val i: Int; def i_=(x: Int): Unit } = new Foo { var i: Int = 0 } // OK

tests/run/i13703.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
trait Foo extends reflect.Selectable
2+
3+
@main def Test: Unit =
4+
val f = new Foo { var i: Int = 0 }
5+
f.i = 1

0 commit comments

Comments
 (0)