From 87185f98441fc73835c100cf4170e9d9bb31c328 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 5 Apr 2006 13:48:28 +0000 Subject: fixed bug562 and bug563 --- src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 8 ++++++-- test/files/neg/bug562.check | 6 ++++++ test/files/neg/bug562.scala | 11 +++++++++++ test/files/neg/bug563.check | 9 +++++++++ test/files/neg/bug563.scala | 7 +++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 test/files/neg/bug562.check create mode 100644 test/files/neg/bug562.scala create mode 100644 test/files/neg/bug563.check create mode 100644 test/files/neg/bug563.scala diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index 41cfdf30bf..e88545992c 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -176,8 +176,12 @@ abstract class RefChecks extends InfoTransform { overrideError("needs `override' modifier"); } else if ((other hasFlag ABSOVERRIDE) && other.isIncompleteIn(clazz) && !(member hasFlag ABSOVERRIDE)) { overrideError("needs `abstract override' modifiers"); - } else if (other.isStable && !member.isStable) { // (1.4) - overrideError("needs to be an immutable value"); + } else if (other.isStable) { + if (!member.isStable) // (1.4) + overrideError("needs to be an immutable value") + else if (!(other hasFlag DEFERRED) && other.owner.isTrait && (member hasFlag OVERRIDE)) + overrideError("cannot override a value or variable definition in a trait " + + "\n (this is an implementation restriction)") } else { if (other.isAliasType) { if (!member.typeParams.isEmpty) // (1.5) diff --git a/test/files/neg/bug562.check b/test/files/neg/bug562.check new file mode 100644 index 0000000000..6654ee5ef9 --- /dev/null +++ b/test/files/neg/bug562.check @@ -0,0 +1,6 @@ +bug562.scala:10 error: error overriding value y in trait YYY of type => scala.Int; + value y cannot override a value or variable definition in a trait + (this is an implementation restriction) + override val y = super.y; + ^ +one error found diff --git a/test/files/neg/bug562.scala b/test/files/neg/bug562.scala new file mode 100644 index 0000000000..c4a6e61742 --- /dev/null +++ b/test/files/neg/bug562.scala @@ -0,0 +1,11 @@ +package test; + +abstract class XXX; + +trait YYY extends XXX { + val y = 10; +} + +class Foo extends XXX with YYY { + override val y = super.y; +} diff --git a/test/files/neg/bug563.check b/test/files/neg/bug563.check new file mode 100644 index 0000000000..0f2eac240e --- /dev/null +++ b/test/files/neg/bug563.check @@ -0,0 +1,9 @@ +bug563.scala:6 error: missing parameter type + map(n,ptr => new Cell(ptr.elem)); + ^ +bug563.scala:6 error: no type parameters for method map: (scala.List[A],(A) => R)scala.List[R] exist so that it can be applied to arguments (scala.List[scala.Cell[scala.Int]],() => ) + --- because --- +result type scala.List[R] is incompatible with expected type scala.Unit + map(n,ptr => new Cell(ptr.elem)); + ^ +two errors found diff --git a/test/files/neg/bug563.scala b/test/files/neg/bug563.scala new file mode 100644 index 0000000000..d559226bdb --- /dev/null +++ b/test/files/neg/bug563.scala @@ -0,0 +1,7 @@ +object Test { + def map[A,R](a : List[A], f : A => R) : List[R] = a.map(f); + + def split(sn : Iterable[List[Cell[int]]]) : unit = + for (val n <- sn) + map(n,ptr => new Cell(ptr.elem)); +} -- cgit v1.2.3