[FE] Make whens on expect sealed classes and enums not exhaustive
This commit is contained in:
+37
@@ -0,0 +1,37 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-20306
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect enum class Base {
|
||||
A, B
|
||||
}
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = when (base) { // must be an error
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual enum class Base {
|
||||
A, B, C
|
||||
}
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
Base.C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-20306
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect enum class Base {
|
||||
A, B
|
||||
}
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("enum"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual enum class Base {
|
||||
A, B, C
|
||||
}
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
Base.C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
Base.A -> 1
|
||||
Base.B -> 2
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
// -- Module: <m1-common> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final expect enum class Base : kotlin.Enum<Base> {
|
||||
expect enum entry A
|
||||
|
||||
expect enum entry B
|
||||
|
||||
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Base): 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Base
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<Base>
|
||||
}
|
||||
|
||||
// -- Module: <m1-jvm> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final actual enum class Base : kotlin.Enum<Base> {
|
||||
enum entry A
|
||||
|
||||
enum entry B
|
||||
|
||||
enum entry C
|
||||
|
||||
private constructor Base()
|
||||
public final override /*1*/ /*fake_override*/ val name: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
|
||||
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
|
||||
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Base): kotlin.Int
|
||||
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
|
||||
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<Base!>!
|
||||
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Base
|
||||
public final /*synthesized*/ fun values(): kotlin.Array<Base>
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-44474
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect sealed class Base()
|
||||
|
||||
class A : Base()
|
||||
object B : Base()
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = when (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual sealed class Base
|
||||
|
||||
// FILE: C.kt
|
||||
|
||||
class C : Base()
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
is A -> 1
|
||||
B -> 2
|
||||
is C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-44474
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect sealed class Base()
|
||||
|
||||
class A : Base()
|
||||
object B : Base()
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("sealed class"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'is C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual sealed class Base
|
||||
|
||||
// FILE: C.kt
|
||||
|
||||
class C : Base()
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
is A -> 1
|
||||
B -> 2
|
||||
is C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
// -- Module: <m1-common> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final class A : Base {
|
||||
public constructor A()
|
||||
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 object B : Base {
|
||||
private constructor B()
|
||||
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 sealed expect class Base {
|
||||
protected constructor Base()
|
||||
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
|
||||
}
|
||||
|
||||
// -- Module: <m1-jvm> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final class A : Base {
|
||||
public constructor A()
|
||||
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 object B : Base {
|
||||
private constructor B()
|
||||
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 sealed actual class Base {
|
||||
protected constructor Base()
|
||||
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 class C : Base {
|
||||
public constructor C()
|
||||
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
|
||||
}
|
||||
Vendored
+40
@@ -0,0 +1,40 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-44474
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect sealed interface Base
|
||||
|
||||
class A : Base
|
||||
object B : Base
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = when (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual sealed interface Base
|
||||
|
||||
// FILE: C.kt
|
||||
|
||||
interface C : Base
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
is A -> 1
|
||||
B -> 2
|
||||
is C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// ISSUE: KT-44474
|
||||
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
expect sealed interface Base
|
||||
|
||||
class A : Base
|
||||
object B : Base
|
||||
|
||||
fun testCommon(base: Base) {
|
||||
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("sealed interface"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'is C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
// MODULE: m1-jvm(m1-common)
|
||||
// FILE: Base.kt
|
||||
actual sealed interface Base
|
||||
|
||||
// FILE: C.kt
|
||||
|
||||
interface C : Base
|
||||
|
||||
fun testPlatformGood(base: Base) {
|
||||
val x = when (base) { // must be OK
|
||||
is A -> 1
|
||||
B -> 2
|
||||
is C -> 3
|
||||
}
|
||||
}
|
||||
|
||||
fun testPlatformBad(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
|
||||
is A -> 1
|
||||
B -> 2
|
||||
}
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// -- Module: <m1-common> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final class A : Base {
|
||||
public constructor A()
|
||||
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 object B : Base {
|
||||
private constructor B()
|
||||
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 sealed expect interface Base {
|
||||
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
|
||||
}
|
||||
|
||||
// -- Module: <m1-jvm> --
|
||||
package
|
||||
|
||||
public fun testCommon(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
|
||||
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
|
||||
|
||||
public final class A : Base {
|
||||
public constructor A()
|
||||
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 object B : Base {
|
||||
private constructor B()
|
||||
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 sealed actual interface Base {
|
||||
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 interface C : Base {
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user