Skip to content

Commit 2561ce7

Browse files
committed
Add test
1 parent d2b1eaf commit 2561ce7

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

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

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import reporting.trace as log
1515

1616
import Semantic.Arg
1717
import Semantic.NewExpr
18+
import Semantic.Call
1819
import Semantic.hasSource
1920

2021
import scala.collection.mutable
@@ -102,6 +103,7 @@ object ParamOverridingCheck:
102103
Unknown(source)
103104
}
104105

106+
extension (thisV: ThisRef)
105107
def callConstructor(ctor: Symbol, args: List[Value]): Contextual[Unit] = log("call " + ctor.show + ", args = " + args, printer) {
106108
// init "fake" param fields for parameters of primary and secondary constructors
107109
def addParamsAsFields(args: List[Value], ref: ThisRef, ctorDef: DefDef) =
@@ -111,19 +113,19 @@ object ParamOverridingCheck:
111113
ref.initField(param, value)
112114
printer.println(param.show + " initialized with " + value)
113115

114-
value match
115-
case ref: ThisRef =>
116-
if ctor.hasSource then
117-
val cls = ctor.owner.enclosingClass.asClass
118-
val ddef = ctor.defTree.asInstanceOf[DefDef]
119-
addParamsAsFields(args, ref, ddef)
120-
if ctor.isPrimaryConstructor then
121-
val tpl = cls.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template]
122-
eval(tpl, ref, cls)
123-
else
124-
eval(ddef.rhs, ref, cls)
116+
if ctor.hasSource then
117+
val cls = ctor.owner.enclosingClass.asClass
118+
val ddef = ctor.defTree.asInstanceOf[DefDef]
119+
addParamsAsFields(args, thisV, ddef)
120+
if ctor.isPrimaryConstructor then
121+
val tpl = cls.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template]
122+
init(tpl, thisV, cls)
123+
else
124+
ddef.rhs match
125+
case Block(Call(ref, argss) :: _, _) =>
126+
val args = evalArgs(argss.flatten, thisV, thisV.klass)
127+
thisV.callConstructor(ref.symbol, args)
125128

126-
case _ =>
127129
}
128130
end extension
129131

@@ -306,16 +308,19 @@ object ParamOverridingCheck:
306308

307309
// check parameter access semantics
308310
for
309-
paramAcc <- klass.paramGetters
310-
overridingSym = paramAcc.overridingSymbol(thisV.klass)
311+
paramSym <- klass.paramGetters
312+
overridingSym = paramSym.overridingSymbol(thisV.klass)
311313
if overridingSym.exists
312314
do
315+
// println(paramSym.show + " is overridden in " + thisV.klass)
313316
if !overridingSym.is(Flags.ParamAccessor) then
314-
report.warning("Overriding class parameter " + paramAcc.name + " in " + klass + " with non-class-parameter in " + thisV.klass, overridingSym.defTree)
317+
report.warning("Overriding parameter " + paramSym.show + " in " + klass + " as non-parameter in " + thisV.klass, overridingSym.defTree)
315318
else
316319
val overridingValue = thisV.field(overridingSym)
317-
if thisV.field(paramAcc) != overridingValue then
318-
report.warning("Incorrect overriding, " + paramAcc + " in " + klass + " have different value from " + overridingSym + " in " + thisV.klass, overridingValue.source)
320+
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
321+
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
322+
if thisV.field(paramSym) != overridingValue then
323+
report.warning("Incorrect overriding: " + paramSym.show + " in " + klass + " have different value from " + overridingSym.show + " in " + thisV.klass, overridingValue.source)
319324

320325
thisV
321326
}

tests/init/neg/i15764.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class B(val y: Int):
2+
println(y) // A warning is due here
3+
foo()
4+
def foo() = println(y)
5+
6+
class C(override val y: Int) extends B(10) // error
7+

0 commit comments

Comments
 (0)