Skip to content

Commit a408f99

Browse files
committed
Generalize overriding checking from isDefined
Generalize overriding checking from isDefined to all methods added by desugar to a case class. None of these methods has an override so we need to add one in case they do override another method (previously we would flag this as an error).
1 parent 464ceb4 commit a408f99

File tree

3 files changed

+9
-1
lines changed

3 files changed

+9
-1
lines changed

src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ object desugar {
2121
/** Info of a variable in a pattern: The named tree and its type */
2222
private type VarInfo = (NameTree, Tree)
2323

24+
/** Names of methods that are added unconditionally to case classes */
25+
def isDesugaredCaseClassMethodName(name: Name)(implicit ctx: Context) =
26+
name == nme.isDefined ||
27+
name == nme.copy ||
28+
name == nme.productArity ||
29+
name.isSelectorName
30+
2431
// ----- DerivedTypeTrees -----------------------------------
2532

2633
class SetterParamTree extends DerivedTypeTree {

src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ object NameOps {
8181
def isScala2LocalSuffix = name.endsWith(" ")
8282
def isModuleVarName(name: Name): Boolean =
8383
name.stripAnonNumberSuffix endsWith MODULE_VAR_SUFFIX
84+
def isSelectorName = name.startsWith(" ") && name.tail.forall(_.isDigit)
8485

8586
/** Is name a variable name? */
8687
def isVariableName: Boolean = name.length > 0 && {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ object RefChecks {
287287
!member.isAnyOverride) {
288288
// (*) Exclusion for default getters, fixes SI-5178. We cannot assign the Override flag to
289289
// the default getter: one default getter might sometimes override, sometimes not. Example in comment on ticket.
290-
if (member.name == nme.isDefined && member.is(Synthetic)) // isDefined methods are added automatially, can't have an override preset.
290+
if (member.is(Synthetic) && desugar.isDesugaredCaseClassMethodName(member.name)) // such names are added automatically, can't have an override preset.
291291
member.setFlag(Override)
292292
else if (member.owner != clazz && other.owner != clazz && !(other.owner derivesFrom member.owner))
293293
emitOverrideError(

0 commit comments

Comments
 (0)