Fix #KT-28999. Prohibit type parameters on anonymous objects

This commit is contained in:
Dmitriy Novozhilov
2019-02-07 13:26:29 +03:00
parent 11e5ddf9ae
commit 49a42f9434
9 changed files with 82 additions and 6 deletions
@@ -2,23 +2,23 @@
// ISSUE: KT-28999
fun case_1() {
val x = object<T> { } // type of x is <anonymous object><T>
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T><!> { } // type of x is <anonymous object><T>
}
fun case_2() {
val x = object<T : Number, K: Comparable<K>> { }
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T : Number, K: Comparable<K>><!> { }
}
fun case_3() {
val x = object<T> <!SYNTAX!>where <!DEBUG_INFO_MISSING_UNRESOLVED!>T<!> : <!DEBUG_INFO_MISSING_UNRESOLVED!>Comparable<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>T<!>><!> { } // ERROR: Where clause is not allowed for objects
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T><!> <!SYNTAX!>where <!DEBUG_INFO_MISSING_UNRESOLVED!>T<!> : <!DEBUG_INFO_MISSING_UNRESOLVED!>Comparable<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>T<!>><!> { } // ERROR: Where clause is not allowed for objects
}
val x = object<T, K: Comparable<K>> {
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T, K: Comparable<K>><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!> // OK
}
fun case_4() {
val x = object<T> {
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!>
}
@@ -26,7 +26,7 @@ fun case_4() {
}
inline fun <reified T> case_5() {
val x = object<T> {
val x = object<!TYPE_PARAMETERS_IN_ANONYMOUS_OBJECT!><T><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!>
}
@@ -0,0 +1,40 @@
// !LANGUAGE: +ProhibitTypeParametersInAnonymousObjects
// !DIAGNOSTICS: -UNUSED_VARIABLE!
// ISSUE: KT-28999
fun case_1() {
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T><!> { } // type of x is <anonymous object><T>
}
fun case_2() {
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T : Number, K: Comparable<K>><!> { }
}
fun case_3() {
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T><!> <!SYNTAX!>where <!DEBUG_INFO_MISSING_UNRESOLVED!>T<!> : <!DEBUG_INFO_MISSING_UNRESOLVED!>Comparable<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>T<!>><!> { } // ERROR: Where clause is not allowed for objects
}
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T, K: Comparable<K>><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!> // OK
}
fun case_4() {
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!>
}
val y = x.test() // type y is T
}
inline fun <reified T> case_5() {
val x = object<!TYPE_PARAMETERS_IN_OBJECT!><T><!> {
fun test() = 10 <!UNCHECKED_CAST!>as T<!>
}
val z = x.test()
if (z is T) {
// z is {T!! & T!!} (smart cast from T)
<!UNRESOLVED_REFERENCE!>println<!>(z)
}
}
@@ -0,0 +1,8 @@
package
public val x: kotlin.Any
public fun case_1(): kotlin.Unit
public fun case_2(): kotlin.Unit
public fun case_3(): kotlin.Unit
public fun case_4(): kotlin.Unit
public inline fun </*0*/ reified T> case_5(): kotlin.Unit