Skip to content

Commit 7e2952c

Browse files
Forbid user from overriding vars
The current check allowed the user to override vars, we don't want that Only the compiler should be allowed to do this, and for inline traits only
1 parent fd737ea commit 7e2952c

File tree

6 files changed

+18
-11
lines changed

6 files changed

+18
-11
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ object RefChecks {
341341
*/
342342
def checkOverride(checkSubType: (Type, Type) => Context ?=> Boolean, member: Symbol, other: Symbol): Unit =
343343
def overridesInlineTraitMember = other.owner.ownersIterator.exists(_.isInlineTrait) && member.is(Synthetic)
344+
def isInlinedFromInlineTrait = other.owner.isAllOf(InlineTrait) && member.is(Synthetic)
344345

345346
def memberTp(self: Type) =
346347
if (member.isClass) TypeAlias(member.typeRef.EtaExpand(member.typeParams))
@@ -505,7 +506,7 @@ object RefChecks {
505506
overrideError("needs `override` modifier")
506507
else if (other.is(AbsOverride) && other.isIncompleteIn(clazz) && !member.is(AbsOverride))
507508
overrideError("needs `abstract override` modifiers")
508-
else if member.is(Override) && other.is(Mutable) && !other.owner.isAllOf(InlineTrait) then
509+
else if member.is(Override) && other.is(Mutable) && !isInlinedFromInlineTrait then
509510
overrideError("cannot override a mutable variable")
510511
else if (member.isAnyOverride &&
511512
!(member.owner.thisType.baseClasses exists (_ isSubClass other.owner)) &&
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
inline trait A:
2+
var x: Int = 1
3+
4+
class B extends A:
5+
override var x = 2 // error

tests/run/inline-trait-body-override-var.check

Lines changed: 0 additions & 1 deletion
This file was deleted.

tests/run/inline-trait-body-override-var.scala

Lines changed: 0 additions & 9 deletions
This file was deleted.

tests/run/inline-trait-body-var.check

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
1
2+
2
3+
3
4+
4

tests/pos/inline-trait-body-var.scala renamed to tests/run/inline-trait-body-var.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,10 @@ class B extends A:
66
val old = x
77
x += 1
88
old
9+
10+
@main def Test =
11+
val b = B()
12+
println(b.f)
13+
println(b.f)
14+
println(b.f)
15+
println(b.f)

0 commit comments

Comments
 (0)