Skip to content

Commit 1f2d29b

Browse files
committed
Handle overrides in abstract class correctly
1 parent d1c03e6 commit 1f2d29b

File tree

2 files changed

+11
-21
lines changed

2 files changed

+11
-21
lines changed

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

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ object ParamOverridingCheck:
135135
thisV.callConstructor(ref.symbol, args)
136136

137137
case _ =>
138-
report.error("Unexpected rhs = " + ddef.rhs.show, ddef.rhs)
138+
report.error("Unexpected rhs = " + ddef.rhs.show + " in " + cls.show, ddef.rhs)
139139

140140
}
141141
end extension
@@ -146,7 +146,7 @@ object ParamOverridingCheck:
146146
* Check the specified concrete classes
147147
*/
148148
def checkClasses(concreteClasses: List[ClassSymbol])(using Context): Unit =
149-
for classSym <- concreteClasses if overrideClassParams(classSym) do
149+
for classSym <- concreteClasses do
150150
val thisRef = ThisRef(classSym, fields = mutable.Map.empty)
151151
val tpl = classSym.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template]
152152
for param <- tpl.constr.termParamss.flatten yield
@@ -331,33 +331,18 @@ object ParamOverridingCheck:
331331
// check parameter access semantics
332332
for
333333
paramSym <- klass.paramGetters
334-
overridingSym = paramSym.overridingSymbol(thisV.klass)
335-
if overridingSym.exists
334+
overridingSym = paramSym.matchingMember(thisV.klass.thisType)
335+
if overridingSym.exists && overridingSym != paramSym && overridingSym.is(Flags.Override)
336336
do
337337
// println(paramSym.show + " is overridden in " + thisV.klass)
338338
if !overridingSym.is(Flags.ParamAccessor) then
339-
report.warning("Overriding parameter " + paramSym.show + " in " + klass.show + " as non-parameter in " + thisV.klass.show, overridingSym.defTree)
339+
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)
342342
// println(overridingSym.show + " in " + thisV.klass + " = " + overridingValue)
343343
// println(paramSym.show + " in " + klass + " = " + thisV.field(paramSym))
344344
if thisV.field(paramSym) != overridingValue then
345-
report.warning("Incorrect overriding: " + paramSym.show + " in " + klass.show + " has a different value from " + overridingSym.show + " in " + thisV.klass.show, overridingValue.source)
345+
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
348348
}
349-
350-
// ------------------------- Helper methods ----------------------------------
351-
352-
/** Does the given class override any class parameter? */
353-
def overrideClassParams(classSym: ClassSymbol)(using Context): Boolean =
354-
classSym.info.baseClasses match
355-
case _ :: inherited =>
356-
inherited.exists(superCls => anyClassParameterOverridenBy(superCls, by = classSym))
357-
358-
case Nil =>
359-
false
360-
361-
/** Does the class `classSym` have any class parameter overridden by the class `by`? */
362-
def anyClassParameterOverridenBy(classSym: ClassSymbol, by: ClassSymbol)(using Context): Boolean =
363-
classSym.paramGetters.exists(_.overridingSymbol(by).exists)

tests/init/neg/i15764d.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class A(val y: Int)
2+
3+
abstract class B(override val y: Int) extends A(10) // error
4+
5+
class C extends B(7)

0 commit comments

Comments
 (0)