K2: add reproduction for KT-59514
This commit is contained in:
committed by
Space Team
parent
4e89dcf031
commit
d4ec088afe
+137
@@ -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))
|
||||
}<!>
|
||||
}
|
||||
}
|
||||
+65
@@ -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)))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+137
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user