Skip to content

Commit fa59847

Browse files
authored
Merge pull request #14893 from dotty-staging/fix-11170
Handle case where abstract overrides miss an implementation
2 parents 0f6bcd3 + ff4c53f commit fa59847

File tree

6 files changed

+75
-2
lines changed

6 files changed

+75
-2
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,5 +361,14 @@ object NameOps {
361361
case raw.BANG => UNARY_!
362362
case _ => name
363363
}
364+
365+
/** If this is a super accessor name, its underlying name, which is the name
366+
* of the method that the super accessor forwards to.
367+
*/
368+
def originalOfSuperAccessorName: TermName = name match
369+
case SuperAccessorName(name1) => name1.originalOfSuperAccessorName
370+
case ExpandedName(_, name1) => name1.originalOfSuperAccessorName
371+
case ExpandPrefixName(_, name1) => name1.originalOfSuperAccessorName
372+
case _ => name
364373
}
365374
}

compiler/src/dotty/tools/dotc/transform/ResolveSuper.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ object ResolveSuper {
118118
report.error(IllegalSuperAccessor(base, memberName, targetName, acc, accTp, other.symbol, otherTp), base.srcPos)
119119
bcs = bcs.tail
120120
}
121-
assert(sym.exists, i"cannot rebind $acc, ${acc.targetName} $memberName")
122-
sym
121+
sym.orElse {
122+
val originalName = acc.name.asTermName.originalOfSuperAccessorName
123+
report.error(em"Member method ${originalName.debugString} of mixin ${acc.owner} is missing a concrete super implementation in $base.", base.srcPos)
124+
acc
125+
}
123126
}
124127
}

tests/neg/i11170.check

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- Error: tests/neg/i11170.scala:7:15 ----------------------------------------------------------------------------------
2+
7 |abstract class A extends U[String] // error
3+
| ^
4+
| Member method foo of mixin trait U is missing a concrete super implementation in class A.

tests/neg/i11170.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
trait T[X] {
2+
def foo(x: X): X
3+
}
4+
trait U[X] extends T[X] {
5+
abstract override def foo(x: X): X = super.foo(x)
6+
}
7+
abstract class A extends U[String] // error
8+

tests/neg/i11170a.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package apackage {
2+
3+
abstract class A {
4+
protected val x: Int
5+
}
6+
abstract class A2 {
7+
val x: Int
8+
}
9+
}
10+
11+
package bpackage {
12+
import apackage._
13+
14+
trait B extends A {
15+
println(x)
16+
}
17+
trait B2 extends A2 {
18+
println(x)
19+
}
20+
}
21+
22+
package cpackage {
23+
import apackage._
24+
import bpackage._
25+
26+
case class C(override protected val x: Int) extends A with B // error
27+
case class C2(override val x: Int) extends A2 with B2
28+
}

tests/pos/MathSpec.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
trait MathSig {
2+
def sqrt(x: Double): Double
3+
}
4+
5+
trait MathSpec extends MathSig {
6+
val epsilon = 0.00001
7+
abstract override def sqrt(x: Double) = {
8+
require(x >= 0)
9+
super.sqrt(x)
10+
} ensuring { result =>
11+
(x * x - result).abs < epsilon
12+
}
13+
}
14+
15+
trait MathImpl extends MathSig {
16+
def sqrt(x: Double): Double =
17+
???
18+
}
19+
20+
object Math extends MathImpl
21+
with MathSpec

0 commit comments

Comments
 (0)