diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 6a8c0af0162..79d693977f7 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -417,6 +417,7 @@ public final class DoubleRange : kotlin.Range, kotlin.Progression public abstract class Enum> : kotlin.Comparable { /*primary*/ public constructor Enum>(/*0*/ name: kotlin.String, /*1*/ ordinal: kotlin.Int) + protected final fun clone(): kotlin.Any public final override /*1*/ fun compareTo(/*0*/ other: E): kotlin.Int public final fun name(): kotlin.String public final fun ordinal(): kotlin.Int @@ -577,6 +578,7 @@ public interface Function { public final enum class InlineOption : kotlin.Enum { public enum entry LOCAL_CONTINUE_AND_BREAK : kotlin.InlineOption { /*primary*/ private constructor LOCAL_CONTINUE_AND_BREAK() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineOption): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int @@ -584,12 +586,14 @@ public final enum class InlineOption : kotlin.Enum { public enum entry ONLY_LOCAL_RETURN : kotlin.InlineOption { /*primary*/ private constructor ONLY_LOCAL_RETURN() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineOption): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int } /*primary*/ private constructor InlineOption() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineOption): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int @@ -602,6 +606,7 @@ public final enum class InlineOption : kotlin.Enum { public final enum class InlineStrategy : kotlin.Enum { public enum entry AS_FUNCTION : kotlin.InlineStrategy { /*primary*/ private constructor AS_FUNCTION() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineStrategy): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int @@ -609,12 +614,14 @@ public final enum class InlineStrategy : kotlin.Enum { public enum entry IN_PLACE : kotlin.InlineStrategy { /*primary*/ private constructor IN_PLACE() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineStrategy): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int } /*primary*/ private constructor InlineStrategy() + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: kotlin.InlineStrategy): kotlin.Int public final override /*1*/ /*fake_override*/ fun name(): kotlin.String public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.kt b/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.kt new file mode 100644 index 00000000000..3ec5aaef662 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.kt @@ -0,0 +1,6 @@ +enum class E : Cloneable { + A; + override fun clone(): Any { + return super.clone() + } +} diff --git a/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.txt b/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.txt new file mode 100644 index 00000000000..e509a83f2e7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.txt @@ -0,0 +1,27 @@ +package + +internal final enum class E : kotlin.Enum, kotlin.Cloneable { + public enum entry A : E { + private constructor A() + protected open override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + private constructor E() + protected open override /*2*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E): kotlin.Int + public final override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 63cb0343efe..eaff984e570 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -5298,6 +5298,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("kt8972_cloneNotAllowed.kt") + public void testKt8972_cloneNotAllowed() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/enum/kt8972_cloneNotAllowed.kt"); + doTest(fileName); + } + @TestMetadata("localEnums.kt") public void testLocalEnums() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/enum/localEnums.kt"); diff --git a/core/builtins/native/kotlin/Enum.kt b/core/builtins/native/kotlin/Enum.kt index 46f93c7a847..a93039f9155 100644 --- a/core/builtins/native/kotlin/Enum.kt +++ b/core/builtins/native/kotlin/Enum.kt @@ -37,6 +37,12 @@ public abstract class Enum>(name: String, ordinal: Int): Comparable< public override final fun compareTo(other: E): Int + /** + * Throws an exception since enum constants cannot be cloned. + * This method prevents enum classes from inheriting from [Cloneable]. + */ + protected final fun clone(): Any + public override final fun equals(other: Any?): Boolean public override final fun hashCode(): Int public override fun toString(): String diff --git a/idea/testData/structureView/fileStructure/InheritedMembersOfEnum.after b/idea/testData/structureView/fileStructure/InheritedMembersOfEnum.after index ec7a4f8fdef..f3a40d4f29c 100644 --- a/idea/testData/structureView/fileStructure/InheritedMembersOfEnum.after +++ b/idea/testData/structureView/fileStructure/InheritedMembersOfEnum.after @@ -1,5 +1,6 @@ -InheritedMembersOfEnum.kt -Test + clone(): Any location=→Enum compareTo(E): Int location=→Enum equals(Any?): Boolean location=→Enum FIRST