mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
Force resolve annotations in annotation checker
#KT-46173 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
83bae89ed8
commit
7fb2bf00c5
@@ -1834,6 +1834,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/typeUse/kt25876.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt46173.kt")
|
||||
public void testKt46173() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt8325.kt")
|
||||
public void testKt8325() throws Exception {
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getAnnotationRetention
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil
|
||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
||||
import org.jetbrains.kotlin.types.isError
|
||||
@@ -191,6 +192,14 @@ class AnnotationChecker(
|
||||
for (entry in entries) {
|
||||
checkAnnotationEntry(entry, actualTargets, trace)
|
||||
val descriptor = trace.get(BindingContext.ANNOTATION, entry) ?: continue
|
||||
if (descriptor is LazyAnnotationDescriptor) {
|
||||
/*
|
||||
* There are no users of type annotations until backend, so if there are errors
|
||||
* in annotation call then we should force resolve of it to detect and
|
||||
* report them
|
||||
*/
|
||||
descriptor.forceResolveAllContents()
|
||||
}
|
||||
val classDescriptor = descriptor.annotationClass ?: continue
|
||||
|
||||
val useSiteTarget = entry.useSiteTarget?.getAnnotationUseSiteTarget() ?: annotated.getDefaultUseSiteTarget(descriptor)
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
compiler/testData/cli/jvm/wrongAnnotationArgumentInCtor.kt:4:32: error: too many arguments for public constructor Anno() defined in Anno
|
||||
class UnresolvedArgument(@Anno(BLA) val s: Int)
|
||||
^
|
||||
compiler/testData/cli/jvm/wrongAnnotationArgumentInCtor.kt:4:32: error: unresolved reference: BLA
|
||||
class UnresolvedArgument(@Anno(BLA) val s: Int)
|
||||
^
|
||||
compiler/testData/cli/jvm/wrongAnnotationArgumentInCtor.kt:6:25: error: no value passed for parameter 'message'
|
||||
class WithoutArguments(@Deprecated val s: Int)
|
||||
^
|
||||
|
||||
10
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.fir.kt
vendored
Normal file
10
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.fir.kt
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
// !LANGUAGE: +ProperCheckAnnotationsTargetInTypeUsePositions
|
||||
// !DIAGNOSTICS: -USELESS_CAST
|
||||
// ISSUE: KT-46173
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val s: String)
|
||||
|
||||
fun some(): Int {
|
||||
return 1 as @Ann(<!ARGUMENT_TYPE_MISMATCH, ARGUMENT_TYPE_MISMATCH!>6<!>) Int // should error but doesn't
|
||||
}
|
||||
10
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.kt
vendored
Normal file
10
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.kt
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
// !LANGUAGE: +ProperCheckAnnotationsTargetInTypeUsePositions
|
||||
// !DIAGNOSTICS: -USELESS_CAST
|
||||
// ISSUE: KT-46173
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val s: String)
|
||||
|
||||
fun some(): Int {
|
||||
return 1 as @Ann(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>6<!>) Int // should error but doesn't
|
||||
}
|
||||
11
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.txt
vendored
Normal file
11
compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.txt
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package
|
||||
|
||||
public fun some(): kotlin.Int
|
||||
|
||||
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class Ann : kotlin.Annotation {
|
||||
public constructor Ann(/*0*/ s: kotlin.String)
|
||||
public final val s: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -5,8 +5,8 @@ interface A
|
||||
interface B : A
|
||||
interface C : A
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
fun <K> select(x: K, y: K): <!HIDDEN, HIDDEN!>@kotlin.internal.Exact<!> K = x
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> select(x: K, y: K): @kotlin.internal.Exact K = x
|
||||
|
||||
fun foo(a: Any) {}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ interface A
|
||||
interface B : A
|
||||
interface C : A
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> select(x: K, y: K): @kotlin.internal.Exact K = x
|
||||
|
||||
fun foo(a: Any) {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package
|
||||
|
||||
public fun foo(/*0*/ a: kotlin.Any): kotlin.Unit
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN"}) public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
|
||||
public fun test(/*0*/ b: B, /*1*/ c: C): kotlin.Unit
|
||||
|
||||
public interface A {
|
||||
|
||||
@@ -5,8 +5,8 @@ interface A
|
||||
interface B : A
|
||||
interface C : A
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
fun <K> select(x: K, y: K): <!HIDDEN, HIDDEN!>@kotlin.internal.Exact<!> K = x
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> select(x: K, y: K): @kotlin.internal.Exact K = x
|
||||
|
||||
fun foo(a: Any) {}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ interface A
|
||||
interface B : A
|
||||
interface C : A
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> select(x: K, y: K): @kotlin.internal.Exact K = x
|
||||
|
||||
fun foo(a: Any) {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package
|
||||
|
||||
public fun foo(/*0*/ a: kotlin.Any): kotlin.Unit
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN"}) public fun </*0*/ K> select(/*0*/ x: K, /*1*/ y: K): K
|
||||
public fun test(/*0*/ b: B, /*1*/ c: C): kotlin.Unit
|
||||
|
||||
public interface A {
|
||||
|
||||
@@ -5,8 +5,8 @@ interface ISample
|
||||
|
||||
fun <K> elvisSimple(x: K?, y: K): K = y
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
fun <K> elvisExact(x: K?, y: K): <!HIDDEN, HIDDEN!>@kotlin.internal.Exact<!> K = y
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> elvisExact(x: K?, y: K): @kotlin.internal.Exact K = y
|
||||
|
||||
fun <T : Number> materialize(): T? = TODO()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ interface ISample
|
||||
|
||||
fun <K> elvisSimple(x: K?, y: K): K = y
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> elvisExact(x: K?, y: K): @kotlin.internal.Exact K = y
|
||||
|
||||
fun <T : Number> materialize(): T? = TODO()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package
|
||||
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public fun </*0*/ K> elvisExact(/*0*/ x: K?, /*1*/ y: K): K
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN"}) public fun </*0*/ K> elvisExact(/*0*/ x: K?, /*1*/ y: K): K
|
||||
public fun </*0*/ K> elvisSimple(/*0*/ x: K?, /*1*/ y: K): K
|
||||
public fun </*0*/ T : kotlin.Number> materialize(): T?
|
||||
public fun test(/*0*/ nullableSample: ISample, /*1*/ any: kotlin.Any): kotlin.Unit
|
||||
|
||||
@@ -5,8 +5,8 @@ interface ISample
|
||||
|
||||
fun <K> elvisSimple(x: K?, y: K): K = y
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
fun <K> elvisExact(x: K?, y: K): <!HIDDEN, HIDDEN!>@kotlin.internal.Exact<!> K = y
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> elvisExact(x: K?, y: K): @kotlin.internal.Exact K = y
|
||||
|
||||
fun <T : Number> materialize(): T? = null
|
||||
fun <T> Any?.materialize(): T = null as T
|
||||
|
||||
@@ -5,7 +5,7 @@ interface ISample
|
||||
|
||||
fun <K> elvisSimple(x: K?, y: K): K = y
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <K> elvisExact(x: K?, y: K): @kotlin.internal.Exact K = y
|
||||
|
||||
fun <T : Number> materialize(): T? = null
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package
|
||||
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public fun </*0*/ K> elvisExact(/*0*/ x: K?, /*1*/ y: K): K
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN"}) public fun </*0*/ K> elvisExact(/*0*/ x: K?, /*1*/ y: K): K
|
||||
public fun </*0*/ K> elvisSimple(/*0*/ x: K?, /*1*/ y: K): K
|
||||
public fun </*0*/ T : kotlin.Number> materialize(): T?
|
||||
public fun test(/*0*/ nullableSample: ISample, /*1*/ any: kotlin.Any): kotlin.Unit
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
|
||||
// FILE: Foo.java
|
||||
|
||||
public class Foo {
|
||||
public static <K, V> void create(java.util.Map<? extends K, ? extends V> m) { return null; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun test(properties: Map<String, String>, nullableProperties: Map<String, String>?) {
|
||||
val f1 = Foo.create(select1(properties, myEmptyMap()))
|
||||
val f2 = Foo.create(nullableProperties ?: myEmptyMap())
|
||||
}
|
||||
|
||||
fun <T, R> myEmptyMap(): Map<T, R> = TODO()
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
fun <S> select1(x: S, y: S): <!HIDDEN, HIDDEN!>@kotlin.internal.Exact<!> S = y
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
|
||||
@@ -16,5 +17,5 @@ fun test(properties: Map<String, String>, nullableProperties: Map<String, String
|
||||
|
||||
fun <T, R> myEmptyMap(): Map<T, R> = TODO()
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN")
|
||||
fun <S> select1(x: S, y: S): @kotlin.internal.Exact S = y
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T, /*1*/ R> myEmptyMap(): kotlin.collections.Map<T, R>
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public fun </*0*/ S> select1(/*0*/ x: S, /*1*/ y: S): S
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "HIDDEN"}) public fun </*0*/ S> select1(/*0*/ x: S, /*1*/ y: S): S
|
||||
public fun test(/*0*/ properties: kotlin.collections.Map<kotlin.String, kotlin.String>, /*1*/ nullableProperties: kotlin.collections.Map<kotlin.String, kotlin.String>?): kotlin.Unit
|
||||
|
||||
public open class Foo {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
FILE: implicitNothingInDelegate.kt
|
||||
@R|kotlin/Suppress|(vararg(String(INVISIBLE_REFERENCE))) public final operator fun <V, V1 : R|V|> R|kotlin/collections/Map<in kotlin/String, @Exact V>|.getValue(thisRef: R|kotlin/Any?|, property: R|kotlin/reflect/KProperty<*>|): R|V1| {
|
||||
@R|kotlin/Suppress|(vararg(String(INVISIBLE_REFERENCE), String(INVISIBLE_MEMBER))) public final operator fun <V, V1 : R|V|> R|kotlin/collections/Map<in kotlin/String, @Exact V>|.getValue(thisRef: R|kotlin/Any?|, property: R|kotlin/reflect/KProperty<*>|): R|V1| {
|
||||
^getValue Null(null)!!
|
||||
}
|
||||
public final val m2: R|kotlin/collections/Map<kotlin/String, *>| = R|kotlin/collections/mapOf|<R|kotlin/String|, R|kotlin/String|>(String(baz).R|kotlin/to|<R|kotlin/String|, R|kotlin/String|>(String(bat)))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
@Suppress("INVISIBLE_REFERENCE")
|
||||
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
|
||||
public operator fun <V, V1 : V> Map<in String, @kotlin.internal.Exact V>.getValue(thisRef: Any?, property: KProperty<*>): V1 = null!!
|
||||
|
||||
val m2: Map<String, *> = mapOf("baz" to "bat")
|
||||
|
||||
@@ -3,5 +3,5 @@ package
|
||||
public val bar: kotlin.String
|
||||
public val m2: kotlin.collections.Map<kotlin.String, *>
|
||||
public fun foo(): kotlin.Unit
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE"}) public operator fun </*0*/ V, /*1*/ V1 : V> kotlin.collections.Map<in kotlin.String, V>.getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>): V1
|
||||
@kotlin.Suppress(names = {"INVISIBLE_REFERENCE", "INVISIBLE_MEMBER"}) public operator fun </*0*/ V, /*1*/ V1 : V> kotlin.collections.Map<in kotlin.String, V>.getValue(/*0*/ thisRef: kotlin.Any?, /*1*/ property: kotlin.reflect.KProperty<*>): V1
|
||||
|
||||
|
||||
@@ -1840,6 +1840,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/typeUse/kt25876.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt46173.kt")
|
||||
public void testKt46173() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/annotations/typeUse/kt46173.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt8325.kt")
|
||||
public void testKt8325() throws Exception {
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Type annotations on return type with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann
|
||||
|
||||
fun foo(x: String): @Ann(unresolved_reference) String {
|
||||
return x
|
||||
}
|
||||
|
||||
fun box(): String? {
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 10
|
||||
* DESCRIPTION: Type annotations on a lambda type with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
fun case_1(): Any {
|
||||
val x: (Int) -> @Ann(unresolved_reference) Unit = {}
|
||||
|
||||
return x
|
||||
}
|
||||
|
||||
fun case_2(): Any {
|
||||
val x: (@Ann(unresolved_reference) Int) -> Unit = { a: Int -> println(a) }
|
||||
|
||||
return x
|
||||
}
|
||||
|
||||
fun box(): String? {
|
||||
val x = case_1()
|
||||
val y = case_2()
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 11
|
||||
* DESCRIPTION: Type annotations with invalid target.
|
||||
* ISSUES: KT-28449
|
||||
*/
|
||||
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
@Target(AnnotationTarget.PROPERTY_GETTER)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
class Foo : @Ann(10) Any()
|
||||
|
||||
class Bar<T : @Ann(10) Any>
|
||||
|
||||
fun case_3(a: Any): Int? {
|
||||
return if (a is @Ann(10) String) 10 else null
|
||||
}
|
||||
|
||||
open class TypeToken<T>
|
||||
|
||||
val case_4 = object : TypeToken<@Ann(10) String>() {}
|
||||
|
||||
fun case_5(a: Any): Any {
|
||||
a as @Ann(10) Int
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
fun box(): String? {
|
||||
val x1 = Foo()
|
||||
val x2 = Bar<Int>()
|
||||
val x3 = case_3(".")
|
||||
val x4 = case_4
|
||||
val x5 = case_5(10)
|
||||
|
||||
if (x1 == null) return null
|
||||
if (x2 == null) return null
|
||||
if (x3 == null) return null
|
||||
if (x4 == null) return null
|
||||
if (x5 == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Type annotations on supertypes with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
abstract class Foo : @Ann(unresolved_reference) Any()
|
||||
|
||||
class Bar: Foo()
|
||||
|
||||
fun box(): String? {
|
||||
val x = Bar()
|
||||
|
||||
if (x == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: Type annotations on parameter types with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun foo(i: Inv<@Ann(unresolved_reference) String>) {}
|
||||
|
||||
fun bar(vararg a: @Ann(unresolved_reference) Any) {}
|
||||
|
||||
class A<T>(a: @Ann(unresolved_reference) T)
|
||||
|
||||
fun box(): String? {
|
||||
val x = foo(Inv<String>())
|
||||
val y = bar(1, 2, 3)
|
||||
val z = A<Int>(10)
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
if (z == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 4
|
||||
* DESCRIPTION: Type annotations on type arguments for a containing type of return type, with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun case_1(): Inv<@Ann(unresolved_reference) String> = TODO()
|
||||
|
||||
fun box(): String? {
|
||||
try {
|
||||
val x = case_1()
|
||||
if (x == null) return null
|
||||
} catch (e: NotImplementedError) {}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 5
|
||||
* DESCRIPTION: Type annotations on upper bounds with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
abstract class Bar<T : @Ann(unresolved_reference) Any>
|
||||
|
||||
class Foo<T : Any> : Bar<T>()
|
||||
|
||||
class B<T> where @Ann(unresolved_reference) T : Number
|
||||
|
||||
fun box(): String? {
|
||||
val x = Foo<Int>()
|
||||
val y = B<Float>()
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 6
|
||||
* DESCRIPTION: Type annotations inside type check and cast expression with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
fun case_1(a: Any): Int? {
|
||||
return if (a is @Ann(unresolved_reference) String) 10 else null
|
||||
}
|
||||
|
||||
fun case_2(a: Any): Any {
|
||||
return a as @Ann(unresolved_reference) String
|
||||
}
|
||||
|
||||
fun case_3_1(a: Any) = 10
|
||||
|
||||
fun case_3(a: Any): Any {
|
||||
return case_3_1(a as @Ann(unresolved_reference) String)
|
||||
}
|
||||
|
||||
fun box(): String? {
|
||||
val x = case_1(".")
|
||||
val y = case_2(".")
|
||||
val z = case_3(".")
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
if (z == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 7
|
||||
* DESCRIPTION: Type annotations on a type in an anonymous object expression, with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann
|
||||
|
||||
open class TypeToken<T>
|
||||
|
||||
val case_1 = object : TypeToken<@Ann(unresolved_reference) String>() {}
|
||||
|
||||
interface A
|
||||
|
||||
val case_2 = object: @Ann(unresolved_reference) A {}
|
||||
|
||||
fun box(): String? {
|
||||
val x = case_1
|
||||
val y = case_2
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 8
|
||||
* DESCRIPTION: Type annotations on a receiver type (for an extension property only), with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann(val x: Int)
|
||||
|
||||
val <T> @Ann(unresolved_reference) T.test // OK, error only in IDE but not in the compiler
|
||||
get() = 10
|
||||
|
||||
val @Ann(unresolved_reference) Int.test
|
||||
get() = 10
|
||||
|
||||
fun box(): String? {
|
||||
val x = 10.test
|
||||
val y = '.'.test
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* KOTLIN CODEGEN BOX NOT LINKED SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SECTIONS: annotations, type-annotations
|
||||
* NUMBER: 9
|
||||
* DESCRIPTION: Type annotations on a setter argument type with unresolved reference in parameters.
|
||||
* ISSUES: KT-28424
|
||||
*/
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class Ann
|
||||
|
||||
var <T> T.test
|
||||
get() = 11
|
||||
set(value: @Ann(unresolved_reference) Int) {}
|
||||
|
||||
fun box(): String? {
|
||||
val x = 10.test
|
||||
10.test = 11
|
||||
val y = 10.test
|
||||
|
||||
if (x == null) return null
|
||||
if (y == null) return null
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -18,7 +18,7 @@ annotation class Ann(val x: Int)
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
*/
|
||||
fun case_1() {
|
||||
val x: (Int) -> @Ann(<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved_reference<!>) Unit = {} // OK, no error in IDE and in the compiler
|
||||
val x: (Int) -> @Ann(<!UNRESOLVED_REFERENCE!>unresolved_reference<!>) Unit = {} // OK, no error in IDE and in the compiler
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -26,7 +26,7 @@ fun case_1() {
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
*/
|
||||
fun case_2() {
|
||||
val x: (@Ann(<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved_reference<!>) Int) -> Unit = { a: Int -> println(a) } // OK, no error in IDE and in the compiler
|
||||
val x: (@Ann(<!UNRESOLVED_REFERENCE!>unresolved_reference<!>) Int) -> Unit = { a: Int -> println(a) } // OK, no error in IDE and in the compiler
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
|
||||
@@ -18,4 +18,4 @@ annotation class Ann
|
||||
|
||||
var <T> T.test
|
||||
get() = 11
|
||||
set(value: @Ann(<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved_reference<!>) Int) {}
|
||||
set(value: @Ann(<!TOO_MANY_ARGUMENTS, UNRESOLVED_REFERENCE!>unresolved_reference<!>) Int) {}
|
||||
|
||||
@@ -4341,100 +4341,6 @@ public class BlackBoxCodegenTestSpecGenerated extends AbstractBlackBoxCodegenTes
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/tests-spec/testData/codegen/box/notLinked"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/tests-spec/testData/codegen/box/notLinked/annotations")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class Annotations extends AbstractBlackBoxCodegenTestSpec {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInAnnotations() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/tests-spec/testData/codegen/box/notLinked/annotations"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class Type_annotations extends AbstractBlackBoxCodegenTestSpec {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInType_annotations() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class Neg extends AbstractBlackBoxCodegenTestSpec {
|
||||
private void runTest(String testDataFilePath) throws Exception {
|
||||
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
|
||||
}
|
||||
|
||||
@TestMetadata("1.kt")
|
||||
public void test1() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/1.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("10.kt")
|
||||
public void test10() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/10.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("11.kt")
|
||||
public void test11() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/11.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("2.kt")
|
||||
public void test2() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("3.kt")
|
||||
public void test3() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/3.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("4.kt")
|
||||
public void test4() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/4.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("5.kt")
|
||||
public void test5() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/5.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("6.kt")
|
||||
public void test6() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/6.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("7.kt")
|
||||
public void test7() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/7.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("8.kt")
|
||||
public void test8() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/8.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("9.kt")
|
||||
public void test9() throws Exception {
|
||||
runTest("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg/9.kt");
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInNeg() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/tests-spec/testData/codegen/box/notLinked/annotations/type-annotations/neg"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/tests-spec/testData/codegen/box/notLinked/flexibility")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
Reference in New Issue
Block a user