From 6f7bf46ecea389d36fdc3c9813531b15aa629702 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 26 Mar 2019 14:37:45 +0100 Subject: [PATCH] Don't uncondtionally emit forwarders as ACC_SYNTHETIC It turns out that javac sometimes gets confused when a non-synthetic abstract method is overridden by a synthetic method in a derived class. --- compiler/src/dotty/tools/dotc/transform/MixinOps.scala | 2 +- tests/pos-java-interop-separate/forwarder/Foo_1.scala | 7 +++++++ tests/pos-java-interop-separate/forwarder/Test_2.java | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tests/pos-java-interop-separate/forwarder/Foo_1.scala create mode 100644 tests/pos-java-interop-separate/forwarder/Test_2.java diff --git a/compiler/src/dotty/tools/dotc/transform/MixinOps.scala b/compiler/src/dotty/tools/dotc/transform/MixinOps.scala index 3ac082959a46..532a08aecea1 100644 --- a/compiler/src/dotty/tools/dotc/transform/MixinOps.scala +++ b/compiler/src/dotty/tools/dotc/transform/MixinOps.scala @@ -22,7 +22,7 @@ class MixinOps(cls: ClassSymbol, thisPhase: DenotTransformer)(implicit ctx: Cont val res = member.copy( owner = cls, name = member.name.stripScala2LocalSuffix, - flags = member.flags &~ Deferred | Synthetic | Artifact | extraFlags, + flags = member.flags &~ Deferred | Synthetic | extraFlags, info = cls.thisType.memberInfo(member)).enteredAfter(thisPhase).asTerm res.addAnnotations(member.annotations.filter(_.symbol != defn.TailrecAnnot)) res diff --git a/tests/pos-java-interop-separate/forwarder/Foo_1.scala b/tests/pos-java-interop-separate/forwarder/Foo_1.scala new file mode 100644 index 000000000000..92f46fb51577 --- /dev/null +++ b/tests/pos-java-interop-separate/forwarder/Foo_1.scala @@ -0,0 +1,7 @@ +import java.util.List + +trait Foo { + val x: List[String] = null +} +abstract class Bar extends Foo + diff --git a/tests/pos-java-interop-separate/forwarder/Test_2.java b/tests/pos-java-interop-separate/forwarder/Test_2.java new file mode 100644 index 000000000000..0a7856008909 --- /dev/null +++ b/tests/pos-java-interop-separate/forwarder/Test_2.java @@ -0,0 +1,5 @@ +class Test_2 { + public void foo() { + new Bar() {}; + } +}