Build recursive raw types and raw types which contain type parameters properly
1) Substitute erasure of other type parameters 2) Use star projection at top level for recursive raw types ^KT-46126 Fixed
This commit is contained in:
+1
-1
@@ -12,5 +12,5 @@ fun <R> choose3(c: Inv<Inv<R>>) {}
|
||||
fun f(o: Out<Out<*>>, i: In<In<*>>, inv: Inv<Inv<*>>) {
|
||||
choose1(o)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER{NI}, TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER{OI}!>choose2<!>(i)
|
||||
<!TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR{OI}!>choose3<!>(<!TYPE_MISMATCH{NI}!>inv<!>)
|
||||
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER{OI}, TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR{OI}!>choose3<!>(<!TYPE_MISMATCH!>inv<!>)
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -28,5 +28,5 @@ abstract class MySettingsListener<S extends MyComparableSettings> {}
|
||||
fun test() {
|
||||
val a = MySettings.getSettings()
|
||||
a.getLinkedProjectsSettings()
|
||||
a.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, TYPE_INFERENCE_UPPER_BOUND_VIOLATED{OI}, UNRESOLVED_REFERENCE_WRONG_RECEIVER{NI}!>linkedProjectsSettings<!>
|
||||
a.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE{OI}, TYPE_INFERENCE_UPPER_BOUND_VIOLATED{OI}!>linkedProjectsSettings<!>
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -10,5 +10,5 @@ public open class MySettings</*0*/ SS : MySettings<SS!, PS!, L!>!, /*1*/ PS : My
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun getSettings(): MySettings<(raw) MySettings<*, *, *>!, (raw) MyComparableSettings!, (raw) MySettingsListener<*>!>!
|
||||
public open fun getSettings(): (MySettings<(raw) *, (raw) MyComparableSettings!, (raw) MySettingsListener<MyComparableSettings!>!>..MySettings<*, *, out MySettingsListener<*>!>?)
|
||||
}
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ package a {
|
||||
public open class C</*0*/ B : a.C<B!>!> {
|
||||
public constructor C</*0*/ B : a.C<B!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun foo(): a.C<(raw) a.C<*>!>!
|
||||
public open fun foo(): a.C<(raw) *>!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P, B>, P> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P, L> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P, B>, P> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P, L> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<*, (kotlin.Any..kotlin.Any?)>..X<*, *>?)")!>t<!>
|
||||
t.id // should be OK
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I<P!, B!>!, /*1*/ P : kotlin.Any!> {
|
||||
public/*package*/ constructor X</*0*/ B : I<P!, B!>!, /*1*/ P : kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<X<(raw) *, (raw) kotlin.Any!>!>!
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<B>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<B>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<*>..X<*>?)")!>t<!>
|
||||
t.id // should be OK
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I<B!>!> {
|
||||
public/*package*/ constructor X</*0*/ B : I<B!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<X<(raw) *>!>!
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
|
||||
}
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?)>..X<out (I<*>..I<*>?), *>?)")!>t<!>
|
||||
t.id // should be OK
|
||||
}
|
||||
Vendored
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!> {
|
||||
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!>..X<out I<*>!, *>?)>!
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I1<P, P, P>, P, A extends I1<I2<B>, B, I1<P, I2<B>, P>>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I1<P, A, F> {}
|
||||
interface I2<S> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // error before
|
||||
}
|
||||
compiler/testData/diagnostics/tests/platformTypes/rawTypes/substituteOtherErasedDeepTypeArguments.kt
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I1<P, P, P>, P, A extends I1<I2<B>, B, I1<P, I2<B>, P>>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I1<P, A, F> {}
|
||||
interface I2<S> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I1<*, (I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), *>..I1<*, (I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>..I1<(kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?), (kotlin.Any..kotlin.Any?)>?), *>?)>..X<out (I1<*, *, *>..I1<*, *, *>?), *, out (I1<*, out (I1<*, *, *>..I1<*, *, *>?), *>..I1<*, out (I1<*, *, *>..I1<*, *, *>?), *>?)>?)")!>t<!>
|
||||
t.<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>id<!> // error before
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I1<P!, P!, P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I1<I2<B!>!, B!, I1<P!, I2<B!>!, P!>!>!> {
|
||||
public/*package*/ constructor X</*0*/ B : I1<P!, P!, P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I1<I2<B!>!, B!, I1<P!, I2<B!>!, P!>!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<(X<(raw) I1<kotlin.Any!, kotlin.Any!, kotlin.Any!>!, (raw) kotlin.Any!, (raw) I1<*, I1<kotlin.Any!, kotlin.Any!, kotlin.Any!>!, *>!>..X<out I1<*, *, *>!, *, out I1<*, out I1<*, *, *>!, *>!>?)>!
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P, A extends I<B>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P, A extends I<B>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>..I<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>?)>..X<out (I<*>..I<*>?), *, out (I<out (I<*>..I<*>?)>..I<out (I<*>..I<*>?)>?)>?)")!>t<!>
|
||||
t.id // should be OK
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<B!>!> {
|
||||
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<B!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!, (raw) I<I<kotlin.Any!>!>!>..X<out I<*>!, *, out I<out I<*>!>!>?)>!
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P, A extends I<P>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.<!UNRESOLVED_REFERENCE!>t<!>
|
||||
t
|
||||
t.<!UNRESOLVED_REFERENCE!>id<!> // should be OK
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
|
||||
// FILE: X.java
|
||||
class X<B extends I<P>, P, A extends I<P>> {
|
||||
static final E<X> E = new E<>();
|
||||
|
||||
String getId() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class E<T> {
|
||||
T getT() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
interface I<P> {}
|
||||
|
||||
// FILE: test.kt
|
||||
fun test() {
|
||||
val t = X.E.t
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("(X<(I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?), (kotlin.Any..kotlin.Any?), (I<(kotlin.Any..kotlin.Any?)>..I<(kotlin.Any..kotlin.Any?)>?)>..X<out (I<*>..I<*>?), *, out (I<*>..I<*>?)>?)")!>t<!>
|
||||
t.id // should be OK
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package
|
||||
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public/*package*/ open class X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<P!>!> {
|
||||
public/*package*/ constructor X</*0*/ B : I<P!>!, /*1*/ P : kotlin.Any!, /*2*/ A : I<P!>!>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public/*package*/ open fun getId(): kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public/*package*/ final val E: E<(X<(raw) I<kotlin.Any!>!, (raw) kotlin.Any!, (raw) I<kotlin.Any!>!>..X<out I<*>!, *, out I<*>!>?)>!
|
||||
}
|
||||
Reference in New Issue
Block a user