[FIR] Add NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER check
This commit is contained in:
+109
@@ -0,0 +1,109 @@
|
||||
FILE: multipleBounds.kt
|
||||
public open class A : R|kotlin/Any| {
|
||||
public constructor(): R|Jet87/A| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final fun foo(): R|kotlin/Int| {
|
||||
^foo Int(1)
|
||||
}
|
||||
|
||||
}
|
||||
public abstract interface B : R|kotlin/Any| {
|
||||
public open fun bar(): R|kotlin/Double| {
|
||||
^bar Double(1.0)
|
||||
}
|
||||
|
||||
}
|
||||
public abstract interface G<X> : R|kotlin/Any| {
|
||||
public abstract val <X : R|Jet87/A|, R|Jet87/B|> boo: R|kotlin/Double|
|
||||
public get(): R|kotlin/Double|
|
||||
|
||||
public abstract val <A : R|Jet87/B|> bal: R|kotlin/Double|
|
||||
public get(): R|kotlin/Double|
|
||||
|
||||
public abstract val <Y : R|Jet87/B|> bas: R|kotlin/Double|
|
||||
public get(): R|kotlin/Double|
|
||||
|
||||
}
|
||||
public final class C : R|Jet87/A|, R|Jet87/B| {
|
||||
public constructor(): R|Jet87/C| {
|
||||
super<R|Jet87/A|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class D : R|kotlin/Any| {
|
||||
public constructor(): R|Jet87/D| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final companion object Companion : R|Jet87/A|, R|Jet87/B| {
|
||||
private constructor(): R|Jet87/D.Companion| {
|
||||
super<R|Jet87/A|>()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public final class Test1<T : R|Jet87/A|, R|Jet87/B|> : R|kotlin/Any| {
|
||||
public constructor<T : R|Jet87/A|, R|Jet87/B|>(): R|Jet87/Test1<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final fun test(t: R|T|): R|kotlin/Unit| {
|
||||
R|?|.<Unresolved name: foo>#()
|
||||
R|?|.<Unresolved name: bar>#()
|
||||
R|<local>/t|.R|Jet87/A.foo|()
|
||||
R|<local>/t|.R|Jet87/B.bar|()
|
||||
}
|
||||
|
||||
}
|
||||
public final fun test(): R|kotlin/Unit| {
|
||||
R|Jet87/Test1.Test1|<R|Jet87/B|>()
|
||||
R|Jet87/Test1.Test1|<R|Jet87/A|>()
|
||||
R|Jet87/Test1.Test1|<R|Jet87/C|>()
|
||||
}
|
||||
public final class Foo : R|kotlin/Any| {
|
||||
public constructor(): R|Jet87/Foo| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class Bar<T : R|Jet87/Foo|> : R|kotlin/Any| {
|
||||
public constructor<T : R|Jet87/Foo|>(): R|Jet87/Bar<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class Buzz<T : R|Jet87/Bar<kotlin/Int>|, <ERROR TYPE REF: Symbol not found for nioho>> : R|kotlin/Any| {
|
||||
public constructor<T : R|Jet87/Bar<kotlin/Int>|, <ERROR TYPE REF: Symbol not found for nioho>>(): R|Jet87/Buzz<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class X<T : R|Jet87/Foo|> : R|kotlin/Any| {
|
||||
public constructor<T : R|Jet87/Foo|>(): R|Jet87/X<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final class Y<T : R|Jet87/Foo|, R|Jet87/Bar<Jet87/Foo>|> : R|kotlin/Any| {
|
||||
public constructor<T : R|Jet87/Foo|, R|Jet87/Bar<Jet87/Foo>|>(): R|Jet87/Y<T>| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
public final fun <T : R|Jet87/A|, R|Jet87/B|> test2(t: R|T|): R|kotlin/Unit| {
|
||||
R|?|.<Unresolved name: foo>#()
|
||||
R|?|.<Unresolved name: bar>#()
|
||||
R|<local>/t|.R|Jet87/A.foo|()
|
||||
R|<local>/t|.R|Jet87/B.bar|()
|
||||
}
|
||||
public final val t1: R|kotlin/Unit| = <Inapplicable(INAPPLICABLE): Jet87/test2>#<R|Jet87/A|>(R|Jet87/A.A|())
|
||||
public get(): R|kotlin/Unit|
|
||||
public final val t2: R|kotlin/Unit| = <Inapplicable(INAPPLICABLE): Jet87/test2>#<R|Jet87/B|>(R|Jet87/C.C|())
|
||||
public get(): R|kotlin/Unit|
|
||||
public final val t3: R|kotlin/Unit| = R|Jet87/test2|<R|Jet87/C|>(R|Jet87/C.C|())
|
||||
public get(): R|kotlin/Unit|
|
||||
public final val <T, B : R|T|> x: R|kotlin/Int| = Int(0)
|
||||
public get(): R|kotlin/Int|
|
||||
@@ -0,0 +1,69 @@
|
||||
package Jet87
|
||||
|
||||
open class A() {
|
||||
fun foo() : Int = 1
|
||||
}
|
||||
|
||||
interface B {
|
||||
fun bar() : Double = 1.0;
|
||||
}
|
||||
|
||||
interface G<X> {
|
||||
val <X> boo: Double where X : A, X : B
|
||||
val <A> bal: Double where A : B
|
||||
val <Y> bas: Double where Y : B, <!NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER!>X<!> : B
|
||||
}
|
||||
|
||||
class C() : A(), B
|
||||
|
||||
class D() {
|
||||
companion object : A(), B {}
|
||||
}
|
||||
|
||||
class Test1<T>()
|
||||
where
|
||||
T : A,
|
||||
T : B,
|
||||
<!NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER!>B<!> : T // error
|
||||
{
|
||||
|
||||
fun test(t : T) {
|
||||
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
t.foo()
|
||||
t.bar()
|
||||
}
|
||||
}
|
||||
|
||||
fun test() {
|
||||
Test1<<!UPPER_BOUND_VIOLATED!>B<!>>()
|
||||
Test1<<!UPPER_BOUND_VIOLATED!>A<!>>()
|
||||
Test1<C>()
|
||||
}
|
||||
|
||||
class Foo() {}
|
||||
|
||||
class Bar<T : <!FINAL_UPPER_BOUND!>Foo<!>>
|
||||
|
||||
class Buzz<T> where T : <!FINAL_UPPER_BOUND!>Bar<Int><!>, T : <!UNRESOLVED_REFERENCE!>nioho<!>
|
||||
|
||||
class X<T : <!FINAL_UPPER_BOUND!>Foo<!>>
|
||||
class Y<<!CONFLICTING_UPPER_BOUNDS!>T<!>> where T : <!FINAL_UPPER_BOUND!>Foo<!>, T : <!FINAL_UPPER_BOUND, ONLY_ONE_CLASS_BOUND_ALLOWED!>Bar<Foo><!>
|
||||
|
||||
fun <T> test2(t : T)
|
||||
where
|
||||
T : A,
|
||||
T : B,
|
||||
<!NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER!>B<!> : T
|
||||
{
|
||||
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
t.foo()
|
||||
t.bar()
|
||||
}
|
||||
|
||||
val t1 = <!INAPPLICABLE_CANDIDATE!>test2<!><A>(A())
|
||||
val t2 = <!INAPPLICABLE_CANDIDATE!>test2<!><B>(C())
|
||||
val t3 = test2<C>(C())
|
||||
|
||||
val <T, B : T> x : Int = 0
|
||||
Reference in New Issue
Block a user