K2: add reproduction for KT-59514

This commit is contained in:
Mikhail Glukhikh
2023-09-21 16:18:22 +02:00
committed by Space Team
parent 4e89dcf031
commit d4ec088afe
9 changed files with 375 additions and 0 deletions
@@ -0,0 +1,137 @@
// JSPECIFY_STATE: strict
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-59514
// FILE: lib/En.java
package lib;
public interface En<K extends Pr> extends Se<K> {}
// FILE: lib/Ke.java
package lib;
public interface Ke extends Ta {}
// FILE: lib/Pr.java
package lib;
public interface Pr extends Ke {}
// FILE: lib/R.java
package lib;
public interface R<T> {
interface MR<T> extends R<T> {}
interface F<S, T> extends R<T> {}
interface FMR<S, T> extends F<S, T>, MR<T> {}
}
// FILE: lib/Se.java
package lib;
public interface Se<R extends Ta> {
}
// FILE: lib/Ta.java
package lib;
public interface Ta {
}
// FILE: lib/Il.java
package lib;
import org.jspecify.nullness.NullMarked;
@NullMarked
public abstract class Il<E> implements java.util.List<E> {
}
// FILE: lib/a/C.java
package lib.a;
import lib.Ta;
import lib.Se;
import lib.R;
import lib.Il;
class B {}
public final class C {
public static <R extends Ta, S extends Se<R>> Fr<R, S> from(Class<S> c) {
return null;
}
public interface WithL<T extends Ta, S extends Se<T>>
extends CanWithB<T, S>, R.F<S, Il<S>> {}
public interface CanWithL<T extends Ta, S extends Se<T>> {
WithL<T, S> withL(int l);
}
public interface Fr<T extends Ta, S extends Se<T>>
extends CanWithL<T, S>, R.F<S, Il<S>> {}
public interface CanWithB<T extends Ta, S extends Se<T>> extends R.F<S, Il<S>> {
WithB<T, S> withB(B b);
}
public interface WithB<T extends Ta, S extends Se<T>> extends R.F<S, Il<S>> {}
static public class MyWithL<R extends Ta, S extends Se<R>> implements WithL<R, S> {
public WithB<R, S> withB(B b) {
return null;
}
}
}
// FILE: lib/a/Eq.kt
package lib.a
import lib.Se
import lib.Ta
data class A<R : Ta, S : Se<out R>>(val a: Class<out S>) {
companion object {
@JvmStatic
fun <R : Ta, S : Se<R>> of(b: Class<out S>): A<R, S> = A(b)
}
}
class Eq<R : Ta, S : Se<R>>(val a: A<R, S>) : C.Fr<R, S> {
override fun withL(l: Int): C.WithL<R, S> {
return C.MyWithL<R, S>()
}
}
// FILE: repro/Repro.kt
package repro
import lib.R
import lib.a.C
import lib.Ke
import lib.Pr
import lib.En
abstract class Repro {
abstract fun <T> f(r: R<T>): T
abstract fun <P : Pr, E : En<P>> g(p: P): R.FMR<E, E>
private fun isTableValid(c: Class<En<Pr>>, key: Pr, b: Boolean) {
<!NEW_INFERENCE_ERROR!>if (b) {
f(g(key))
} else {
f(C.from(c).withL(1))
}<!>
}
}
@@ -0,0 +1,65 @@
FILE: Eq.kt
package lib.a
public final data class A<R : R|lib/Ta|, S : R|lib/Se<out R>|> : R|kotlin/Any| {
public constructor<R : R|lib/Ta|, S : R|lib/Se<out R>|>(a: R|java/lang/Class<out S>|): R|lib/a/A<R, S>| {
super<R|kotlin/Any|>()
}
public final val a: R|java/lang/Class<out S>| = R|<local>/a|
public get(): R|java/lang/Class<out S>|
public final companion object Companion : R|kotlin/Any| {
private constructor(): R|lib/a/A.Companion| {
super<R|kotlin/Any|>()
}
@R|kotlin/jvm/JvmStatic|() public final fun <R : R|lib/Ta|, S : R|lib/Se<R>|> of(b: R|java/lang/Class<out S>|): R|lib/a/A<R, S>| {
^of R|lib/a/A.A|<R|R|, R|S|>(R|<local>/b|)
}
}
public final operator fun component1(): R|java/lang/Class<out S>|
public final fun copy(a: R|java/lang/Class<out S>| = this@R|lib/a/A|.R|lib/a/A.a|): R|lib/a/A<R, S>|
}
public final class Eq<R : R|lib/Ta|, S : R|lib/Se<R>|> : R|lib/a/C.Fr<R, S>| {
public constructor<R : R|lib/Ta|, S : R|lib/Se<R>|>(a: R|lib/a/A<R, S>|): R|lib/a/Eq<R, S>| {
super<R|kotlin/Any|>()
}
public final val a: R|lib/a/A<R, S>| = R|<local>/a|
public get(): R|lib/a/A<R, S>|
public open override fun withL(l: R|kotlin/Int|): R|lib/a/C.WithL<R, S>| {
^withL Q|lib/a/C|.R|lib/a/C.MyWithL.MyWithL|<R|R|, R|S|>()
}
}
FILE: Repro.kt
package repro
public abstract class Repro : R|kotlin/Any| {
public constructor(): R|repro/Repro| {
super<R|kotlin/Any|>()
}
public abstract fun <T> f(r: R|lib/R<T>|): R|T|
public abstract fun <P : R|lib/Pr|, E : R|lib/En<P>|> g(p: R|P|): R|lib/R.FMR<E, E>|
private final fun isTableValid(c: R|java/lang/Class<lib/En<lib/Pr>>|, key: R|lib/Pr|, b: R|kotlin/Boolean|): R|kotlin/Unit| {
when () {
R|<local>/b| -> {
this@R|repro/Repro|.R|repro/Repro.f|<R|ft<lib/En<lib/Pr>, lib/En<lib/Pr>?>|>(this@R|repro/Repro|.R|repro/Repro.g|<R|lib/Pr|, R|ft<lib/En<lib/Pr>, lib/En<lib/Pr>?>|>(R|<local>/key|))
}
else -> {
this@R|repro/Repro|.R|repro/Repro.f|<R|ft<lib/Il<ft<@EnhancedNullability lib/En<lib/Pr>, @EnhancedNullability lib/En<lib/Pr>?>>, lib/Il<ft<@EnhancedNullability lib/En<lib/Pr>, @EnhancedNullability lib/En<lib/Pr>?>>?>|>(Q|lib/a/C|.R|lib/a/C.from*s|<R|lib/Pr!|, R|ft<lib/En<lib/Pr>, lib/En<lib/Pr>?>|>(R|<local>/c|).R|SubstitutionOverride<lib/a/C.Fr.withL: R|ft<lib/a/C.WithL<lib/Pr!, ft<lib/En<lib/Pr>, lib/En<lib/Pr>?>>, lib/a/C.WithL<lib/Pr!, ft<lib/En<lib/Pr>, lib/En<lib/Pr>?>>?>|>|(Int(1)))
}
}
}
}
@@ -0,0 +1,137 @@
// JSPECIFY_STATE: strict
// WITH_STDLIB
// FIR_DUMP
// ISSUE: KT-59514
// FILE: lib/En.java
package lib;
public interface En<K extends Pr> extends Se<K> {}
// FILE: lib/Ke.java
package lib;
public interface Ke extends Ta {}
// FILE: lib/Pr.java
package lib;
public interface Pr extends Ke {}
// FILE: lib/R.java
package lib;
public interface R<T> {
interface MR<T> extends R<T> {}
interface F<S, T> extends R<T> {}
interface FMR<S, T> extends F<S, T>, MR<T> {}
}
// FILE: lib/Se.java
package lib;
public interface Se<R extends Ta> {
}
// FILE: lib/Ta.java
package lib;
public interface Ta {
}
// FILE: lib/Il.java
package lib;
import org.jspecify.nullness.NullMarked;
@NullMarked
public abstract class Il<E> implements java.util.List<E> {
}
// FILE: lib/a/C.java
package lib.a;
import lib.Ta;
import lib.Se;
import lib.R;
import lib.Il;
class B {}
public final class C {
public static <R extends Ta, S extends Se<R>> Fr<R, S> from(Class<S> c) {
return null;
}
public interface WithL<T extends Ta, S extends Se<T>>
extends CanWithB<T, S>, R.F<S, Il<S>> {}
public interface CanWithL<T extends Ta, S extends Se<T>> {
WithL<T, S> withL(int l);
}
public interface Fr<T extends Ta, S extends Se<T>>
extends CanWithL<T, S>, R.F<S, Il<S>> {}
public interface CanWithB<T extends Ta, S extends Se<T>> extends R.F<S, Il<S>> {
WithB<T, S> withB(B b);
}
public interface WithB<T extends Ta, S extends Se<T>> extends R.F<S, Il<S>> {}
static public class MyWithL<R extends Ta, S extends Se<R>> implements WithL<R, S> {
public WithB<R, S> withB(B b) {
return null;
}
}
}
// FILE: lib/a/Eq.kt
package lib.a
import lib.Se
import lib.Ta
data class A<R : Ta, S : Se<out R>>(val a: Class<out S>) {
companion object {
@JvmStatic
fun <R : Ta, S : Se<R>> of(b: Class<out S>): A<R, S> = A(b)
}
}
class Eq<R : Ta, S : Se<R>>(val a: A<R, S>) : C.Fr<R, S> {
override fun withL(l: Int): C.WithL<R, S> {
return C.MyWithL<R, S>()
}
}
// FILE: repro/Repro.kt
package repro
import lib.R
import lib.a.C
import lib.Ke
import lib.Pr
import lib.En
abstract class Repro {
abstract fun <T> f(r: R<T>): T
abstract fun <P : Pr, E : En<P>> g(p: P): R.FMR<E, E>
private fun isTableValid(c: Class<En<Pr>>, key: Pr, b: Boolean) {
if (b) {
f(g(key))
} else {
f(C.from(c).withL(1))
}
}
}