diff --git a/compiler/testData/builtin-classes-kotlin.txt b/compiler/testData/builtin-classes-kotlin.txt index bc4f558fa6c..c9f248c9a7f 100644 --- a/compiler/testData/builtin-classes-kotlin.txt +++ b/compiler/testData/builtin-classes-kotlin.txt @@ -674,10 +674,10 @@ public open class Throwable { public constructor Throwable(/*0*/ message: kotlin.String?) /*primary*/ public constructor Throwable(/*0*/ message: kotlin.String?, /*1*/ cause: kotlin.Throwable?) public constructor Throwable(/*0*/ cause: kotlin.Throwable?) - public final val cause: kotlin.Throwable? - public final fun (): kotlin.Throwable? - public final val message: kotlin.String? - public final fun (): kotlin.String? + public open val cause: kotlin.Throwable? + public open fun (): kotlin.Throwable? + public open val message: kotlin.String? + public open fun (): kotlin.String? } public object Unit { diff --git a/compiler/testData/codegen/box/specialBuiltins/throwableImpl.kt b/compiler/testData/codegen/box/specialBuiltins/throwableImpl.kt new file mode 100644 index 00000000000..2f6aeaa6b55 --- /dev/null +++ b/compiler/testData/codegen/box/specialBuiltins/throwableImpl.kt @@ -0,0 +1,21 @@ +class MyThrowable(message: String? = null, cause: Throwable? = null) : Throwable(message, cause) { + + override val message: String? + get() = "My message: " + super.message + + override val cause: Throwable? + get() = super.cause ?: this + +} + +fun box(): String { + try { + throw MyThrowable("test") + } catch (t: MyThrowable) { + if (t.cause != t) return "fail t.cause" + if (t.message != "My message: test") return "fail t.message" + return "OK" + } + + return "fail: MyThrowable wasn't catched." +} diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/ClassMembers.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/ClassMembers.txt index 9f47baf99c4..7ac840e1926 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/ClassMembers.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/ClassMembers.txt @@ -2,14 +2,14 @@ package test public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class E2 : java.lang.Exception { public constructor E2() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/Constructor.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/Constructor.txt index 18b5968f138..6629b496e2f 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/Constructor.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/Constructor.txt @@ -2,14 +2,14 @@ package test public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class E2 : java.lang.Exception { public constructor E2() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/DefaultArgs.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/DefaultArgs.txt index ce72361ebee..83f59565e61 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/DefaultArgs.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/DefaultArgs.txt @@ -4,8 +4,8 @@ package test public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/Delegation.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/Delegation.txt index abd2f085409..4e66a6e62d3 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/Delegation.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/Delegation.txt @@ -2,14 +2,14 @@ package test public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class E2 : java.lang.Exception { public constructor E2() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class Impl : test.Trait { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/GenericSubstitution.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/GenericSubstitution.txt index e432b2bc225..6c2e57e3643 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/GenericSubstitution.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/GenericSubstitution.txt @@ -11,8 +11,8 @@ public final class Derived : test.Base { public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/TopLevel.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/TopLevel.txt index ef46713b647..adc829404fb 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/TopLevel.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/TopLevel.txt @@ -6,14 +6,14 @@ public fun two(): kotlin.Unit public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class E2 : java.lang.Exception { public constructor E2() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/compileJavaAgainstKotlin/method/throws/TraitMembers.txt b/compiler/testData/compileJavaAgainstKotlin/method/throws/TraitMembers.txt index 370bc73dea0..ecebc4d9884 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/throws/TraitMembers.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/throws/TraitMembers.txt @@ -2,14 +2,14 @@ package test public final class E1 : java.lang.Exception { public constructor E1() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public final class E2 : java.lang.Exception { public constructor E2() - public final /*fake_override*/ val cause: kotlin.Throwable? - public final /*fake_override*/ val message: kotlin.String? + public open /*fake_override*/ val cause: kotlin.Throwable? + public open /*fake_override*/ val message: kotlin.String? } public/*package*/ open class JavaClass { diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchGenerics.txt b/compiler/testData/diagnostics/tests/controlStructures/catchGenerics.txt index 5e3b067858b..55ddad66b6e 100644 --- a/compiler/testData/diagnostics/tests/controlStructures/catchGenerics.txt +++ b/compiler/testData/diagnostics/tests/controlStructures/catchGenerics.txt @@ -5,8 +5,8 @@ public inline fun tryCatch(/*0* public final class XException : kotlin.Throwable { public constructor XException(/*0*/ p: T) - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public final val p: T public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -15,8 +15,8 @@ public final class XException : kotlin.Throwable { public final class YException : java.lang.RuntimeException { public constructor YException(/*0*/ p: T) - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public final val p: T public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -25,8 +25,8 @@ public final class YException : java.lang.RuntimeException { public final class ZException : java.lang.Exception { public constructor ZException(/*0*/ p: T) - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public final val p: T public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/regressions/kt498.txt b/compiler/testData/diagnostics/tests/regressions/kt498.txt index f4cb87a3793..048a01821e5 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt498.txt +++ b/compiler/testData/diagnostics/tests/regressions/kt498.txt @@ -4,8 +4,8 @@ public fun T.getJavaClass(): java.lang.Class public final class IdUnavailableException : java.lang.Exception { public constructor IdUnavailableException() - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/initInTryReturnInCatch.txt b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/initInTryReturnInCatch.txt index 917a26e2ab0..595083eed75 100644 --- a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/initInTryReturnInCatch.txt +++ b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/initInTryReturnInCatch.txt @@ -9,8 +9,8 @@ public fun test6(): kotlin.Unit public final class A : java.lang.Exception { public constructor A() - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String @@ -18,8 +18,8 @@ public final class A : java.lang.Exception { public final class B : java.lang.Exception { public constructor B() - public final override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? - public final override /*1*/ /*fake_override*/ val message: kotlin.String? + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index feff112f481..51df8e3387c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -7492,6 +7492,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("throwableImpl.kt") + public void testThrowableImpl() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/specialBuiltins/throwableImpl.kt"); + doTest(fileName); + } + @TestMetadata("valuesInsideEnum.kt") public void testValuesInsideEnum() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/specialBuiltins/valuesInsideEnum.kt"); diff --git a/core/builtins/native/kotlin/Throwable.kt b/core/builtins/native/kotlin/Throwable.kt index 7a38d638692..ceda70568bf 100644 --- a/core/builtins/native/kotlin/Throwable.kt +++ b/core/builtins/native/kotlin/Throwable.kt @@ -22,7 +22,7 @@ package kotlin * @param message the detail message string. * @param cause the cause of this throwable. */ -public open class Throwable(val message: String?, val cause: Throwable?) { +public open class Throwable(open val message: String?, open val cause: Throwable?) { constructor(message: String?) : this(message, null) constructor(cause: Throwable?) : this(cause?.toString(), cause)