From b55ef01e5496bfaa223c4d17e9349f22990b42c9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 11 Jul 2012 20:13:33 +0400 Subject: [PATCH] KT-2382 Placing final modifier to overriden method in trait produces runtime exception #KT-2382 Fixed --- .../src/org/jetbrains/jet/codegen/FunctionCodegen.java | 5 ++++- compiler/testData/codegen/traits/finalMethod.jet | 9 +++++++++ compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/traits/finalMethod.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 25f389f7123..a54f455bc13 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -101,7 +101,10 @@ public class FunctionCodegen { Modality modality = functionDescriptor.getModality(); if (modality == Modality.FINAL) { - flags |= ACC_FINAL; + DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); + if (!(containingDeclaration instanceof ClassDescriptor) || ((ClassDescriptor)containingDeclaration).getKind() != ClassKind.TRAIT) { + flags |= ACC_FINAL; + } } OwnerKind kind = context.getContextKind(); diff --git a/compiler/testData/codegen/traits/finalMethod.jet b/compiler/testData/codegen/traits/finalMethod.jet new file mode 100644 index 00000000000..1469b0e10fb --- /dev/null +++ b/compiler/testData/codegen/traits/finalMethod.jet @@ -0,0 +1,9 @@ +//KT-2382 + +trait T { + final fun foo() = "OK" +} + +class S : T { } + +fun box(): String = S().foo() diff --git a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java index 4fc16527f88..de69932f454 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java @@ -68,4 +68,8 @@ public class TraitsTest extends CodegenTestCase { public void testKt2541() { blackBoxFile("regressions/kt2541.kt"); } + + public void testFinalMethod() throws Exception { + blackBoxFile("traits/finalMethod.jet"); + } }