From 32d981e7c033dee82af24cc19b51e41f6378f4f2 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 19 Feb 2020 15:37:55 +0100 Subject: [PATCH] Improve overriding error message for exports --- .../dotty/tools/dotc/typer/RefChecks.scala | 2 ++ tests/neg/exports1.scala | 20 +++++++++++++++++++ tests/neg/exports2.check | 5 +++++ tests/neg/exports2.scala | 9 +++++++++ 4 files changed, 36 insertions(+) create mode 100644 tests/neg/exports1.scala create mode 100644 tests/neg/exports2.check create mode 100644 tests/neg/exports2.scala diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index a5315400efb1..cecd78f838fc 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -362,6 +362,8 @@ object RefChecks { s"$clazz inherits conflicting members:\n " + infoStringWithLocation(other) + " and\n " + infoStringWithLocation(member) + "\n(Note: this can be resolved by declaring an override in " + clazz + ".)") + else if member.is(Exported) then + overrideError("cannot override since it comes from an export") else overrideError("needs `override` modifier") else if (other.is(AbsOverride) && other.isIncompleteIn(clazz) && !member.is(AbsOverride)) diff --git a/tests/neg/exports1.scala b/tests/neg/exports1.scala new file mode 100644 index 000000000000..ecd89c694043 --- /dev/null +++ b/tests/neg/exports1.scala @@ -0,0 +1,20 @@ +object A: + def f: String = "" + +trait B: + def f: String = "abc" + +trait B2 extends B: + override def f: String = "abc" + +object D extends B: + object b extends B + export b._ // ok + +object D1 extends B: + object b extends B + export b.f // error + +object D2 extends B: + object b2 extends B2 + export b2.f // error diff --git a/tests/neg/exports2.check b/tests/neg/exports2.check new file mode 100644 index 000000000000..6b35b1fe4621 --- /dev/null +++ b/tests/neg/exports2.check @@ -0,0 +1,5 @@ +-- Error: tests/neg/exports2.scala:8:11 -------------------------------------------------------------------------------- +8 | export A._ // error + | ^ + | error overriding method f in trait B of type => String; + | method f of type => String cannot override since it comes from an export diff --git a/tests/neg/exports2.scala b/tests/neg/exports2.scala new file mode 100644 index 000000000000..913248a2041a --- /dev/null +++ b/tests/neg/exports2.scala @@ -0,0 +1,9 @@ +object A: + def f: String = "" + +trait B: + def f: String = "abc" + +object C extends B: + export A._ // error +