Skip to content

Commit

Permalink
Merge pull request #731 from retronym/ticket/5617
Browse files Browse the repository at this point in the history
SI-5617 Better error message for "x overrides nothing".
  • Loading branch information
adriaanm committed Jun 21, 2012
2 parents 3208272 + 2d3b6bd commit 6aea0ae
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 6 deletions.
11 changes: 10 additions & 1 deletion src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
Expand Up @@ -766,7 +766,16 @@ abstract class RefChecks extends InfoTransform with reflect.internal.transform.R
for (member <- clazz.info.decls)
if (member.isAnyOverride && !(clazz.thisType.baseClasses exists (hasMatchingSym(_, member)))) {
// for (bc <- clazz.info.baseClasses.tail) Console.println("" + bc + " has " + bc.info.decl(member.name) + ":" + bc.info.decl(member.name).tpe);//DEBUG
unit.error(member.pos, member.toString() + " overrides nothing");

val nonMatching: List[Symbol] = clazz.info.member(member.name).alternatives.filterNot(_.owner == clazz).filterNot(_.isFinal)
def issueError(suffix: String) = unit.error(member.pos, member.toString() + " overrides nothing" + suffix);
nonMatching match {
case Nil =>
issueError("")
case ms =>
val superSigs = ms.map(m => m.defStringSeenAs(clazz.tpe memberType m)).mkString("\n")
issueError(s".\nNote: the super classes of ${member.owner} contain the following, non final members named ${member.name}:\n${superSigs}")
}
member resetFlag (OVERRIDE | ABSOVERRIDE) // Any Override
}
}
Expand Down
20 changes: 15 additions & 5 deletions test/files/neg/t5429.check
Expand Up @@ -46,14 +46,18 @@ t5429.scala:38: error: overriding method emptyArg in class A of type ()Int;
object emptyArg has incompatible type
override object emptyArg // fail
^
t5429.scala:39: error: object oneArg overrides nothing
t5429.scala:39: error: object oneArg overrides nothing.
Note: the super classes of class C contain the following, non final members named oneArg:
def oneArg(x: String): Int
override object oneArg // fail
^
t5429.scala:43: error: overriding lazy value lazyvalue in class A0 of type Any;
object lazyvalue must be declared lazy to override a concrete lazy value
override object lazyvalue // !!! this fails, but should succeed (lazy over lazy)
^
t5429.scala:46: error: object oneArg overrides nothing
t5429.scala:46: error: object oneArg overrides nothing.
Note: the super classes of class C0 contain the following, non final members named oneArg:
def oneArg(x: String): Any
override object oneArg // fail
^
t5429.scala:50: error: overriding value value in class A of type Int;
Expand All @@ -76,7 +80,9 @@ t5429.scala:58: error: overriding lazy value lazyvalue in class A0 of type Any;
value lazyvalue must be declared lazy to override a concrete lazy value
override val lazyvalue = 0 // fail (non-lazy)
^
t5429.scala:61: error: value oneArg overrides nothing
t5429.scala:61: error: value oneArg overrides nothing.
Note: the super classes of class D0 contain the following, non final members named oneArg:
def oneArg(x: String): Any
override val oneArg = 15 // fail
^
t5429.scala:65: error: overriding value value in class A of type Int;
Expand All @@ -103,7 +109,9 @@ t5429.scala:73: error: overriding lazy value lazyvalue in class A0 of type Any;
method lazyvalue needs to be a stable, immutable value
override def lazyvalue = 2 // fail
^
t5429.scala:76: error: method oneArg overrides nothing
t5429.scala:76: error: method oneArg overrides nothing.
Note: the super classes of class E0 contain the following, non final members named oneArg:
def oneArg(x: String): Any
override def oneArg = 15 // fail
^
t5429.scala:80: error: overriding value value in class A of type Int;
Expand All @@ -126,7 +134,9 @@ t5429.scala:87: error: overriding value value in class A0 of type Any;
lazy value value cannot override a concrete non-lazy value
override lazy val value = 0 // fail (strict over lazy)
^
t5429.scala:91: error: value oneArg overrides nothing
t5429.scala:91: error: value oneArg overrides nothing.
Note: the super classes of class F0 contain the following, non final members named oneArg:
def oneArg(x: String): Any
override lazy val oneArg = 15 // fail
^
34 errors found
8 changes: 8 additions & 0 deletions test/files/neg/t5617.check
@@ -0,0 +1,8 @@
t5617.scala:12: error: method foo overrides nothing.
Note: the super classes of trait C contain the following, non final members named foo:
def foo(u: Unit): Int
def foo(x: Boolean): Int
def foo(i: Int)(b: String): Int
override def foo(s: String): Int
^
one error found
14 changes: 14 additions & 0 deletions test/files/neg/t5617.scala
@@ -0,0 +1,14 @@
trait A {
def foo(i: Int)(b: String): Int
def foo(u: Unit): Int // not reported
def foo(x: Float): Int // not reported
}
trait B[X] extends A {
def foo(x: X): Int
def foo(u: Unit): Int
final def foo(x: Float): Int = 0 // not reported
}
trait C extends B[Boolean] {
override def foo(s: String): Int
val foo = 0 // not reported
}

0 comments on commit 6aea0ae

Please sign in to comment.