From e3fdc5d595247d80c3485bec50470f3f71a34ad1 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Mon, 13 Feb 2012 23:34:01 +0400 Subject: [PATCH] fix a case of fake override of abstract and non-abstract function === open class Ccc() { fun foo() = 1 } trait Ttt { fun foo(): Int } class Zzz() : Ccc(), Ttt // there must not be an error here === Reported by Andrey Breslav as a bug of Comparator implementation: === fun comparator(f: (T, T) -> Int): Comparator = object : Comparator, Object() { override fun compare(o1: T, o2: T): Int = f(o1, o2) } === --- .../jetbrains/jet/lang/resolve/OverrideResolver.java | 10 +++++++++- .../override/FakeOverrideAbstractAndNonAbstractFun.jet | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/override/FakeOverrideAbstractAndNonAbstractFun.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index b51f51a91af..673239d71c4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -357,7 +357,15 @@ public class OverrideResolver { abstractNoImpl.add(single); } } else { - manyImpl.addAll(overridenDeclarations); + List nonAbstractManyImpl = Lists.newArrayList(); + for (CallableMemberDescriptor overriden : overridenDeclarations) { + if (overriden.getModality() != Modality.ABSTRACT) { + nonAbstractManyImpl.add(overriden); + } + } + if (nonAbstractManyImpl.size() > 1) { + manyImpl.addAll(nonAbstractManyImpl); + } } } } diff --git a/compiler/testData/diagnostics/tests/override/FakeOverrideAbstractAndNonAbstractFun.jet b/compiler/testData/diagnostics/tests/override/FakeOverrideAbstractAndNonAbstractFun.jet new file mode 100644 index 00000000000..4ba1095f8fb --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/FakeOverrideAbstractAndNonAbstractFun.jet @@ -0,0 +1,9 @@ +open class Ccc() { + fun foo() = 1 +} + +trait Ttt { + fun foo(): Int +} + +class Zzz() : Ccc(), Ttt