Skip to content

Commit 453e75c

Browse files
committed
Check trait overrides trait parameters
1 parent 4cadc5b commit 453e75c

File tree

3 files changed

+36
-22
lines changed

3 files changed

+36
-22
lines changed

compiler/src/dotty/tools/dotc/transform/init/ParamOverridingCheck.scala

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,23 @@ object ParamOverridingCheck:
150150

151151
init(tpl, thisRef, classSym)
152152

153+
// check parameter access semantics
154+
for
155+
klass <- classSym.parentSyms
156+
paramSym <- klass.asClass.paramGetters
157+
overridingClass <- (classSym :: classSym.parentSyms).filter(cls => cls != klass && cls.isSubClass(klass))
158+
overridingSym = paramSym.overridingSymbol(overridingClass.asClass) if overridingSym.exists
159+
do
160+
// println(paramSym.show + " is overridden in " + thisRef.klass)
161+
if !overridingSym.is(Flags.ParamAccessor) then
162+
report.warning("Overriding parameter " + paramSym.show + " in " + klass.show + " as non-parameter in " + overridingSym.owner.show, overridingSym.defTree)
163+
else
164+
val overridingValue = thisRef.field(overridingSym)
165+
if thisRef.field(paramSym) != overridingValue then
166+
// println(overridingSym.show + " in " + thisRef.klass + " = " + overridingValue)
167+
// println(paramSym.show + " in " + klass + " = " + thisRef.field(paramSym))
168+
report.warning("Incorrect overriding: " + paramSym.show + " in " + klass.show + " has a different value from " + overridingSym.show + " in " + overridingSym.owner.show, overridingSym.defTree)
169+
153170
// ---------------------- Semantic definition --------------------------------
154171

155172
/** Evaluate a list of expressions */
@@ -248,7 +265,7 @@ object ParamOverridingCheck:
248265
}
249266

250267
/** Initialize part of an abstract object in `klass` of the inheritance chain */
251-
def init(tpl: Template, thisV: ThisRef, klass: ClassSymbol): Contextual[Value] = log("init " + klass.show, printer) {
268+
def init(tpl: Template, thisV: ThisRef, klass: ClassSymbol): Contextual[Unit] = log("init " + klass.show, printer) {
252269
val paramsMap = tpl.constr.termParamss.flatten.map { vdef =>
253270
vdef.name -> thisV.field(vdef.symbol)
254271
}.toMap
@@ -323,21 +340,4 @@ object ParamOverridingCheck:
323340
end if
324341

325342
// skip class body
326-
327-
// check parameter access semantics
328-
for
329-
paramSym <- klass.paramGetters
330-
overridingSym = paramSym.overridingSymbol(thisV.klass) if overridingSym.exists
331-
do
332-
// println(paramSym.show + " is overridden in " + thisV.klass)
333-
if !overridingSym.is(Flags.ParamAccessor) then
334-
report.warning("Overriding parameter " + paramSym.show + " in " + klass.show + " as non-parameter in " + overridingSym.owner.show, overridingSym.defTree)
335-
else
336-
val overridingValue = thisV.field(overridingSym)
337-
if thisV.field(paramSym) != overridingValue then
338-
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
339-
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
340-
report.warning("Incorrect overriding: " + paramSym.show + " in " + klass.show + " has a different value from " + overridingSym.show + " in " + overridingSym.owner.show, overridingSym.defTree)
341-
342-
thisV
343343
}

tests/init/neg/i15764e.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
trait A(val x: Int)
2+
trait B(override val x: Int) extends A // error
3+
class C extends B(1) with A(2)
4+
5+
6+
trait X(val x: Int)
7+
trait Y(override val x: Int) extends X // error
8+
class Z extends X(1) with Y(2)
9+
10+
object Pos1:
11+
trait X(val x: Int)
12+
trait Y(override val x: Int) extends X // ok
13+
class Z(n: Int) extends X(n) with Y(n)
14+
15+
object Pos2:
16+
trait X(val x: Int)
17+
trait Y(override val x: Int) extends X // ok
18+
class Z(n: Int) extends Y(n) with X(n)

tests/init/pos/i15764e.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
trait X(val x: Int, y: Int, z: Int)
22
trait Y(override val x: Int, y: Int, z: Int) extends X
33
class Z(override val x: Int, y: Int, z: Int) extends Y(x, y, z) with X(x, y, z)
4-
5-
trait A(val x: Int, y: Int, z: Int)
6-
trait B(override val x: Int, y: Int, z: Int) extends A
7-
class C extends B(1, 2, 3) with A(1, 2, 3)

0 commit comments

Comments
 (0)