// FILE: kotlin.kt package kotlin import kotlin.reflect.KClass @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR) @Retention(AnnotationRetention.SOURCE) public annotation class Throws(vararg val exceptionClasses: KClass) public open class Exception : Throwable() public open class RuntimeException : Exception() public open class IllegalStateException : RuntimeException() // FILE: native.kt package kotlin.native @Deprecated("") public typealias Throws = kotlin.Throws // FILE: CancellationException.kt package kotlin.coroutines.cancellation public open class CancellationException() : IllegalStateException() // FILE: test.kt import kotlin.coroutines.cancellation.CancellationException class Exception1 : Throwable() class Exception2 : Throwable() class Exception3 : Throwable() @Throws fun foo() {} @Throws() fun throwsEmptyParens() {} @Throws(UnresolvedException::class) fun throwsUnresolved() {} @Throws(exceptionClasses = UnresolvedException::class) fun throwsNamedUnresolved() {} @Throws(exceptionClasses = []) fun throwsNamedEmptyLiteral() {} @Throws(exceptionClasses = arrayOf()) fun throwsNamedEmptyArrayOf() {} @Throws(*[]) fun throwsSpreadEmptyLiteral() {} @Throws(*arrayOf()) fun throwsSpreadEmptyArrayOf() {} @Throws(exceptionClasses = [UE::class]) fun throwsNamedLiteralWithUnresolved() {} @Throws(exceptionClasses = arrayOf(UE::class)) fun throwsNamedArrayOfUnresolved() {} @Throws(*[UE::class]) fun throwsSpreadLiteralWithUnresolved() {} @Throws(*arrayOf(UE::class)) fun throwsSpreadArrayOfUnresolved() {} typealias UEAlias = UE @Throws(UEAlias::class) fun throwsTypealiasToUnresolved() {} interface Base0 { fun foo() } class ThrowsOnOverride : Base0 { @Throws(Exception1::class) override fun foo() {} } interface Base1 { @Throws(Exception1::class) fun foo() } class InheritsThrowsAndNoThrows : Base0, Base1 { override fun foo() {} } class OverridesThrowsAndNoThrows : Base0, Base1 { @Throws(Exception1::class) override fun foo() {} } class SameThrowsOnOverride : Base1 { @Throws(Exception1::class) override fun foo() {} } class DifferentThrowsOnOverride : Base1 { @Throws(Exception2::class) override fun foo() {} } class HasThrowsWithEmptyListOnOverride : Base1 { @Throws override fun foo() {} } interface Base2 { @Throws(Exception2::class) fun foo() } open class InheritsDifferentThrows1 : Base1, Base2 { override fun foo() {} } open class OverridesDifferentThrows1_1 : Base1, Base2 { @Throws(Exception1::class) override fun foo() {} } open class OverridesDifferentThrows1_2 : Base1, Base2 { @Throws(Exception2::class) override fun foo() {} } open class OverridesDifferentThrows1_3 : Base1, Base2 { @Throws(Exception1::class, Exception2::class) override fun foo() {} } class InheritsDifferentThrowsThroughSameClass1 : InheritsDifferentThrows1() { override fun foo() {} } class OverridesDifferentThrowsThroughSameClass1 : InheritsDifferentThrows1() { @Throws(Exception1::class) override fun foo() {} } class OverridesDifferentThrowsThroughSameClass2 : InheritsDifferentThrows1() { @Throws(Exception2::class) override fun foo() {} } interface Base3 { @Throws(Exception3::class) fun foo() } class InheritsDifferentThrows2 : InheritsDifferentThrows1(), Base3 { override fun foo() {} } class OverridesDifferentThrows2 : InheritsDifferentThrows1(), Base3 { @Throws(Exception3::class) override fun foo() {} } open class OverridesDifferentThrows3 : Base1, Base2 { @Throws(Exception3::class) override fun foo() {} } class InheritsDifferentThrows3 : OverridesDifferentThrows3() { override fun foo() {} } class OverrideDifferentThrows4 : OverridesDifferentThrows3() { override fun foo() {} } class OverrideDifferentThrows5 : OverridesDifferentThrows3() { @Throws(Exception3::class) override fun foo() {} } class OverrideDifferentThrows6 : OverridesDifferentThrows3() { @Throws(Exception1::class) override fun foo() {} } interface Base4 { @Throws(Exception1::class) fun foo() } class InheritsSameThrows : Base1, Base4 { override fun foo() {} } class OverridesSameThrows : Base1, Base4 { @Throws(Exception1::class) override fun foo() {} } class OverrideDifferentThrows7 : Base1, Base4 { @Throws(Exception2::class) override fun foo() {} } class OverrideDifferentThrows8 : Base1, Base3 { @Throws(Exception2::class) override fun foo() {} } interface Base5 { @Throws(Exception1::class, Exception2::class) fun foo() } interface Base6 { @Throws(Exception2::class, Exception1::class) fun foo() } class InheritsSameThrowsMultiple : Base5, Base6 { override fun foo() {} } class OverridesSameThrowsMultiple1 : Base5, Base6 { @Throws(Exception1::class, Exception2::class) override fun foo() {} } class OverridesSameThrowsMultiple2 : Base5, Base6 { @Throws(Exception2::class, Exception1::class) override fun foo() {} } class OverridesDifferentThrowsMultiple : Base5, Base6 { @Throws(Exception1::class) override fun foo() {} } fun withLocalClass() { class LocalException : Throwable() abstract class Base7 { @Throws(Exception1::class, LocalException::class) abstract fun foo() } class InheritsDifferentThrowsLocal : Base1, Base7() { override fun foo() {} } class OverridesDifferentThrowsLocal : Base1, Base7() { @Throws(Exception1::class, LocalException::class) override fun foo() {} } } interface ThrowsOnFakeOverride : Base1 class InheritThrowsOnFakeOverride : ThrowsOnFakeOverride { override fun foo() {} } class OverrideDifferentThrowsOnFakeOverride : ThrowsOnFakeOverride { @Throws(Exception2::class) override fun foo() {} } interface IncompatibleThrowsOnFakeOverride : Base1, Base2 class OverrideIncompatibleThrowsOnFakeOverride1 : IncompatibleThrowsOnFakeOverride { @Throws(Exception1::class) override fun foo() {} } class OverrideIncompatibleThrowsOnFakeOverride2 : IncompatibleThrowsOnFakeOverride { @Throws(Exception2::class) override fun foo() {} } class InheritIncompatibleThrowsOnFakeOverride : IncompatibleThrowsOnFakeOverride { override fun foo() {} } @Throws suspend fun suspendThrowsNothing() {} interface SuspendFun { suspend fun foo() } class OverrideImplicitThrowsOnSuspendWithExplicit : SuspendFun { // Although `SuspendFun.foo` effectively has `@Throws(CancellationException::class)`, // overriding it with equal explicit `@Throws` is forbidden: @Throws(CancellationException::class) override suspend fun foo() {} } interface SuspendFunThrows { @Throws(CancellationException::class) suspend fun foo() {} } class InheritExplicitThrowsOnSuspend : SuspendFunThrows { override suspend fun foo() {} } @Throws(Exception1::class) suspend fun suspendDoesNotThrowCancellationException1() {} @Throws(Exception1::class, Exception2::class) suspend fun suspendDoesNotThrowCancellationException2() {} @Throws(UE::class) suspend fun suspendThrowsUnresolved() {} @Throws(exceptionClasses = UE::class) suspend fun suspendThrowsNamedUnresolved() {} @Throws(exceptionClasses = []) suspend fun suspendThrowsNamedEmptyLiteral() {} @Throws(exceptionClasses = arrayOf()) suspend fun suspendThrowsNamedEmptyArrayOf() {} @Throws(*[]) suspend fun suspendThrowsSpreadEmptyLiteral() {} @Throws(*arrayOf()) suspend fun suspendThrowsSpreadEmptyArrayOf() {} @Throws(exceptionClasses = [UE::class]) suspend fun suspendThrowsNamedLiteralWithUnresolved() {} @Throws(exceptionClasses = arrayOf(UE::class)) suspend fun suspendThrowsNamedArrayOfUnresolved() {} @Throws(*[UE::class]) suspend fun suspendThrowsSpreadLiteralWithUnresolved() {} @Throws(*arrayOf(UE::class)) suspend fun suspendThrowsSpreadArrayOfUnresolved() {} @Throws(UEAlias::class) suspend fun suspendThrowsTypealiasToUnresolved() {} @Throws(Exception1::class, CancellationException::class) suspend fun suspendThrowsCancellationException1() {} @Throws(CancellationException::class, Exception1::class) suspend fun suspendThrowsCancellationException2() {} typealias CancellationExceptionAlias = CancellationException @Throws(CancellationExceptionAlias::class) suspend fun suspendThrowsCancellationExceptionTypealias() {} @Throws(IllegalStateException::class) suspend fun suspendThrowsIllegalStateException1() {} @Throws(Exception2::class, IllegalStateException::class) suspend fun suspendThrowsIllegalStateException2() {} typealias IllegalStateExceptionAlias = IllegalStateException @Throws(IllegalStateExceptionAlias::class) suspend fun suspendThrowsIllegalStateExceptionTypealias() {} @Throws(RuntimeException::class) suspend fun suspendThrowsRuntimeException1() {} @Throws(RuntimeException::class, Exception3::class) suspend fun suspendThrowsRuntimeException2() {} typealias RuntimeExceptionAlias = RuntimeException @Throws(RuntimeExceptionAlias::class) suspend fun suspendThrowsRuntimeExceptionTypealias() {} @Throws(Exception::class) suspend fun suspendThrowsException1() {} @Throws(Exception1::class, Exception::class) suspend fun suspendThrowsException2() {} typealias ExceptionAlias = Exception @Throws(ExceptionAlias::class) suspend fun suspendThrowsExceptionTypealias() {} @Throws(Throwable::class) suspend fun suspendThrowsThrowable1() {} @Throws(Throwable::class, Exception2::class) suspend fun suspendThrowsThrowable2() {} @Throws(Throwable::class, CancellationException::class) suspend fun suspendThrowsThrowable3() {} typealias ThrowableAlias = Throwable @Throws(ThrowableAlias::class) suspend fun suspendThrowsThrowableTypealias() {}