diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 5 | ||||
-rw-r--r-- | test/files/neg/bug276.check | 5 | ||||
-rw-r--r-- | test/files/neg/bug276.scala | 7 |
3 files changed, 17 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 745979790b..bcc1a1686e 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -208,6 +208,11 @@ abstract class RefChecks extends InfoTransform { (ob == RootClass || ob == NoSymbol || !ob.hasTransOwner(mb) || (other hasFlag PROTECTED) && !(member hasFlag PROTECTED))) { overrideAccessError() + } + else if (other.isClass || other.isModule) { + overrideError("cannot be used here - classes and objects cannot be overridden"); + } else if (!other.isDeferred && (member.isClass || member.isModule)) { + overrideError("cannot be used here - classes and objects can only override abstract types"); } else if (other hasFlag FINAL) { // (1.2) overrideError("cannot override final member"); } else if (!other.isDeferred && !(member hasFlag (OVERRIDE | ABSOVERRIDE | SYNTHETIC))) { // (1.3), SYNTHETIC because of DEVIRTUALIZE diff --git a/test/files/neg/bug276.check b/test/files/neg/bug276.check new file mode 100644 index 0000000000..edc4ec568f --- /dev/null +++ b/test/files/neg/bug276.check @@ -0,0 +1,5 @@ +bug276.scala:6: error: overriding type Bar in class Foo, which equals (Int, Int); + class Bar cannot be used here - classes and objects can only override abstract types + class Bar + ^ +one error found diff --git a/test/files/neg/bug276.scala b/test/files/neg/bug276.scala new file mode 100644 index 0000000000..e083e21705 --- /dev/null +++ b/test/files/neg/bug276.scala @@ -0,0 +1,7 @@ +class Foo { + type Bar = (Int, Int) +} + +class FooFoo extends Foo { + class Bar +}
\ No newline at end of file |