Skip to content

Commit

Permalink
Add explanation to checkCaseClassInheritanceInvariant error msg
Browse files Browse the repository at this point in the history
Closes #18552 which was actually not an error, see:
https://github.com/scala/scala3/blob/73882c5b62b8cd96031ad975f7677949433a9f21/compiler/src/dotty/tools/dotc/typer/RefChecks.scala#L889-L893

Co-authored-by: Anna Herlihy <herlihyap@gmail.com>
Co-authored-by: Natsu Kagami <natsukagami@gmail.com>
  • Loading branch information
3 people committed Apr 10, 2024
1 parent 1e8a653 commit fd84324
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 7 deletions.
17 changes: 10 additions & 7 deletions compiler/src/dotty/tools/dotc/typer/RefChecks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -891,11 +891,14 @@ object RefChecks {
* can assume invariant refinement for case classes in `constrainPatternType`.
*/
def checkCaseClassInheritanceInvariant() =
for (caseCls <- clazz.info.baseClasses.tail.find(_.is(Case)))
for (baseCls <- caseCls.info.baseClasses.tail)
if (baseCls.typeParams.exists(_.paramVarianceSign != 0))
for (problem <- variantInheritanceProblems(baseCls, caseCls, "non-variant", "case "))
report.errorOrMigrationWarning(problem, clazz.srcPos, MigrationVersion.Scala2to3)
for
caseCls <- clazz.info.baseClasses.tail.find(_.is(Case))
baseCls <- caseCls.info.baseClasses.tail
if baseCls.typeParams.exists(_.paramVarianceSign != 0)
problem <- variantInheritanceProblems(baseCls, caseCls, i"base $baseCls", "case ")
withExplain = problem.appendExplanation:
"Refining a basetype of a case class is not allowed, enabling better GADT constraints in case class patterns."
do report.errorOrMigrationWarning(withExplain, clazz.srcPos, MigrationVersion.Scala2to3)
checkNoAbstractMembers()
if (abstractErrors.isEmpty)
checkNoAbstractDecls(clazz)
Expand Down Expand Up @@ -924,7 +927,7 @@ object RefChecks {
for {
cls <- clazz.info.baseClasses.tail
if cls.paramAccessors.nonEmpty && !mixins.contains(cls)
problem <- variantInheritanceProblems(cls, clazz.asClass.superClass, "parameterized", "super")
problem <- variantInheritanceProblems(cls, clazz.asClass.superClass, i"parameterized base $cls", "super")
}
report.error(problem, clazz.srcPos)
}
Expand All @@ -947,7 +950,7 @@ object RefChecks {
if (combinedBT =:= thisBT) None // ok
else
Some(
em"""illegal inheritance: $clazz inherits conflicting instances of $baseStr base $baseCls.
em"""illegal inheritance: $clazz inherits conflicting instances of $baseStr.
|
| Direct basetype: $thisBT
| Basetype via $middleStr$middle: $combinedBT""")
Expand Down
12 changes: 12 additions & 0 deletions tests/neg/i18552.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-- Error: tests/neg/i18552.scala:9:6 -----------------------------------------------------------------------------------
9 |class MB(id:Int) extends MA(id) with M[B] // error
| ^
| illegal inheritance: class MB inherits conflicting instances of base trait M.
|
| Direct basetype: M[B]
| Basetype via case class MA: M[A]
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Refining a basetype of a case class is not allowed, enabling better GADT constraints in case class patterns.
---------------------------------------------------------------------------------------------------------------------
9 changes: 9 additions & 0 deletions tests/neg/i18552.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//> using options -explain

trait A
trait B extends A

trait M[+T]

case class MA(id:Int) extends M[A]
class MB(id:Int) extends MA(id) with M[B] // error

0 comments on commit fd84324

Please sign in to comment.