diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 93fdebaa290..9acbcfdb981 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -162,6 +162,10 @@ public interface Errors { DiagnosticFactory0 REIFIED_TYPE_IN_CATCH_CLAUSE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 TYPE_PARAMETER_IN_CATCH_CLAUSE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 GENERIC_THROWABLE_SUBCLASS = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS = + DiagnosticFactory0.create(ERROR, DECLARATION_NAME); + DiagnosticFactory0 INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS_WARNING = + DiagnosticFactory0.create(WARNING, DECLARATION_NAME); DiagnosticFactory0 TOPLEVEL_TYPEALIASES_ONLY = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 RECURSIVE_TYPEALIAS_EXPANSION = DiagnosticFactory1.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 3b82f8970ca..f9a3d1883e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -661,6 +661,8 @@ public class DefaultErrorMessages { MAP.put(REIFIED_TYPE_IN_CATCH_CLAUSE, "Reified type is forbidden for catch parameter"); MAP.put(TYPE_PARAMETER_IN_CATCH_CLAUSE, "Type parameter is forbidden for catch parameter"); MAP.put(GENERIC_THROWABLE_SUBCLASS, "Subclass of 'Throwable' may not have type parameters"); + MAP.put(INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS, "Inner class of generic class extending 'Throwable' is prohibited"); + MAP.put(INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS_WARNING, "Inner class of generic class extending 'Throwable' is deprecated"); MAP.put(TYPE_MISMATCH_IN_FOR_LOOP, "The loop iterates over values of type {0} but the parameter is declared to be {1}", RENDER_TYPE, RENDER_TYPE); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 93696ab7927..d01f464d38b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -542,10 +542,21 @@ public class BodyResolver { trace.report(DATA_CLASS_CANNOT_HAVE_CLASS_SUPERTYPES.on(typeReference)); addSupertype = false; } - else if (DescriptorUtils.isSubclass(classDescriptor, builtIns.getThrowable()) && - !supertypeOwner.getDeclaredTypeParameters().isEmpty()) { - trace.report(GENERIC_THROWABLE_SUBCLASS.on(ktClassOrObject.getTypeParameterList())); - addSupertype = false; + else if (DescriptorUtils.isSubclass(classDescriptor, builtIns.getThrowable())) { + if (!supertypeOwner.getDeclaredTypeParameters().isEmpty()) { + trace.report(GENERIC_THROWABLE_SUBCLASS.on(ktClassOrObject.getTypeParameterList())); + addSupertype = false; + } + else if (!supertypeOwner.getTypeConstructor().getParameters().isEmpty()) { + if (languageVersionSettings + .supportsFeature(LanguageFeature.ProhibitInnerClassesOfGenericClassExtendingThrowable)) { + trace.report(INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS.on(ktClassOrObject)); + addSupertype = false; + } + else { + trace.report(INNER_CLASS_OF_GENERIC_THROWABLE_SUBCLASS_WARNING.on(ktClassOrObject)); + } + } } if (classAppeared) { diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.kt b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.kt new file mode 100644 index 00000000000..233dbb70cb3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.kt @@ -0,0 +1,40 @@ +// !LANGUAGE: +ProhibitInnerClassesOfGenericClassExtendingThrowable +// !DIAGNOSTICS: -UNUSED_VARIABLE + +class OuterGeneric { + inner class ErrorInnerExn : Exception() + + inner class InnerA { + inner class ErrorInnerExn2 : Exception() + } + + class OkNestedExn : Exception() + + val errorAnonymousObjectExn = object : Exception() {} + + fun foo() { + class OkLocalExn : Exception() + + val errorAnonymousObjectExn = object : Exception() {} + } + + fun genericFoo() { + class OkLocalExn : Exception() + + class LocalGeneric { + inner class ErrorInnerExnOfLocalGeneric : Exception() + } + } +} + +class Outer { + inner class InnerGeneric { + inner class ErrorInnerExn : Exception() + } +} + +fun genericFoo() { + class ErrorLocalExnInGenericFun : Exception() + + val errorkAnonymousObjectExnInGenericFun = object : Exception() {} +} diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.txt b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.txt new file mode 100644 index 00000000000..7f61b416c9b --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.txt @@ -0,0 +1,110 @@ +package + +public fun genericFoo(): kotlin.Unit + +public final class Outer { + public constructor Outer() + 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 + + public final inner class InnerGeneric { + public constructor InnerGeneric() + 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 + + public final inner class ErrorInnerExn /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } +} + +public final class OuterGeneric { + public constructor OuterGeneric() + public final val errorAnonymousObjectExn: kotlin.Exception /* = java.lang.Exception */ + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Unit + public final fun genericFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final inner class ErrorInnerExn /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public final inner class InnerA /*captured type parameters: /*0*/ T*/ { + public constructor InnerA() + 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 + + public final inner class ErrorInnerExn2 /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn2() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } + + public final class OkNestedExn : kotlin.Exception /* = java.lang.Exception */ { + public constructor OkNestedExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.kt b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.kt new file mode 100644 index 00000000000..5d9386ed0f2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.kt @@ -0,0 +1,40 @@ +// !LANGUAGE: -ProhibitInnerClassesOfGenericClassExtendingThrowable +// !DIAGNOSTICS: -UNUSED_VARIABLE + +class OuterGeneric { + inner class ErrorInnerExn : Exception() + + inner class InnerA { + inner class ErrorInnerExn2 : Exception() + } + + class OkNestedExn : Exception() + + val errorAnonymousObjectExn = object : Exception() {} + + fun foo() { + class OkLocalExn : Exception() + + val errorAnonymousObjectExn = object : Exception() {} + } + + fun genericFoo() { + class OkLocalExn : Exception() + + class LocalGeneric { + inner class ErrorInnerExnOfLocalGeneric : Exception() + } + } +} + +class Outer { + inner class InnerGeneric { + inner class ErrorInnerExn : Exception() + } +} + +fun genericFoo() { + class ErrorLocalExnInGenericFun : Exception() + + val errorkAnonymousObjectExnInGenericFun = object : Exception() {} +} diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.txt b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.txt new file mode 100644 index 00000000000..7f61b416c9b --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.txt @@ -0,0 +1,110 @@ +package + +public fun genericFoo(): kotlin.Unit + +public final class Outer { + public constructor Outer() + 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 + + public final inner class InnerGeneric { + public constructor InnerGeneric() + 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 + + public final inner class ErrorInnerExn /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } +} + +public final class OuterGeneric { + public constructor OuterGeneric() + public final val errorAnonymousObjectExn: kotlin.Exception /* = java.lang.Exception */ + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Unit + public final fun genericFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final inner class ErrorInnerExn /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public final inner class InnerA /*captured type parameters: /*0*/ T*/ { + public constructor InnerA() + 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 + + public final inner class ErrorInnerExn2 /*captured type parameters: /*0*/ T*/ : kotlin.Exception /* = java.lang.Exception */ { + public constructor ErrorInnerExn2() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } + + public final class OkNestedExn : kotlin.Exception /* = java.lang.Exception */ { + public constructor OkNestedExn() + public open override /*1*/ /*fake_override*/ val cause: kotlin.Throwable? + public open override /*1*/ /*fake_override*/ val message: kotlin.String? + public final override /*1*/ /*fake_override*/ fun addSuppressed(/*0*/ exception: kotlin.Throwable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun fillInStackTrace(): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun getLocalizedMessage(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun getStackTrace(): kotlin.Array<(out) java.lang.StackTraceElement!>! + public final override /*1*/ /*fake_override*/ fun getSuppressed(): kotlin.Array<(out) kotlin.Throwable!>! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun initCause(/*0*/ cause: kotlin.Throwable!): kotlin.Throwable! + public open override /*1*/ /*fake_override*/ fun printStackTrace(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintStream!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun printStackTrace(/*0*/ s: java.io.PrintWriter!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun setStackTrace(/*0*/ stackTrace: kotlin.Array<(out) java.lang.StackTraceElement!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.kt b/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.kt new file mode 100644 index 00000000000..2663318fe40 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.kt @@ -0,0 +1,27 @@ +// !LANGUAGE: +ProhibitInnerClassesOfGenericClassExtendingThrowable +package test + +var global: Throwable? = null + +fun foo(x: Throwable, z: T, b: (T) -> Unit) { + class A(val y : T) : Exception() + + try { + throw x + } catch (a: A) { + b(a.y) + } catch (e: Throwable) { + global = A(z) + } +} + +fun main(args: Array) { + foo(RuntimeException(), 1) { throw IllegalStateException() } + foo(global!!, "") { it.length } // (*) +} + +// (*): +//Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String +// at test.TestKt$main$2.invoke(test.kt) +// at test.TestKt.foo(test.kt:12) +// at test.TestKt.main(test.kt:21) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.txt b/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.txt new file mode 100644 index 00000000000..3fd82f3d0b2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.txt @@ -0,0 +1,7 @@ +package + +package test { + public var global: kotlin.Throwable? + public fun foo(/*0*/ x: kotlin.Throwable, /*1*/ z: T, /*2*/ b: (T) -> kotlin.Unit): kotlin.Unit + public fun main(/*0*/ args: kotlin.Array): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index c85c0289ea4..d6c90d80df9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -4498,12 +4498,30 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("catchInnerClassesOfGenerics.kt") + public void testCatchInnerClassesOfGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("catchInnerClassesOfGenerics_deprecation.kt") + public void testCatchInnerClassesOfGenerics_deprecation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.kt"); + doTest(fileName); + } + @TestMetadata("catchWithDefault.kt") public void testCatchWithDefault() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchWithDefault.kt"); doTest(fileName); } + @TestMetadata("catchingLocalClassesCapturingTypeParameters.kt") + public void testCatchingLocalClassesCapturingTypeParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.kt"); + doTest(fileName); + } + @TestMetadata("commonSupertypeOfT.kt") public void testCommonSupertypeOfT() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/commonSupertypeOfT.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 77099caf3b9..b270b0718dd 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -4498,12 +4498,30 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing doTest(fileName); } + @TestMetadata("catchInnerClassesOfGenerics.kt") + public void testCatchInnerClassesOfGenerics() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics.kt"); + doTest(fileName); + } + + @TestMetadata("catchInnerClassesOfGenerics_deprecation.kt") + public void testCatchInnerClassesOfGenerics_deprecation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchInnerClassesOfGenerics_deprecation.kt"); + doTest(fileName); + } + @TestMetadata("catchWithDefault.kt") public void testCatchWithDefault() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchWithDefault.kt"); doTest(fileName); } + @TestMetadata("catchingLocalClassesCapturingTypeParameters.kt") + public void testCatchingLocalClassesCapturingTypeParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/catchingLocalClassesCapturingTypeParameters.kt"); + doTest(fileName); + } + @TestMetadata("commonSupertypeOfT.kt") public void testCommonSupertypeOfT() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlStructures/commonSupertypeOfT.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index b47eb17ac67..f859963276a 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -69,6 +69,7 @@ enum class LanguageFeature( NestedClassesInEnumEntryShouldBeInner(KOTLIN_1_3), ProhibitDataClassesOverridingCopy(KOTLIN_1_3), RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes(KOTLIN_1_3), + ProhibitInnerClassesOfGenericClassExtendingThrowable(KOTLIN_1_3), // Experimental features