Report error on missed specialization in compatibility mode

#KT-39603 Fixed
This commit is contained in:
Mikhail Bogdanov
2020-06-18 11:14:56 +02:00
parent a150e7b6e5
commit 9c0b96af71
32 changed files with 872 additions and 89 deletions
@@ -0,0 +1,69 @@
// !JVM_DEFAULT_MODE: all-compatibility
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Foo<T> {
fun test(p: T) = "fail"
val T.prop: String
get() = "fail"
}
interface FooDerived: Foo<String>
class Unspecialized<Y> : Foo<Y>
open class UnspecializedFromDerived : FooDerived
abstract class AbstractUnspecializedFromDerived : FooDerived
open class Specialized : Foo<String>
abstract class AbstractSpecialized : Foo<String>
@JvmDefaultWithoutCompatibility
open class UnspecializedFromDerivedNC : FooDerived
@JvmDefaultWithoutCompatibility
abstract class AbstractUnspecializedFromDerivedNC : FooDerived
@JvmDefaultWithoutCompatibility
open class SpecializedNC : Foo<String>
@JvmDefaultWithoutCompatibility
abstract class AbstractSpecializedNC : Foo<String>
final class FinalSpecialized : Foo<String>
sealed class SealedSpecialized : Foo<String> {
open class A : SealedSpecialized();
}
enum class EnumSpecialized : Foo<String> {
ENTRY {
fun test() = 123
}
}
object ObjectSpecialized : Foo<String>
private class Outer {
open class InnerSpecialized: Foo<String>
}
fun local() {
object : Foo<String> {}
}
fun interface F : Foo<String> {
fun invoke(o: String): String
}
fun test(): String {
if (F { o -> o + "K" }.invoke("O") != "OK") return "Fail"
val lambda: (String) -> String = { o -> o + "K" }
return F(lambda).invoke("O")
}
@@ -0,0 +1,69 @@
// !JVM_DEFAULT_MODE: all-compatibility
// JVM_TARGET: 1.8
// WITH_RUNTIME
interface Foo<T> {
fun test(p: T) = "fail"
val T.prop: String
get() = "fail"
}
interface FooDerived: Foo<String>
class Unspecialized<Y> : Foo<Y>
open class <!EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE, EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE!>UnspecializedFromDerived<!> : FooDerived
abstract class <!EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE, EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE!>AbstractUnspecializedFromDerived<!> : FooDerived
open class <!EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE, EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE!>Specialized<!> : Foo<String>
abstract class <!EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE, EXPLICIT_OVERRIDE_REQUIRED_IN_COMPATIBILITY_MODE!>AbstractSpecialized<!> : Foo<String>
@JvmDefaultWithoutCompatibility
open class UnspecializedFromDerivedNC : FooDerived
@JvmDefaultWithoutCompatibility
abstract class AbstractUnspecializedFromDerivedNC : FooDerived
@JvmDefaultWithoutCompatibility
open class SpecializedNC : Foo<String>
@JvmDefaultWithoutCompatibility
abstract class AbstractSpecializedNC : Foo<String>
final class FinalSpecialized : Foo<String>
sealed class SealedSpecialized : Foo<String> {
open class A : SealedSpecialized();
}
enum class EnumSpecialized : Foo<String> {
ENTRY {
fun test() = 123
}
}
object ObjectSpecialized : Foo<String>
private class Outer {
open class InnerSpecialized: Foo<String>
}
fun local() {
object : Foo<String> {}
}
fun interface F : Foo<String> {
fun invoke(o: String): String
}
fun test(): String {
if (F { o -> o + "K" }.invoke("O") != "OK") return "Fail"
val lambda: (String) -> String = { o -> o + "K" }
return F(lambda).invoke("O")
}
@@ -0,0 +1,183 @@
package
public fun local(): kotlin.Unit
public fun test(): kotlin.String
public abstract class AbstractSpecialized : Foo<kotlin.String> {
public constructor AbstractSpecialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmDefaultWithoutCompatibility public abstract class AbstractSpecializedNC : Foo<kotlin.String> {
public constructor AbstractSpecializedNC()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public abstract class AbstractUnspecializedFromDerived : FooDerived {
public constructor AbstractUnspecializedFromDerived()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmDefaultWithoutCompatibility public abstract class AbstractUnspecializedFromDerivedNC : FooDerived {
public constructor AbstractUnspecializedFromDerivedNC()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final enum class EnumSpecialized : kotlin.Enum<EnumSpecialized>, Foo<kotlin.String> {
enum entry ENTRY
private constructor EnumSpecialized()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: kotlin.String
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: EnumSpecialized): kotlin.Int
public final override /*2*/ /*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<EnumSpecialized!>!
public final override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun test(/*0*/ p: kotlin.String): kotlin.String
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): EnumSpecialized
public final /*synthesized*/ fun values(): kotlin.Array<EnumSpecialized>
}
public fun interface F : Foo<kotlin.String> {
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 abstract fun invoke(/*0*/ o: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class FinalSpecialized : Foo<kotlin.String> {
public constructor FinalSpecialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Foo</*0*/ T> {
public open val T.prop: 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 fun test(/*0*/ p: T): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface FooDerived : Foo<kotlin.String> {
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object ObjectSpecialized : Foo<kotlin.String> {
private constructor ObjectSpecialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
private 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 open class InnerSpecialized : Foo<kotlin.String> {
public constructor InnerSpecialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public sealed class SealedSpecialized : Foo<kotlin.String> {
private constructor SealedSpecialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public open class A : SealedSpecialized {
public constructor A()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public open class Specialized : Foo<kotlin.String> {
public constructor Specialized()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmDefaultWithoutCompatibility public open class SpecializedNC : Foo<kotlin.String> {
public constructor SpecializedNC()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Unspecialized</*0*/ Y> : Foo<Y> {
public constructor Unspecialized</*0*/ Y>()
public open override /*1*/ /*fake_override*/ val Y.prop: 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 test(/*0*/ p: Y): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class UnspecializedFromDerived : FooDerived {
public constructor UnspecializedFromDerived()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.jvm.JvmDefaultWithoutCompatibility public open class UnspecializedFromDerivedNC : FooDerived {
public constructor UnspecializedFromDerivedNC()
public open override /*1*/ /*fake_override*/ val kotlin.String.prop: 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 test(/*0*/ p: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}