Skip to content

Commit 1e77bb8

Browse files
committed
Compute overriding symbol correctly
1 parent 1f2d29b commit 1e77bb8

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,18 @@ object ParamOverridingCheck:
9797
if ref.fieldInitialized(target) then
9898
ref.field(target)
9999
else
100-
Unknown(source)
100+
Skolem(source)
101101
else
102102
if ref.klass.isSubClass(receiver.widenSingleton.classSymbol) then
103103
report.error("[Internal error] Unexpected resolution failure: ThisRef.klass = " + ref.klass.show + ", field = " + field.show, source)
104-
Unknown(source)
104+
Skolem(source)
105105
else
106106
// This is possible due to incorrect type cast.
107107
// See tests/init/pos/Type.scala
108-
Unknown(source)
108+
Skolem(source)
109109

110110
case _ =>
111-
Unknown(source)
111+
Skolem(source)
112112
}
113113

114114
extension (thisV: ThisRef)
@@ -209,7 +209,7 @@ object ParamOverridingCheck:
209209
Skolem(expr)
210210

211211
case _ =>
212-
Unknown(expr)
212+
Skolem(expr)
213213

214214
/** Handle semantics of leaf nodes */
215215
def eval(tp: Type, thisV: ThisRef, klass: ClassSymbol, source: Tree): Contextual[Value] = log("evaluating " + tp.show, printer) {
@@ -225,9 +225,9 @@ object ParamOverridingCheck:
225225
if enclosingClass == klass then
226226
thisV.field(sym)
227227
else
228-
Unknown(source)
228+
Skolem(source)
229229
else
230-
Unknown(source)
230+
Skolem(source)
231231

232232
case tmref: TermRef =>
233233
val cls = tmref.widenSingleton.classSymbol
@@ -248,7 +248,7 @@ object ParamOverridingCheck:
248248

249249
case _ =>
250250
report.error("[Internal error] unexpected type " + tp, source)
251-
Unknown(source)
251+
Skolem(source)
252252
}
253253

254254
/** Initialize part of an abstract object in `klass` of the inheritance chain */
@@ -331,17 +331,17 @@ object ParamOverridingCheck:
331331
// check parameter access semantics
332332
for
333333
paramSym <- klass.paramGetters
334-
overridingSym = paramSym.matchingMember(thisV.klass.thisType)
335-
if overridingSym.exists && overridingSym != paramSym && overridingSym.is(Flags.Override)
334+
subClass <- thisV.klass.baseClasses if subClass.isSubClass(klass) && subClass != klass
335+
overridingSym = paramSym.overridingSymbol(subClass) if overridingSym.exists
336336
do
337337
// println(paramSym.show + " is overridden in " + thisV.klass)
338338
if !overridingSym.is(Flags.ParamAccessor) then
339339
report.warning("Overriding parameter " + paramSym.show + " in " + klass.show + " as non-parameter in " + overridingSym.owner.show, overridingSym.defTree)
340340
else
341341
val overridingValue = thisV.field(overridingSym)
342-
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
343-
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
344342
if thisV.field(paramSym) != overridingValue then
343+
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
344+
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
345345
report.warning("Incorrect overriding: " + paramSym.show + " in " + klass.show + " has a different value from " + overridingSym.show + " in " + overridingSym.owner.show, overridingSym.defTree)
346346

347347
thisV

tests/init/pos/i15764d.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class A(val y: Int):
2+
println(y) // should not issue a warning here
3+
foo()
4+
def foo() = println(y)
5+
6+
class B(m: Int, n: Int) extends A(m):
7+
def this(z: Int) = this(z, z)
8+
9+
class C(override val y: Int) extends B(y)
10+
11+
class D extends C(10)
12+
13+
class E extends C(new A(20).y)

0 commit comments

Comments
 (0)