From 3a3688f64af0755cef5a772d322ac80e08498e54 Mon Sep 17 00:00:00 2001 From: Lukas Rytz Date: Fri, 15 Jul 2016 11:32:38 +0200 Subject: SD-128 fix override checks for default methods The check for inheriting two conflicting members was wrong for default methods, leading to a missing error message. We were also not issuing "needs `override' modifier" when overriding a default method. Removes two methods: - `isDeferredOrJavaDefault` had a single use that is removed in this commit. - `isDeferredNotJavaDefault` is redundant with `isDeferred`, because no default method has the `DEFERRED` flag: - For symbols originating in the classfile parser this was the case from day one: default methods don't receive the `DEFERRED` flag. Only abstract interface methods do, as they have the `JAVA_ACC_ABSTRACT` flag in bytecode, which the classfile parser translates to `DEFERRED`. - For symbols created by the Java source parser, we don't add the `DEFERRED` to default methods anymore since 373db1e. Fixes scala/scala-dev#128 --- test/files/neg/sd128.check | 17 +++++++++++++++++ test/files/neg/sd128/A.java | 3 +++ test/files/neg/sd128/Test.scala | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 test/files/neg/sd128.check create mode 100644 test/files/neg/sd128/A.java create mode 100644 test/files/neg/sd128/Test.scala (limited to 'test/files/neg') diff --git a/test/files/neg/sd128.check b/test/files/neg/sd128.check new file mode 100644 index 0000000000..8f6fcb1213 --- /dev/null +++ b/test/files/neg/sd128.check @@ -0,0 +1,17 @@ +Test.scala:4: error: class C1 inherits conflicting members: + method f in trait A of type ()Int and + method f in trait T of type => Int +(Note: this can be resolved by declaring an override in class C1.) +class C1 extends A with T // error + ^ +Test.scala:5: error: class C2 inherits conflicting members: + method f in trait T of type => Int and + method f in trait A of type ()Int +(Note: this can be resolved by declaring an override in class C2.) +class C2 extends T with A // error + ^ +Test.scala:14: error: overriding method f in trait A of type ()Int; + method f needs `override' modifier + def f() = 9999 // need override modifier + ^ +three errors found diff --git a/test/files/neg/sd128/A.java b/test/files/neg/sd128/A.java new file mode 100644 index 0000000000..6774deba2e --- /dev/null +++ b/test/files/neg/sd128/A.java @@ -0,0 +1,3 @@ +interface A { + default int f() { return -10; } +} diff --git a/test/files/neg/sd128/Test.scala b/test/files/neg/sd128/Test.scala new file mode 100644 index 0000000000..66ca3d0940 --- /dev/null +++ b/test/files/neg/sd128/Test.scala @@ -0,0 +1,19 @@ +trait T { + def f = 99 +} +class C1 extends A with T // error +class C2 extends T with A // error + +trait U extends A { + override def f = 999 +} +class D1 extends A with U // OK +class D2 extends U with A // OK + +class E1 extends A { + def f() = 9999 // need override modifier +} + +class E2 extends A { + override def f() = 9999 // OK +} -- cgit v1.2.3