[CFA] Mark arguments of all annotation calls as USED_AS_EXPRESSION

Also revert hacky fix of KT-37294 introduced in 80caa063b
#KT-37447 Fixed
This commit is contained in:
Dmitriy Novozhilov
2020-03-12 18:53:45 +03:00
parent b9ffed3f04
commit 31776d9a3b
7 changed files with 193 additions and 11 deletions
@@ -804,9 +804,14 @@ class ControlFlowInformationProvider private constructor(
}
private fun markAnnotationArguments() {
when (subroutine) {
is KtAnnotationEntry -> markAnnotationArguments(subroutine)
is KtAnnotated -> subroutine.annotationEntries.forEach { markAnnotationArguments(it) }
if (subroutine is KtAnnotationEntry) {
markAnnotationArguments(subroutine)
} else {
subroutine.children.forEach { child ->
child.forEachDescendantOfType<KtAnnotationEntry>(
canGoInside = { it !is KtDeclaration || it is KtParameter }
) { markAnnotationArguments(it) }
}
}
}
+104
View File
@@ -0,0 +1,104 @@
== Test_1 ==
class Test_1 {
@Target(AnnotationTarget.VALUE_PARAMETER)
annotation class Range(val min: Long = 0)
fun foo(@Range(min = -90L) x: Int) = Unit // KtPrefixExpression isn't marked as BindingContext.USED_AS_EXPRESSION
}
---------------------
L0:
1 <START>
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(@Range(min = -90L) x: Int) = Unit // KtPrefixExpression isn't marked as BindingContext.USED_AS_EXPRESSION
---------------------
L0:
1 <START>
v(@Range(min = -90L) x: Int)
magic[FAKE_INITIALIZER](@Range(min = -90L) x: Int) -> <v0>
w(x|<v0>)
r(Unit) -> <v1>
ret(*|<v1>) L1
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== Test_2 ==
class Test_2 {
@Target(AnnotationTarget.FUNCTION)
annotation class Range(val min: Long = 0)
@Range(min = -90L) // KtPrefixExpression is marked as BindingContext.USED_AS_EXPRESSION
fun foo(x: Int) = Unit
}
---------------------
L0:
1 <START>
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
@Range(min = -90L) // KtPrefixExpression is marked as BindingContext.USED_AS_EXPRESSION
fun foo(x: Int) = Unit
---------------------
L0:
1 <START>
v(x: Int)
magic[FAKE_INITIALIZER](x: Int) -> <v0>
w(x|<v0>)
r(Unit) -> <v1>
ret(*|<v1>) L1
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== Test_3 ==
class Test_3 {
@Target(AnnotationTarget.EXPRESSION)
annotation class Range(val min: Long = 0)
fun foo(x: Int) = @Range(min = -90L) Unit
}
---------------------
L0:
1 <START>
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(x: Int) = @Range(min = -90L) Unit
---------------------
L0:
1 <START>
v(x: Int)
magic[FAKE_INITIALIZER](x: Int) -> <v0>
w(x|<v0>)
r(Unit) -> <v1>
ret(*|<v1>) L1
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
+23
View File
@@ -0,0 +1,23 @@
// ISSUE: KT-37447
class Test_1 {
@Target(AnnotationTarget.VALUE_PARAMETER)
annotation class Range(val min: Long = 0)
fun foo(@Range(min = -90L) x: Int) = Unit // KtPrefixExpression isn't marked as BindingContext.USED_AS_EXPRESSION
}
class Test_2 {
@Target(AnnotationTarget.FUNCTION)
annotation class Range(val min: Long = 0)
@Range(min = -90L) // KtPrefixExpression is marked as BindingContext.USED_AS_EXPRESSION
fun foo(x: Int) = Unit
}
class Test_3 {
@Target(AnnotationTarget.EXPRESSION)
annotation class Range(val min: Long = 0)
fun foo(x: Int) = @Range(min = -90L) Unit
}
+48
View File
@@ -0,0 +1,48 @@
== Test_1 ==
class Test_1 {
@Target(AnnotationTarget.VALUE_PARAMETER)
annotation class Range(val min: Long = 0)
fun foo(@Range(min = -90L) x: Int) = Unit // KtPrefixExpression isn't marked as BindingContext.USED_AS_EXPRESSION
}
---------------------
=====================
== foo ==
fun foo(@Range(min = -90L) x: Int) = Unit // KtPrefixExpression isn't marked as BindingContext.USED_AS_EXPRESSION
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](@Range(min = -90L) x: Int) -> <v0>
Unit <v1>: Unit NEW: r(Unit) -> <v1>
=====================
== Test_2 ==
class Test_2 {
@Target(AnnotationTarget.FUNCTION)
annotation class Range(val min: Long = 0)
@Range(min = -90L) // KtPrefixExpression is marked as BindingContext.USED_AS_EXPRESSION
fun foo(x: Int) = Unit
}
---------------------
=====================
== foo ==
@Range(min = -90L) // KtPrefixExpression is marked as BindingContext.USED_AS_EXPRESSION
fun foo(x: Int) = Unit
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](x: Int) -> <v0>
Unit <v1>: Unit NEW: r(Unit) -> <v1>
=====================
== Test_3 ==
class Test_3 {
@Target(AnnotationTarget.EXPRESSION)
annotation class Range(val min: Long = 0)
fun foo(x: Int) = @Range(min = -90L) Unit
}
---------------------
=====================
== foo ==
fun foo(x: Int) = @Range(min = -90L) Unit
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](x: Int) -> <v0>
Unit <v1>: Unit NEW: r(Unit) -> <v1>
@Range(min = -90L) Unit <v1>: Unit COPY
=====================
@@ -148,6 +148,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
runTest("compiler/testData/cfg/bugs/kt10105.kt");
}
@TestMetadata("kt37447.kt")
public void testKt37447() throws Exception {
runTest("compiler/testData/cfg/bugs/kt37447.kt");
}
@TestMetadata("kt7761.kt")
public void testKt7761() throws Exception {
runTest("compiler/testData/cfg/bugs/kt7761.kt");
@@ -148,6 +148,11 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
runTest("compiler/testData/cfg/bugs/kt10105.kt");
}
@TestMetadata("kt37447.kt")
public void testKt37447() throws Exception {
runTest("compiler/testData/cfg/bugs/kt37447.kt");
}
@TestMetadata("kt7761.kt")
public void testKt7761() throws Exception {
runTest("compiler/testData/cfg/bugs/kt7761.kt");