[FIR] Disable data flow from in-place lambdas
There are many complications with the current design of passing data from within in-place lambdas to surrounding code. Solving these complications will involve more time to investigation than is available within the K2 release. So we are disabling passing type statement information from lambdas for the time being until more time can be devoted to a more complete solution. ^KT-60958 Fixed ^KT-63530 Fixed
This commit is contained in:
@@ -110,7 +110,7 @@ digraph defaultArguments_kt {
|
|||||||
25 -> {26};
|
25 -> {26};
|
||||||
26 -> {28};
|
26 -> {28};
|
||||||
27 -> {29};
|
27 -> {29};
|
||||||
28 -> {29};
|
28 -> {29} [label="Postponed"];
|
||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {31};
|
30 -> {31};
|
||||||
31 -> {32};
|
31 -> {32};
|
||||||
|
|||||||
+1236
-1250
File diff suppressed because it is too large
Load Diff
+7
-7
@@ -76,7 +76,7 @@ FILE: flowFromInplaceLambda.kt
|
|||||||
^ (R|<local>/x| as R|kotlin/Int|)
|
^ (R|<local>/x| as R|kotlin/Int|)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
}
|
}
|
||||||
public final fun completedCallExactlyOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
public final fun completedCallExactlyOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
||||||
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/exactlyOnce|<R|kotlin/Int|>(<L> = exactlyOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=EXACTLY_ONCE> {
|
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/exactlyOnce|<R|kotlin/Int|>(<L> = exactlyOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=EXACTLY_ONCE> {
|
||||||
@@ -89,7 +89,7 @@ FILE: flowFromInplaceLambda.kt
|
|||||||
^ Int(1)
|
^ Int(1)
|
||||||
}
|
}
|
||||||
))).R|kotlin/Int.inc|()
|
))).R|kotlin/Int.inc|()
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
R|<local>/y|.R|kotlin/Int.inc|()
|
R|<local>/y|.R|kotlin/Int.inc|()
|
||||||
}
|
}
|
||||||
public final fun completedCallAtLeastOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
public final fun completedCallAtLeastOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
||||||
@@ -103,7 +103,7 @@ FILE: flowFromInplaceLambda.kt
|
|||||||
^ Int(1)
|
^ Int(1)
|
||||||
}
|
}
|
||||||
))).R|kotlin/Int.inc|()
|
))).R|kotlin/Int.inc|()
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
R|<local>/y|.R|kotlin/Int.inc|()
|
R|<local>/y|.R|kotlin/Int.inc|()
|
||||||
}
|
}
|
||||||
public final fun completedCallAtMostOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
public final fun completedCallAtMostOnce(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|kotlin/Unit| {
|
||||||
@@ -162,8 +162,8 @@ FILE: flowFromInplaceLambda.kt
|
|||||||
^ Int(1)
|
^ Int(1)
|
||||||
}
|
}
|
||||||
))).R|kotlin/Int.inc|()
|
))).R|kotlin/Int.inc|()
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
R|<local>/y|.R|kotlin/Int.inc|()
|
R|<local>/y|.<Unresolved name: inc>#()
|
||||||
}
|
}
|
||||||
public final fun incompleteCallAtLeastOnce(x: R|kotlin/Any|, y: R|kotlin/Any|): R|kotlin/Unit| {
|
public final fun incompleteCallAtLeastOnce(x: R|kotlin/Any|, y: R|kotlin/Any|): R|kotlin/Unit| {
|
||||||
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/atLeastOnce|<R|kotlin/Int|>(<L> = atLeastOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=AT_LEAST_ONCE> {
|
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/atLeastOnce|<R|kotlin/Int|>(<L> = atLeastOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=AT_LEAST_ONCE> {
|
||||||
@@ -179,8 +179,8 @@ FILE: flowFromInplaceLambda.kt
|
|||||||
^ Int(1)
|
^ Int(1)
|
||||||
}
|
}
|
||||||
))).R|kotlin/Int.inc|()
|
))).R|kotlin/Int.inc|()
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
R|<local>/y|.R|kotlin/Int.inc|()
|
R|<local>/y|.<Unresolved name: inc>#()
|
||||||
}
|
}
|
||||||
public final fun incompleteCallAtMostOnce(x: R|kotlin/Any|, y: R|kotlin/Any|): R|kotlin/Unit| {
|
public final fun incompleteCallAtMostOnce(x: R|kotlin/Any|, y: R|kotlin/Any|): R|kotlin/Unit| {
|
||||||
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/atMostOnce|<R|kotlin/Int|>(<L> = atMostOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=AT_MOST_ONCE> {
|
R|/select|<R|kotlin/Int|>(vararg(R|/id|<R|kotlin/Int|>(R|/atMostOnce|<R|kotlin/Int|>(<L> = atMostOnce@fun <anonymous>(): R|kotlin/Int| <inline=NoInline, kind=AT_MOST_ONCE> {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ fun <K> materialize(): K = null!!
|
|||||||
|
|
||||||
fun basic(x: Any?) {
|
fun basic(x: Any?) {
|
||||||
exactlyOnce { x as Int }
|
exactlyOnce { x as Int }
|
||||||
x.inc() // OK
|
x.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
}
|
}
|
||||||
|
|
||||||
fun completedCallExactlyOnce(x: Any?, y: Any?) {
|
fun completedCallExactlyOnce(x: Any?, y: Any?) {
|
||||||
@@ -41,7 +41,7 @@ fun completedCallExactlyOnce(x: Any?, y: Any?) {
|
|||||||
y as Int,
|
y as Int,
|
||||||
exactlyOnce { x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
exactlyOnce { x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
||||||
).inc() // OK
|
).inc() // OK
|
||||||
x.inc() // OK
|
x.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
y.inc() // OK
|
y.inc() // OK
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ fun completedCallAtLeastOnce(x: Any?, y: Any?) {
|
|||||||
y as Int,
|
y as Int,
|
||||||
atLeastOnce { x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
atLeastOnce { x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
||||||
).inc() // OK
|
).inc() // OK
|
||||||
x.inc() // OK
|
x.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
y.inc() // OK
|
y.inc() // OK
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,8 +91,8 @@ fun incompleteCallExactlyOnce(x: Any, y: Any) {
|
|||||||
id(exactlyOnce { x as Int; y.<!UNRESOLVED_REFERENCE!>inc<!>(); x.inc(); materialize() }),
|
id(exactlyOnce { x as Int; y.<!UNRESOLVED_REFERENCE!>inc<!>(); x.inc(); materialize() }),
|
||||||
exactlyOnce { y as Int; x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
exactlyOnce { y as Int; x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
||||||
).inc() // OK
|
).inc() // OK
|
||||||
x.inc() // OK
|
x.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
y.inc() // OK
|
y.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
}
|
}
|
||||||
|
|
||||||
fun incompleteCallAtLeastOnce(x: Any, y: Any) {
|
fun incompleteCallAtLeastOnce(x: Any, y: Any) {
|
||||||
@@ -100,8 +100,8 @@ fun incompleteCallAtLeastOnce(x: Any, y: Any) {
|
|||||||
id(atLeastOnce { x as Int; y.<!UNRESOLVED_REFERENCE!>inc<!>(); x.inc(); materialize() }),
|
id(atLeastOnce { x as Int; y.<!UNRESOLVED_REFERENCE!>inc<!>(); x.inc(); materialize() }),
|
||||||
atLeastOnce { y as Int; x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
atLeastOnce { y as Int; x.<!UNRESOLVED_REFERENCE!>inc<!>(); y.inc(); 1 }
|
||||||
).inc() // OK
|
).inc() // OK
|
||||||
x.inc() // OK
|
x.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
y.inc() // OK
|
y.<!UNRESOLVED_REFERENCE!>inc<!>() // Bad: KT-37838 -> OK
|
||||||
}
|
}
|
||||||
|
|
||||||
fun incompleteCallAtMostOnce(x: Any, y: Any) {
|
fun incompleteCallAtMostOnce(x: Any, y: Any) {
|
||||||
|
|||||||
+532
-540
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -20,7 +20,7 @@ FILE: flowFromInplaceLambda2.kt
|
|||||||
^ Int(123)
|
^ Int(123)
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
R|<local>/x|.R|kotlin/String.length|
|
R|<local>/x|.R|kotlin/String.length<Inapplicable(UNSAFE_CALL): kotlin/String.length>#|
|
||||||
}
|
}
|
||||||
public final fun test2(x: R|kotlin/String?|): R|kotlin/Unit| {
|
public final fun test2(x: R|kotlin/String?|): R|kotlin/Unit| {
|
||||||
R|/foo|<R|kotlin/Int|>(R|/id|<R|kotlin/Int?|>(R|kotlin/run|<R|kotlin/Int?|>(<L> = run@fun <anonymous>(): R|kotlin/Int?| <inline=Inline, kind=EXACTLY_ONCE> {
|
R|/foo|<R|kotlin/Int|>(R|/id|<R|kotlin/Int?|>(R|kotlin/run|<R|kotlin/Int?|>(<L> = run@fun <anonymous>(): R|kotlin/Int?| <inline=Inline, kind=EXACTLY_ONCE> {
|
||||||
@@ -32,7 +32,7 @@ FILE: flowFromInplaceLambda2.kt
|
|||||||
^ Int(123)
|
^ Int(123)
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
R|<local>/x|.R|kotlin/String.length|
|
R|<local>/x|.R|kotlin/String.length<Inapplicable(UNSAFE_CALL): kotlin/String.length>#|
|
||||||
}
|
}
|
||||||
public final fun test3(x: R|kotlin/String?|): R|kotlin/Unit| {
|
public final fun test3(x: R|kotlin/String?|): R|kotlin/Unit| {
|
||||||
R|/foo|<R|kotlin/Int|>(R|/id|<R|kotlin/Int?|>(R|kotlin/run|<R|kotlin/Int?|>(<L> = run@fun <anonymous>(): R|kotlin/Int?| <inline=Inline, kind=EXACTLY_ONCE> {
|
R|/foo|<R|kotlin/Int|>(R|/id|<R|kotlin/Int?|>(R|kotlin/run|<R|kotlin/Int?|>(<L> = run@fun <anonymous>(): R|kotlin/Int?| <inline=Inline, kind=EXACTLY_ONCE> {
|
||||||
@@ -52,7 +52,7 @@ FILE: flowFromInplaceLambda2.kt
|
|||||||
^ Int(123)
|
^ Int(123)
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
R|<local>/x|.R|kotlin/String.length|
|
R|<local>/x|.R|kotlin/String.length<Inapplicable(UNSAFE_CALL): kotlin/String.length>#|
|
||||||
}
|
}
|
||||||
public final fun test4(x: R|kotlin/String?|): R|kotlin/Unit| {
|
public final fun test4(x: R|kotlin/String?|): R|kotlin/Unit| {
|
||||||
lvar p: R|kotlin/String?| = R|<local>/x|
|
lvar p: R|kotlin/String?| = R|<local>/x|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ fun test1(x: String?) {
|
|||||||
1,
|
1,
|
||||||
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
||||||
)
|
)
|
||||||
x.length // OK (x as String unconditional)
|
x<!UNSAFE_CALL!>.<!>length // Bad: KT-37838 -> OK (x as String unconditional)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2(x: String?) {
|
fun test2(x: String?) {
|
||||||
@@ -23,7 +23,7 @@ fun test2(x: String?) {
|
|||||||
someCompletedCall(1),
|
someCompletedCall(1),
|
||||||
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
||||||
)
|
)
|
||||||
x.length // OK (x as String unconditional)
|
x<!UNSAFE_CALL!>.<!>length // OK (x as String unconditional)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test3(x: String?) {
|
fun test3(x: String?) {
|
||||||
@@ -32,7 +32,7 @@ fun test3(x: String?) {
|
|||||||
if (true) 1 else 2,
|
if (true) 1 else 2,
|
||||||
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
||||||
)
|
)
|
||||||
x.length // OK (x as String unconditional)
|
x<!UNSAFE_CALL!>.<!>length // Bad: KT-37838 -> OK (x as String unconditional)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test4(x: String?) {
|
fun test4(x: String?) {
|
||||||
@@ -62,7 +62,7 @@ fun test6(x: String?) {
|
|||||||
1,
|
1,
|
||||||
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
run { x<!UNSAFE_CALL!>.<!>length; 123 } // Bad (resolution order undefined)
|
||||||
)
|
)
|
||||||
x<!UNSAFE_CALL!>.<!>length // OK (x as String in both branches)
|
x<!UNSAFE_CALL!>.<!>length // Bad: KT-37838 -> OK (x as String in both branches)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test7(x: String?) {
|
fun test7(x: String?) {
|
||||||
|
|||||||
+191
-209
@@ -154,19 +154,17 @@ digraph flowFromInplaceLambda3_kt {
|
|||||||
52 [label="Postponed exit from lambda"];
|
52 [label="Postponed exit from lambda"];
|
||||||
53 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow];
|
53 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow];
|
||||||
54 [label="Access variable R|<local>/x|"];
|
54 [label="Access variable R|<local>/x|"];
|
||||||
55 [label="Smart cast: R|<local>/x|"];
|
55 [label="Access variable <Unresolved name: length>#"];
|
||||||
56 [label="Access variable <Unresolved name: length>#"];
|
|
||||||
subgraph cluster_21 {
|
subgraph cluster_21 {
|
||||||
color=blue
|
color=blue
|
||||||
57 [label="Function call arguments enter"];
|
56 [label="Function call arguments enter"];
|
||||||
58 [label="Access variable R|<local>/x|"];
|
57 [label="Access variable R|<local>/x|"];
|
||||||
59 [label="Smart cast: R|<local>/x|"];
|
58 [label="Function call arguments exit"];
|
||||||
60 [label="Function call arguments exit"];
|
|
||||||
}
|
}
|
||||||
61 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
59 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
||||||
62 [label="Exit block"];
|
60 [label="Exit block"];
|
||||||
}
|
}
|
||||||
63 [label="Exit function test1" style="filled" fillcolor=red];
|
61 [label="Exit function test1" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
36 -> {37};
|
36 -> {37};
|
||||||
@@ -186,8 +184,8 @@ digraph flowFromInplaceLambda3_kt {
|
|||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
|
||||||
52 -> {44} [color=green style=dashed];
|
52 -> {44} [color=green style=dashed];
|
||||||
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
@@ -196,48 +194,47 @@ digraph flowFromInplaceLambda3_kt {
|
|||||||
58 -> {59};
|
58 -> {59};
|
||||||
59 -> {60};
|
59 -> {60};
|
||||||
60 -> {61};
|
60 -> {61};
|
||||||
61 -> {62};
|
|
||||||
62 -> {63};
|
|
||||||
|
|
||||||
subgraph cluster_22 {
|
subgraph cluster_22 {
|
||||||
color=red
|
color=red
|
||||||
64 [label="Enter function test1m" style="filled" fillcolor=red];
|
62 [label="Enter function test1m" style="filled" fillcolor=red];
|
||||||
subgraph cluster_23 {
|
subgraph cluster_23 {
|
||||||
color=blue
|
color=blue
|
||||||
65 [label="Enter block"];
|
63 [label="Enter block"];
|
||||||
66 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
64 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
||||||
67 [label="Const: String()"];
|
65 [label="Const: String()"];
|
||||||
68 [label="Assignment: R|<local>/x|"];
|
66 [label="Assignment: R|<local>/x|"];
|
||||||
69 [label="Access variable R|<local>/x|"];
|
67 [label="Access variable R|<local>/x|"];
|
||||||
70 [label="Smart cast: R|<local>/x|"];
|
68 [label="Smart cast: R|<local>/x|"];
|
||||||
71 [label="Access variable R|kotlin/String.length|"];
|
69 [label="Access variable R|kotlin/String.length|"];
|
||||||
subgraph cluster_24 {
|
subgraph cluster_24 {
|
||||||
color=blue
|
color=blue
|
||||||
72 [label="Function call arguments enter"];
|
70 [label="Function call arguments enter"];
|
||||||
73 [label="Postponed enter to lambda"];
|
71 [label="Postponed enter to lambda"];
|
||||||
subgraph cluster_25 {
|
subgraph cluster_25 {
|
||||||
color=blue
|
color=blue
|
||||||
74 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
72 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
||||||
subgraph cluster_26 {
|
subgraph cluster_26 {
|
||||||
color=blue
|
color=blue
|
||||||
75 [label="Enter block"];
|
73 [label="Enter block"];
|
||||||
76 [label="Const: String()"];
|
74 [label="Const: String()"];
|
||||||
77 [label="Assignment: R|<local>/x|"];
|
75 [label="Assignment: R|<local>/x|"];
|
||||||
78 [label="Exit block"];
|
76 [label="Exit block"];
|
||||||
}
|
}
|
||||||
79 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
77 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
80 [label="Function call arguments exit"];
|
78 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
81 [label="Postponed exit from lambda"];
|
79 [label="Postponed exit from lambda"];
|
||||||
82 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow];
|
80 [label="Function call: R|/unknown|(...)" style="filled" fillcolor=yellow];
|
||||||
83 [label="Access variable R|<local>/x|"];
|
81 [label="Access variable R|<local>/x|"];
|
||||||
84 [label="Smart cast: R|<local>/x|"];
|
82 [label="Access variable <Unresolved name: length>#"];
|
||||||
85 [label="Access variable R|kotlin/String.length|"];
|
83 [label="Exit block"];
|
||||||
86 [label="Exit block"];
|
|
||||||
}
|
}
|
||||||
87 [label="Exit function test1m" style="filled" fillcolor=red];
|
84 [label="Exit function test1m" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
62 -> {63};
|
||||||
|
63 -> {64};
|
||||||
64 -> {65};
|
64 -> {65};
|
||||||
65 -> {66};
|
65 -> {66};
|
||||||
66 -> {67};
|
66 -> {67};
|
||||||
@@ -245,257 +242,242 @@ digraph flowFromInplaceLambda3_kt {
|
|||||||
68 -> {69};
|
68 -> {69};
|
||||||
69 -> {70};
|
69 -> {70};
|
||||||
70 -> {71};
|
70 -> {71};
|
||||||
71 -> {72};
|
71 -> {72 78 79};
|
||||||
|
71 -> {72} [style=dashed];
|
||||||
72 -> {73};
|
72 -> {73};
|
||||||
73 -> {74 80 81};
|
73 -> {74};
|
||||||
73 -> {74} [style=dashed];
|
|
||||||
74 -> {75};
|
74 -> {75};
|
||||||
75 -> {76};
|
75 -> {76};
|
||||||
76 -> {77};
|
76 -> {77};
|
||||||
77 -> {78};
|
77 -> {79};
|
||||||
78 -> {79};
|
78 -> {80};
|
||||||
79 -> {81};
|
79 -> {71} [color=green style=dashed];
|
||||||
80 -> {82};
|
79 -> {80} [label="Postponed"];
|
||||||
|
80 -> {81};
|
||||||
81 -> {82};
|
81 -> {82};
|
||||||
81 -> {73} [color=green style=dashed];
|
|
||||||
82 -> {83};
|
82 -> {83};
|
||||||
83 -> {84};
|
83 -> {84};
|
||||||
84 -> {85};
|
|
||||||
85 -> {86};
|
|
||||||
86 -> {87};
|
|
||||||
|
|
||||||
subgraph cluster_27 {
|
subgraph cluster_27 {
|
||||||
color=red
|
color=red
|
||||||
88 [label="Enter function test2" style="filled" fillcolor=red];
|
85 [label="Enter function test2" style="filled" fillcolor=red];
|
||||||
subgraph cluster_28 {
|
subgraph cluster_28 {
|
||||||
color=blue
|
color=blue
|
||||||
89 [label="Enter block"];
|
86 [label="Enter block"];
|
||||||
90 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
87 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
||||||
91 [label="Const: String()"];
|
88 [label="Const: String()"];
|
||||||
92 [label="Assignment: R|<local>/x|"];
|
89 [label="Assignment: R|<local>/x|"];
|
||||||
93 [label="Access variable R|<local>/x|"];
|
90 [label="Access variable R|<local>/x|"];
|
||||||
94 [label="Smart cast: R|<local>/x|"];
|
91 [label="Smart cast: R|<local>/x|"];
|
||||||
95 [label="Access variable R|kotlin/String.length|"];
|
92 [label="Access variable R|kotlin/String.length|"];
|
||||||
subgraph cluster_29 {
|
subgraph cluster_29 {
|
||||||
color=blue
|
color=blue
|
||||||
96 [label="Function call arguments enter"];
|
93 [label="Function call arguments enter"];
|
||||||
97 [label="Postponed enter to lambda"];
|
94 [label="Postponed enter to lambda"];
|
||||||
subgraph cluster_30 {
|
subgraph cluster_30 {
|
||||||
color=blue
|
color=blue
|
||||||
98 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
95 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
||||||
subgraph cluster_31 {
|
subgraph cluster_31 {
|
||||||
color=blue
|
color=blue
|
||||||
99 [label="Enter block"];
|
96 [label="Enter block"];
|
||||||
100 [label="Const: Int(1)"];
|
97 [label="Const: Int(1)"];
|
||||||
101 [label="Assignment: R|<local>/x|"];
|
98 [label="Assignment: R|<local>/x|"];
|
||||||
102 [label="Exit block"];
|
99 [label="Exit block"];
|
||||||
}
|
}
|
||||||
103 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
100 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
104 [label="Function call arguments exit"];
|
101 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
105 [label="Postponed exit from lambda"];
|
102 [label="Postponed exit from lambda"];
|
||||||
106 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow];
|
103 [label="Function call: R|/atLeastOnce|(...)" style="filled" fillcolor=yellow];
|
||||||
107 [label="Access variable R|<local>/x|"];
|
104 [label="Access variable R|<local>/x|"];
|
||||||
108 [label="Smart cast: R|<local>/x|"];
|
105 [label="Access variable <Unresolved name: length>#"];
|
||||||
109 [label="Access variable <Unresolved name: length>#"];
|
|
||||||
subgraph cluster_32 {
|
subgraph cluster_32 {
|
||||||
color=blue
|
color=blue
|
||||||
110 [label="Function call arguments enter"];
|
106 [label="Function call arguments enter"];
|
||||||
111 [label="Access variable R|<local>/x|"];
|
107 [label="Access variable R|<local>/x|"];
|
||||||
112 [label="Smart cast: R|<local>/x|"];
|
108 [label="Function call arguments exit"];
|
||||||
113 [label="Function call arguments exit"];
|
|
||||||
}
|
}
|
||||||
114 [label="Function call: R|<local>/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow];
|
109 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
||||||
115 [label="Exit block"];
|
110 [label="Exit block"];
|
||||||
}
|
}
|
||||||
116 [label="Exit function test2" style="filled" fillcolor=red];
|
111 [label="Exit function test2" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
85 -> {86};
|
||||||
|
86 -> {87};
|
||||||
|
87 -> {88};
|
||||||
88 -> {89};
|
88 -> {89};
|
||||||
89 -> {90};
|
89 -> {90};
|
||||||
90 -> {91};
|
90 -> {91};
|
||||||
91 -> {92};
|
91 -> {92};
|
||||||
92 -> {93};
|
92 -> {93};
|
||||||
93 -> {94};
|
93 -> {94};
|
||||||
94 -> {95};
|
94 -> {95 101};
|
||||||
|
94 -> {102} [style=dotted];
|
||||||
|
94 -> {95} [style=dashed];
|
||||||
95 -> {96};
|
95 -> {96};
|
||||||
96 -> {97};
|
96 -> {97};
|
||||||
97 -> {98 104};
|
97 -> {98};
|
||||||
97 -> {105} [style=dotted];
|
|
||||||
97 -> {98} [style=dashed];
|
|
||||||
98 -> {99};
|
98 -> {99};
|
||||||
99 -> {100};
|
99 -> {100};
|
||||||
100 -> {101};
|
100 -> {102};
|
||||||
101 -> {102};
|
101 -> {103};
|
||||||
102 -> {103};
|
102 -> {94} [color=green style=dashed];
|
||||||
103 -> {105};
|
102 -> {103} [label="Postponed"];
|
||||||
104 -> {106};
|
103 -> {104};
|
||||||
|
104 -> {105};
|
||||||
105 -> {106};
|
105 -> {106};
|
||||||
105 -> {97} [color=green style=dashed];
|
|
||||||
106 -> {107};
|
106 -> {107};
|
||||||
107 -> {108};
|
107 -> {108};
|
||||||
108 -> {109};
|
108 -> {109};
|
||||||
109 -> {110};
|
109 -> {110};
|
||||||
110 -> {111};
|
110 -> {111};
|
||||||
111 -> {112};
|
|
||||||
|
subgraph cluster_33 {
|
||||||
|
color=red
|
||||||
|
112 [label="Enter function test3" style="filled" fillcolor=red];
|
||||||
|
subgraph cluster_34 {
|
||||||
|
color=blue
|
||||||
|
113 [label="Enter block"];
|
||||||
|
114 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
||||||
|
115 [label="Const: String()"];
|
||||||
|
116 [label="Assignment: R|<local>/x|"];
|
||||||
|
117 [label="Access variable R|<local>/x|"];
|
||||||
|
118 [label="Smart cast: R|<local>/x|"];
|
||||||
|
119 [label="Access variable R|kotlin/String.length|"];
|
||||||
|
subgraph cluster_35 {
|
||||||
|
color=blue
|
||||||
|
120 [label="Function call arguments enter"];
|
||||||
|
121 [label="Postponed enter to lambda"];
|
||||||
|
subgraph cluster_36 {
|
||||||
|
color=blue
|
||||||
|
122 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
||||||
|
subgraph cluster_37 {
|
||||||
|
color=blue
|
||||||
|
123 [label="Enter block"];
|
||||||
|
124 [label="Const: Int(1)"];
|
||||||
|
125 [label="Assignment: R|<local>/x|"];
|
||||||
|
126 [label="Exit block"];
|
||||||
|
}
|
||||||
|
127 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
|
}
|
||||||
|
128 [label="Function call arguments exit"];
|
||||||
|
}
|
||||||
|
129 [label="Postponed exit from lambda"];
|
||||||
|
130 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow];
|
||||||
|
131 [label="Access variable R|<local>/x|"];
|
||||||
|
132 [label="Access variable <Unresolved name: length>#"];
|
||||||
|
subgraph cluster_38 {
|
||||||
|
color=blue
|
||||||
|
133 [label="Function call arguments enter"];
|
||||||
|
134 [label="Access variable R|<local>/x|"];
|
||||||
|
135 [label="Function call arguments exit"];
|
||||||
|
}
|
||||||
|
136 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
||||||
|
137 [label="Exit block"];
|
||||||
|
}
|
||||||
|
138 [label="Exit function test3" style="filled" fillcolor=red];
|
||||||
|
}
|
||||||
112 -> {113};
|
112 -> {113};
|
||||||
113 -> {114};
|
113 -> {114};
|
||||||
114 -> {115};
|
114 -> {115};
|
||||||
115 -> {116};
|
115 -> {116};
|
||||||
|
116 -> {117};
|
||||||
subgraph cluster_33 {
|
|
||||||
color=red
|
|
||||||
117 [label="Enter function test3" style="filled" fillcolor=red];
|
|
||||||
subgraph cluster_34 {
|
|
||||||
color=blue
|
|
||||||
118 [label="Enter block"];
|
|
||||||
119 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
|
||||||
120 [label="Const: String()"];
|
|
||||||
121 [label="Assignment: R|<local>/x|"];
|
|
||||||
122 [label="Access variable R|<local>/x|"];
|
|
||||||
123 [label="Smart cast: R|<local>/x|"];
|
|
||||||
124 [label="Access variable R|kotlin/String.length|"];
|
|
||||||
subgraph cluster_35 {
|
|
||||||
color=blue
|
|
||||||
125 [label="Function call arguments enter"];
|
|
||||||
126 [label="Postponed enter to lambda"];
|
|
||||||
subgraph cluster_36 {
|
|
||||||
color=blue
|
|
||||||
127 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
|
||||||
subgraph cluster_37 {
|
|
||||||
color=blue
|
|
||||||
128 [label="Enter block"];
|
|
||||||
129 [label="Const: Int(1)"];
|
|
||||||
130 [label="Assignment: R|<local>/x|"];
|
|
||||||
131 [label="Exit block"];
|
|
||||||
}
|
|
||||||
132 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
|
||||||
}
|
|
||||||
133 [label="Function call arguments exit"];
|
|
||||||
}
|
|
||||||
134 [label="Postponed exit from lambda"];
|
|
||||||
135 [label="Function call: R|/exactlyOnce|(...)" style="filled" fillcolor=yellow];
|
|
||||||
136 [label="Access variable R|<local>/x|"];
|
|
||||||
137 [label="Smart cast: R|<local>/x|"];
|
|
||||||
138 [label="Access variable <Unresolved name: length>#"];
|
|
||||||
subgraph cluster_38 {
|
|
||||||
color=blue
|
|
||||||
139 [label="Function call arguments enter"];
|
|
||||||
140 [label="Access variable R|<local>/x|"];
|
|
||||||
141 [label="Smart cast: R|<local>/x|"];
|
|
||||||
142 [label="Function call arguments exit"];
|
|
||||||
}
|
|
||||||
143 [label="Function call: R|<local>/x|.R|kotlin/Int.inc|()" style="filled" fillcolor=yellow];
|
|
||||||
144 [label="Exit block"];
|
|
||||||
}
|
|
||||||
145 [label="Exit function test3" style="filled" fillcolor=red];
|
|
||||||
}
|
|
||||||
117 -> {118};
|
117 -> {118};
|
||||||
118 -> {119};
|
118 -> {119};
|
||||||
119 -> {120};
|
119 -> {120};
|
||||||
120 -> {121};
|
120 -> {121};
|
||||||
121 -> {122};
|
121 -> {122 128};
|
||||||
|
121 -> {129} [style=dotted];
|
||||||
|
121 -> {122} [style=dashed];
|
||||||
122 -> {123};
|
122 -> {123};
|
||||||
123 -> {124};
|
123 -> {124};
|
||||||
124 -> {125};
|
124 -> {125};
|
||||||
125 -> {126};
|
125 -> {126};
|
||||||
126 -> {127 133};
|
126 -> {127};
|
||||||
126 -> {134} [style=dotted];
|
127 -> {129};
|
||||||
126 -> {127} [style=dashed];
|
128 -> {130};
|
||||||
127 -> {128};
|
129 -> {130} [label="Postponed"];
|
||||||
128 -> {129};
|
|
||||||
129 -> {130};
|
|
||||||
130 -> {131};
|
130 -> {131};
|
||||||
131 -> {132};
|
131 -> {132};
|
||||||
132 -> {134};
|
132 -> {133};
|
||||||
133 -> {135};
|
133 -> {134};
|
||||||
134 -> {135};
|
134 -> {135};
|
||||||
135 -> {136};
|
135 -> {136};
|
||||||
136 -> {137};
|
136 -> {137};
|
||||||
137 -> {138};
|
137 -> {138};
|
||||||
138 -> {139};
|
|
||||||
|
subgraph cluster_39 {
|
||||||
|
color=red
|
||||||
|
139 [label="Enter function test4" style="filled" fillcolor=red];
|
||||||
|
subgraph cluster_40 {
|
||||||
|
color=blue
|
||||||
|
140 [label="Enter block"];
|
||||||
|
141 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
||||||
|
142 [label="Const: String()"];
|
||||||
|
143 [label="Assignment: R|<local>/x|"];
|
||||||
|
144 [label="Access variable R|<local>/x|"];
|
||||||
|
145 [label="Smart cast: R|<local>/x|"];
|
||||||
|
146 [label="Access variable R|kotlin/String.length|"];
|
||||||
|
subgraph cluster_41 {
|
||||||
|
color=blue
|
||||||
|
147 [label="Function call arguments enter"];
|
||||||
|
148 [label="Postponed enter to lambda"];
|
||||||
|
subgraph cluster_42 {
|
||||||
|
color=blue
|
||||||
|
149 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
||||||
|
subgraph cluster_43 {
|
||||||
|
color=blue
|
||||||
|
150 [label="Enter block"];
|
||||||
|
151 [label="Const: Int(1)"];
|
||||||
|
152 [label="Assignment: R|<local>/x|"];
|
||||||
|
153 [label="Exit block"];
|
||||||
|
}
|
||||||
|
154 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
|
}
|
||||||
|
155 [label="Function call arguments exit"];
|
||||||
|
}
|
||||||
|
156 [label="Postponed exit from lambda"];
|
||||||
|
157 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow];
|
||||||
|
158 [label="Access variable R|<local>/x|"];
|
||||||
|
159 [label="Access variable <Unresolved name: length>#"];
|
||||||
|
subgraph cluster_44 {
|
||||||
|
color=blue
|
||||||
|
160 [label="Function call arguments enter"];
|
||||||
|
161 [label="Access variable R|<local>/x|"];
|
||||||
|
162 [label="Function call arguments exit"];
|
||||||
|
}
|
||||||
|
163 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
||||||
|
164 [label="Exit block"];
|
||||||
|
}
|
||||||
|
165 [label="Exit function test4" style="filled" fillcolor=red];
|
||||||
|
}
|
||||||
139 -> {140};
|
139 -> {140};
|
||||||
140 -> {141};
|
140 -> {141};
|
||||||
141 -> {142};
|
141 -> {142};
|
||||||
142 -> {143};
|
142 -> {143};
|
||||||
143 -> {144};
|
143 -> {144};
|
||||||
144 -> {145};
|
144 -> {145};
|
||||||
|
145 -> {146};
|
||||||
subgraph cluster_39 {
|
|
||||||
color=red
|
|
||||||
146 [label="Enter function test4" style="filled" fillcolor=red];
|
|
||||||
subgraph cluster_40 {
|
|
||||||
color=blue
|
|
||||||
147 [label="Enter block"];
|
|
||||||
148 [label="Variable declaration: lvar x: R|kotlin/Any?|"];
|
|
||||||
149 [label="Const: String()"];
|
|
||||||
150 [label="Assignment: R|<local>/x|"];
|
|
||||||
151 [label="Access variable R|<local>/x|"];
|
|
||||||
152 [label="Smart cast: R|<local>/x|"];
|
|
||||||
153 [label="Access variable R|kotlin/String.length|"];
|
|
||||||
subgraph cluster_41 {
|
|
||||||
color=blue
|
|
||||||
154 [label="Function call arguments enter"];
|
|
||||||
155 [label="Postponed enter to lambda"];
|
|
||||||
subgraph cluster_42 {
|
|
||||||
color=blue
|
|
||||||
156 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
|
||||||
subgraph cluster_43 {
|
|
||||||
color=blue
|
|
||||||
157 [label="Enter block"];
|
|
||||||
158 [label="Const: Int(1)"];
|
|
||||||
159 [label="Assignment: R|<local>/x|"];
|
|
||||||
160 [label="Exit block"];
|
|
||||||
}
|
|
||||||
161 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
|
||||||
}
|
|
||||||
162 [label="Function call arguments exit"];
|
|
||||||
}
|
|
||||||
163 [label="Postponed exit from lambda"];
|
|
||||||
164 [label="Function call: R|/atMostOnce|(...)" style="filled" fillcolor=yellow];
|
|
||||||
165 [label="Access variable R|<local>/x|"];
|
|
||||||
166 [label="Smart cast: R|<local>/x|"];
|
|
||||||
167 [label="Access variable <Unresolved name: length>#"];
|
|
||||||
subgraph cluster_44 {
|
|
||||||
color=blue
|
|
||||||
168 [label="Function call arguments enter"];
|
|
||||||
169 [label="Access variable R|<local>/x|"];
|
|
||||||
170 [label="Smart cast: R|<local>/x|"];
|
|
||||||
171 [label="Function call arguments exit"];
|
|
||||||
}
|
|
||||||
172 [label="Function call: R|<local>/x|.<Unresolved name: inc>#()" style="filled" fillcolor=yellow];
|
|
||||||
173 [label="Exit block"];
|
|
||||||
}
|
|
||||||
174 [label="Exit function test4" style="filled" fillcolor=red];
|
|
||||||
}
|
|
||||||
146 -> {147};
|
146 -> {147};
|
||||||
147 -> {148};
|
147 -> {148};
|
||||||
148 -> {149};
|
148 -> {149 155 156};
|
||||||
|
148 -> {149} [style=dashed];
|
||||||
149 -> {150};
|
149 -> {150};
|
||||||
150 -> {151};
|
150 -> {151};
|
||||||
151 -> {152};
|
151 -> {152};
|
||||||
152 -> {153};
|
152 -> {153};
|
||||||
153 -> {154};
|
153 -> {154};
|
||||||
154 -> {155};
|
154 -> {156};
|
||||||
155 -> {156 162 163};
|
155 -> {157};
|
||||||
155 -> {156} [style=dashed];
|
156 -> {157} [label="Postponed"];
|
||||||
156 -> {157};
|
|
||||||
157 -> {158};
|
157 -> {158};
|
||||||
158 -> {159};
|
158 -> {159};
|
||||||
159 -> {160};
|
159 -> {160};
|
||||||
160 -> {161};
|
160 -> {161};
|
||||||
161 -> {163};
|
161 -> {162};
|
||||||
162 -> {164};
|
162 -> {163};
|
||||||
163 -> {164};
|
163 -> {164};
|
||||||
164 -> {165};
|
164 -> {165};
|
||||||
165 -> {166};
|
|
||||||
166 -> {167};
|
|
||||||
167 -> {168};
|
|
||||||
168 -> {169};
|
|
||||||
169 -> {170};
|
|
||||||
170 -> {171};
|
|
||||||
171 -> {172};
|
|
||||||
172 -> {173};
|
|
||||||
173 -> {174};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -77,7 +77,7 @@ FILE: flowFromInplaceLambda3.kt
|
|||||||
R|<local>/x| = String()
|
R|<local>/x| = String()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.R|kotlin/String.length|
|
R|<local>/x|.<Unresolved name: length>#
|
||||||
}
|
}
|
||||||
public final fun test2(): R|kotlin/Unit| {
|
public final fun test2(): R|kotlin/Unit| {
|
||||||
lvar x: R|kotlin/Any?|
|
lvar x: R|kotlin/Any?|
|
||||||
@@ -88,7 +88,7 @@ FILE: flowFromInplaceLambda3.kt
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.<Unresolved name: length>#
|
R|<local>/x|.<Unresolved name: length>#
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
}
|
}
|
||||||
public final fun test3(): R|kotlin/Unit| {
|
public final fun test3(): R|kotlin/Unit| {
|
||||||
lvar x: R|kotlin/Any?|
|
lvar x: R|kotlin/Any?|
|
||||||
@@ -99,7 +99,7 @@ FILE: flowFromInplaceLambda3.kt
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.<Unresolved name: length>#
|
R|<local>/x|.<Unresolved name: length>#
|
||||||
R|<local>/x|.R|kotlin/Int.inc|()
|
R|<local>/x|.<Unresolved name: inc>#()
|
||||||
}
|
}
|
||||||
public final fun test4(): R|kotlin/Unit| {
|
public final fun test4(): R|kotlin/Unit| {
|
||||||
lvar x: R|kotlin/Any?|
|
lvar x: R|kotlin/Any?|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ fun test1m() {
|
|||||||
x = ""
|
x = ""
|
||||||
x.length
|
x.length
|
||||||
unknown { x = "" }
|
unknown { x = "" }
|
||||||
x.length
|
x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2() {
|
fun test2() {
|
||||||
@@ -45,7 +45,7 @@ fun test2() {
|
|||||||
x.length
|
x.length
|
||||||
atLeastOnce { x = 1 }
|
atLeastOnce { x = 1 }
|
||||||
x.<!UNRESOLVED_REFERENCE!>length<!>
|
x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||||
x.inc()
|
x.<!UNRESOLVED_REFERENCE!>inc<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test3() {
|
fun test3() {
|
||||||
@@ -54,7 +54,7 @@ fun test3() {
|
|||||||
x.length
|
x.length
|
||||||
exactlyOnce { x = 1 }
|
exactlyOnce { x = 1 }
|
||||||
x.<!UNRESOLVED_REFERENCE!>length<!>
|
x.<!UNRESOLVED_REFERENCE!>length<!>
|
||||||
x.inc()
|
x.<!UNRESOLVED_REFERENCE!>inc<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test4() {
|
fun test4() {
|
||||||
|
|||||||
+430
-450
File diff suppressed because it is too large
Load Diff
+6
-6
@@ -83,8 +83,8 @@ FILE: flowFromTwoInplaceLambdas.kt
|
|||||||
^ Int(123)
|
^ Int(123)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/p|.R|kotlin/String.length<Inapplicable(UNSAFE_CALL): kotlin/String.length>#|
|
R|<local>/p|.<Unresolved name: length>#
|
||||||
R|<local>/p|?.{ $subj$.R|kotlin/String.length| }
|
R|<local>/p|?.{ $subj$.<Unresolved name: length># }
|
||||||
}
|
}
|
||||||
public abstract interface I1 : R|kotlin/Any| {
|
public abstract interface I1 : R|kotlin/Any| {
|
||||||
public abstract val x: R|kotlin/Int|
|
public abstract val x: R|kotlin/Int|
|
||||||
@@ -110,8 +110,8 @@ FILE: flowFromTwoInplaceLambdas.kt
|
|||||||
^ Int(123)
|
^ Int(123)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.R|/I1.x|
|
R|<local>/x|.<Unresolved name: x>#
|
||||||
R|<local>/x|.R|/I2.y|
|
R|<local>/x|.<Unresolved name: y>#
|
||||||
}
|
}
|
||||||
public final fun test5(x: R|kotlin/Any?|, q: R|kotlin/String?|): R|kotlin/Unit| {
|
public final fun test5(x: R|kotlin/Any?|, q: R|kotlin/String?|): R|kotlin/Unit| {
|
||||||
lvar p: R|kotlin/Any?| = R|<local>/x|
|
lvar p: R|kotlin/Any?| = R|<local>/x|
|
||||||
@@ -125,8 +125,8 @@ FILE: flowFromTwoInplaceLambdas.kt
|
|||||||
^ R|/n|<R|kotlin/Int?|>()
|
^ R|/n|<R|kotlin/Int?|>()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/p|.R|kotlin/String.length<Inapplicable(UNSAFE_CALL): kotlin/String.length>#|
|
R|<local>/p|.<Unresolved name: length>#
|
||||||
R|<local>/p|?.{ $subj$.R|kotlin/String.length| }
|
R|<local>/p|?.{ $subj$.<Unresolved name: length># }
|
||||||
}
|
}
|
||||||
public final fun test6(): R|kotlin/Unit| {
|
public final fun test6(): R|kotlin/Unit| {
|
||||||
lval x: R|kotlin/String|
|
lval x: R|kotlin/String|
|
||||||
|
|||||||
+6
-6
@@ -47,8 +47,8 @@ fun test3(x: Any?) {
|
|||||||
var p: Any? = x
|
var p: Any? = x
|
||||||
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad
|
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad
|
||||||
run2({ p = null; n() }, { p = ""; 123 })
|
run2({ p = null; n() }, { p = ""; 123 })
|
||||||
p<!UNSAFE_CALL!>.<!>length // Bad: p can be null
|
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad: p can be null
|
||||||
p?.length // OK: p is String | Nothing? = String?
|
p?.<!UNRESOLVED_REFERENCE!>length<!> // Bad: KT-37838 -> OK: p is String | Nothing? = String?
|
||||||
}
|
}
|
||||||
|
|
||||||
interface I1 { val x: Int }
|
interface I1 { val x: Int }
|
||||||
@@ -61,16 +61,16 @@ fun test4(x: Any?) {
|
|||||||
{ x as I1; x.<!UNRESOLVED_REFERENCE!>y<!>; n() }, // Bad: may or may not be called first
|
{ x as I1; x.<!UNRESOLVED_REFERENCE!>y<!>; n() }, // Bad: may or may not be called first
|
||||||
{ x as I2; x.<!UNRESOLVED_REFERENCE!>x<!>; 123 } // Bad: may or may not be called first
|
{ x as I2; x.<!UNRESOLVED_REFERENCE!>x<!>; 123 } // Bad: may or may not be called first
|
||||||
)
|
)
|
||||||
x.x // OK: x is I1 & I2
|
x.<!UNRESOLVED_REFERENCE!>x<!> // Bad: KT-37838 -> OK: x is I1 & I2
|
||||||
x.y // OK: x is I1 & I2
|
x.<!UNRESOLVED_REFERENCE!>y<!> // Bad: KT-37838 -> OK: x is I1 & I2
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test5(x: Any?, q: String?) {
|
fun test5(x: Any?, q: String?) {
|
||||||
var p: Any? = x
|
var p: Any? = x
|
||||||
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad
|
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad
|
||||||
run2({ p as Int; 123 }, { p = q; n() })
|
run2({ p as Int; 123 }, { p = q; n() })
|
||||||
p<!UNSAFE_CALL!>.<!>length // Bad: p is String? | (String? & Int) = String?
|
p.<!UNRESOLVED_REFERENCE!>length<!> // Bad: p is String? | (String? & Int) = String?
|
||||||
p?.length // OK: p is String?
|
p?.<!UNRESOLVED_REFERENCE!>length<!> // Bad: KT-37838 -> OK: p is String?
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test6() {
|
fun test6() {
|
||||||
|
|||||||
+1
-1
@@ -98,7 +98,7 @@ digraph initBlockAndInPlaceLambda_kt {
|
|||||||
21 -> {22};
|
21 -> {22};
|
||||||
22 -> {24};
|
22 -> {24};
|
||||||
23 -> {25};
|
23 -> {25};
|
||||||
24 -> {25};
|
24 -> {25} [label="Postponed"];
|
||||||
25 -> {26};
|
25 -> {26};
|
||||||
26 -> {27};
|
26 -> {27};
|
||||||
27 -> {28};
|
27 -> {28};
|
||||||
|
|||||||
+3
-3
@@ -128,7 +128,7 @@ digraph inplaceLambdaInControlFlowExpressions_kt {
|
|||||||
34 -> {36};
|
34 -> {36};
|
||||||
35 -> {37};
|
35 -> {37};
|
||||||
36 -> {37} [color=green];
|
36 -> {37} [color=green];
|
||||||
36 -> {40} [color=red];
|
36 -> {40} [color=red label="Postponed"];
|
||||||
37 -> {38};
|
37 -> {38};
|
||||||
38 -> {39};
|
38 -> {39};
|
||||||
39 -> {40};
|
39 -> {40};
|
||||||
@@ -216,7 +216,7 @@ digraph inplaceLambdaInControlFlowExpressions_kt {
|
|||||||
57 -> {59};
|
57 -> {59};
|
||||||
58 -> {60};
|
58 -> {60};
|
||||||
59 -> {60} [color=green];
|
59 -> {60} [color=green];
|
||||||
59 -> {69} [color=red];
|
59 -> {69} [color=red label="Postponed"];
|
||||||
60 -> {61};
|
60 -> {61};
|
||||||
61 -> {62};
|
61 -> {62};
|
||||||
62 -> {63 69};
|
62 -> {63 69};
|
||||||
@@ -281,7 +281,7 @@ digraph inplaceLambdaInControlFlowExpressions_kt {
|
|||||||
83 -> {85};
|
83 -> {85};
|
||||||
84 -> {86};
|
84 -> {86};
|
||||||
85 -> {86} [color=green];
|
85 -> {86} [color=green];
|
||||||
85 -> {87} [color=red];
|
85 -> {87} [color=red label="Postponed"];
|
||||||
86 -> {87};
|
86 -> {87};
|
||||||
87 -> {88};
|
87 -> {88};
|
||||||
88 -> {89};
|
88 -> {89};
|
||||||
|
|||||||
@@ -478,8 +478,8 @@ digraph jumps_kt {
|
|||||||
154 -> {155} [style=dotted];
|
154 -> {155} [style=dotted];
|
||||||
155 -> {157};
|
155 -> {157};
|
||||||
156 -> {158};
|
156 -> {158};
|
||||||
157 -> {158};
|
|
||||||
157 -> {149} [color=green style=dashed];
|
157 -> {149} [color=green style=dashed];
|
||||||
|
157 -> {158} [label="Postponed"];
|
||||||
158 -> {159};
|
158 -> {159};
|
||||||
159 -> {160};
|
159 -> {160};
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -77,7 +77,7 @@ digraph lambdaAsReturnOfLambda_kt {
|
|||||||
16 -> {17} [style=dotted];
|
16 -> {17} [style=dotted];
|
||||||
17 -> {18} [style=dotted];
|
17 -> {18} [style=dotted];
|
||||||
19 -> {21};
|
19 -> {21};
|
||||||
20 -> {21};
|
20 -> {21} [label="Postponed"];
|
||||||
21 -> {22};
|
21 -> {22};
|
||||||
22 -> {23} [color=green];
|
22 -> {23} [color=green];
|
||||||
|
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ digraph lambdaReturningObject_kt {
|
|||||||
33 -> {34};
|
33 -> {34};
|
||||||
35 -> {37};
|
35 -> {37};
|
||||||
36 -> {37} [color=green];
|
36 -> {37} [color=green];
|
||||||
36 -> {39} [color=red];
|
36 -> {39} [color=red label="Postponed"];
|
||||||
37 -> {38};
|
37 -> {38};
|
||||||
38 -> {39};
|
38 -> {39};
|
||||||
39 -> {40};
|
39 -> {40};
|
||||||
|
|||||||
@@ -112,8 +112,8 @@ digraph lambdas_kt {
|
|||||||
28 -> {29};
|
28 -> {29};
|
||||||
29 -> {31};
|
29 -> {31};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {32};
|
|
||||||
31 -> {20} [color=green style=dashed];
|
31 -> {20} [color=green style=dashed];
|
||||||
|
31 -> {32} [label="Postponed"];
|
||||||
32 -> {33};
|
32 -> {33};
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
@@ -276,8 +276,8 @@ digraph lambdas_kt {
|
|||||||
83 -> {84} [style=dotted];
|
83 -> {84} [style=dotted];
|
||||||
84 -> {86} [style=dotted];
|
84 -> {86} [style=dotted];
|
||||||
85 -> {87};
|
85 -> {87};
|
||||||
86 -> {87};
|
|
||||||
86 -> {77} [color=green style=dashed];
|
86 -> {77} [color=green style=dashed];
|
||||||
|
86 -> {87} [label="Postponed"];
|
||||||
87 -> {88};
|
87 -> {88};
|
||||||
88 -> {91};
|
88 -> {91};
|
||||||
88 -> {89} [style=dotted];
|
88 -> {89} [style=dotted];
|
||||||
@@ -334,8 +334,8 @@ digraph lambdas_kt {
|
|||||||
101 -> {102} [style=dotted];
|
101 -> {102} [style=dotted];
|
||||||
102 -> {104} [style=dotted];
|
102 -> {104} [style=dotted];
|
||||||
103 -> {105};
|
103 -> {105};
|
||||||
104 -> {105};
|
|
||||||
104 -> {95} [color=green style=dashed];
|
104 -> {95} [color=green style=dashed];
|
||||||
|
104 -> {105} [label="Postponed"];
|
||||||
105 -> {106};
|
105 -> {106};
|
||||||
106 -> {109};
|
106 -> {109};
|
||||||
106 -> {107} [style=dotted];
|
106 -> {107} [style=dotted];
|
||||||
|
|||||||
+4
-4
@@ -447,8 +447,8 @@ digraph localClassesWithImplicit_kt {
|
|||||||
58 -> {59};
|
58 -> {59};
|
||||||
59 -> {61};
|
59 -> {61};
|
||||||
60 -> {62};
|
60 -> {62};
|
||||||
61 -> {62};
|
|
||||||
61 -> {47} [color=green style=dashed];
|
61 -> {47} [color=green style=dashed];
|
||||||
|
61 -> {62} [label="Postponed"];
|
||||||
62 -> {63};
|
62 -> {63};
|
||||||
63 -> {66};
|
63 -> {66};
|
||||||
63 -> {64} [style=dotted];
|
63 -> {64} [style=dotted];
|
||||||
@@ -490,8 +490,8 @@ digraph localClassesWithImplicit_kt {
|
|||||||
99 -> {100};
|
99 -> {100};
|
||||||
100 -> {102};
|
100 -> {102};
|
||||||
101 -> {103};
|
101 -> {103};
|
||||||
102 -> {103};
|
|
||||||
102 -> {70} [color=green style=dashed];
|
102 -> {70} [color=green style=dashed];
|
||||||
|
102 -> {103} [label="Postponed"];
|
||||||
103 -> {104};
|
103 -> {104};
|
||||||
104 -> {107};
|
104 -> {107};
|
||||||
104 -> {105} [style=dotted];
|
104 -> {105} [style=dotted];
|
||||||
@@ -531,8 +531,8 @@ digraph localClassesWithImplicit_kt {
|
|||||||
134 -> {135};
|
134 -> {135};
|
||||||
135 -> {137};
|
135 -> {137};
|
||||||
136 -> {138};
|
136 -> {138};
|
||||||
137 -> {138};
|
|
||||||
137 -> {123} [color=green style=dashed];
|
137 -> {123} [color=green style=dashed];
|
||||||
|
137 -> {138} [label="Postponed"];
|
||||||
138 -> {139};
|
138 -> {139};
|
||||||
139 -> {142};
|
139 -> {142};
|
||||||
139 -> {140} [style=dotted];
|
139 -> {140} [style=dotted];
|
||||||
@@ -574,8 +574,8 @@ digraph localClassesWithImplicit_kt {
|
|||||||
175 -> {176};
|
175 -> {176};
|
||||||
176 -> {178};
|
176 -> {178};
|
||||||
177 -> {179};
|
177 -> {179};
|
||||||
178 -> {179};
|
|
||||||
178 -> {146} [color=green style=dashed];
|
178 -> {146} [color=green style=dashed];
|
||||||
|
178 -> {179} [label="Postponed"];
|
||||||
179 -> {180};
|
179 -> {180};
|
||||||
180 -> {183};
|
180 -> {183};
|
||||||
180 -> {181} [style=dotted];
|
180 -> {181} [style=dotted];
|
||||||
|
|||||||
+1
-1
@@ -100,7 +100,7 @@ digraph postponedLambdaInConstructor_kt {
|
|||||||
24 -> {26};
|
24 -> {26};
|
||||||
25 -> {27};
|
25 -> {27};
|
||||||
26 -> {27} [color=green];
|
26 -> {27} [color=green];
|
||||||
26 -> {28} [color=red];
|
26 -> {28} [color=red label="Postponed"];
|
||||||
27 -> {28};
|
27 -> {28};
|
||||||
28 -> {29};
|
28 -> {29};
|
||||||
29 -> {30} [color=green];
|
29 -> {30} [color=green];
|
||||||
|
|||||||
+3
-3
@@ -231,7 +231,7 @@ digraph postponedLambdaInReturn_kt {
|
|||||||
67 -> {68} [style=dotted];
|
67 -> {68} [style=dotted];
|
||||||
68 -> {70};
|
68 -> {70};
|
||||||
69 -> {71};
|
69 -> {71};
|
||||||
70 -> {71};
|
70 -> {71} [label="Postponed"];
|
||||||
71 -> {72};
|
71 -> {72};
|
||||||
72 -> {73};
|
72 -> {73};
|
||||||
73 -> {74};
|
73 -> {74};
|
||||||
@@ -402,7 +402,7 @@ digraph postponedLambdaInReturn_kt {
|
|||||||
121 -> {122} [style=dotted];
|
121 -> {122} [style=dotted];
|
||||||
122 -> {124};
|
122 -> {124};
|
||||||
123 -> {125};
|
123 -> {125};
|
||||||
124 -> {125};
|
124 -> {125} [label="Postponed"];
|
||||||
125 -> {126};
|
125 -> {126};
|
||||||
126 -> {127};
|
126 -> {127};
|
||||||
127 -> {128};
|
127 -> {128};
|
||||||
@@ -565,7 +565,7 @@ digraph postponedLambdaInReturn_kt {
|
|||||||
176 -> {177} [style=dotted];
|
176 -> {177} [style=dotted];
|
||||||
177 -> {179};
|
177 -> {179};
|
||||||
178 -> {180};
|
178 -> {180};
|
||||||
179 -> {180};
|
179 -> {180} [label="Postponed"];
|
||||||
180 -> {181};
|
180 -> {181};
|
||||||
181 -> {182};
|
181 -> {182};
|
||||||
182 -> {183};
|
182 -> {183};
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ digraph postponedLambdas_kt {
|
|||||||
14 -> {15};
|
14 -> {15};
|
||||||
15 -> {16};
|
15 -> {16};
|
||||||
17 -> {19};
|
17 -> {19};
|
||||||
18 -> {19};
|
18 -> {19} [label="Postponed"];
|
||||||
19 -> {20};
|
19 -> {20};
|
||||||
20 -> {21};
|
20 -> {21};
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -212,8 +212,8 @@ digraph propertiesAndInitBlocks_kt {
|
|||||||
48 -> {49} [style=dotted];
|
48 -> {49} [style=dotted];
|
||||||
49 -> {50} [style=dotted];
|
49 -> {50} [style=dotted];
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
|
||||||
52 -> {9} [color=green style=dashed];
|
52 -> {9} [color=green style=dashed];
|
||||||
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55} [color=green];
|
54 -> {55} [color=green];
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
|
|||||||
+3
-3
@@ -145,7 +145,7 @@ digraph returnValuesFromLambda_kt {
|
|||||||
38 -> {39};
|
38 -> {39};
|
||||||
39 -> {41};
|
39 -> {41};
|
||||||
40 -> {42};
|
40 -> {42};
|
||||||
41 -> {42};
|
41 -> {42} [label="Postponed"];
|
||||||
42 -> {43};
|
42 -> {43};
|
||||||
43 -> {44};
|
43 -> {44};
|
||||||
44 -> {45};
|
44 -> {45};
|
||||||
@@ -204,7 +204,7 @@ digraph returnValuesFromLambda_kt {
|
|||||||
57 -> {58} [style=dotted];
|
57 -> {58} [style=dotted];
|
||||||
58 -> {60};
|
58 -> {60};
|
||||||
59 -> {61};
|
59 -> {61};
|
||||||
60 -> {61};
|
60 -> {61} [label="Postponed"];
|
||||||
61 -> {62};
|
61 -> {62};
|
||||||
62 -> {63};
|
62 -> {63};
|
||||||
63 -> {64};
|
63 -> {64};
|
||||||
@@ -255,7 +255,7 @@ digraph returnValuesFromLambda_kt {
|
|||||||
73 -> {74} [style=dotted];
|
73 -> {74} [style=dotted];
|
||||||
74 -> {76} [style=dotted];
|
74 -> {76} [style=dotted];
|
||||||
75 -> {77} [style=dotted];
|
75 -> {77} [style=dotted];
|
||||||
76 -> {77} [style=dotted];
|
76 -> {77} [style=dotted label="Postponed"];
|
||||||
77 -> {78} [style=dotted];
|
77 -> {78} [style=dotted];
|
||||||
78 -> {79} [style=dotted];
|
78 -> {79} [style=dotted];
|
||||||
79 -> {80} [style=dotted];
|
79 -> {80} [style=dotted];
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ digraph classCallInLambda_kt {
|
|||||||
11 -> {12};
|
11 -> {12};
|
||||||
12 -> {14};
|
12 -> {14};
|
||||||
13 -> {15};
|
13 -> {15};
|
||||||
14 -> {15};
|
14 -> {15} [label="Postponed"];
|
||||||
15 -> {16};
|
15 -> {16};
|
||||||
16 -> {19};
|
16 -> {19};
|
||||||
16 -> {17} [style=dotted];
|
16 -> {17} [style=dotted];
|
||||||
|
|||||||
+1
-1
@@ -601,7 +601,7 @@ digraph returns_kt {
|
|||||||
205 -> {206};
|
205 -> {206};
|
||||||
206 -> {207};
|
206 -> {207};
|
||||||
208 -> {210};
|
208 -> {210};
|
||||||
209 -> {210};
|
209 -> {210} [label="Postponed"];
|
||||||
210 -> {211};
|
210 -> {211};
|
||||||
211 -> {212};
|
211 -> {212};
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -187,7 +187,7 @@ digraph incorrectSmartcastToNothing_kt {
|
|||||||
57 -> {58 60};
|
57 -> {58 60};
|
||||||
58 -> {59};
|
58 -> {59};
|
||||||
59 -> {61};
|
59 -> {61};
|
||||||
60 -> {61} [color=red];
|
60 -> {61} [color=red label="Postponed"];
|
||||||
61 -> {62};
|
61 -> {62};
|
||||||
62 -> {63};
|
62 -> {63};
|
||||||
63 -> {64};
|
63 -> {64};
|
||||||
|
|||||||
+53
-55
@@ -118,7 +118,7 @@ digraph inPlaceLambdas_kt {
|
|||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {33};
|
32 -> {33} [label="Postponed"];
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
@@ -155,13 +155,12 @@ digraph inPlaceLambdas_kt {
|
|||||||
color=blue
|
color=blue
|
||||||
52 [label="Function call arguments enter"];
|
52 [label="Function call arguments enter"];
|
||||||
53 [label="Access variable R|<local>/x|"];
|
53 [label="Access variable R|<local>/x|"];
|
||||||
54 [label="Smart cast: R|<local>/x|"];
|
54 [label="Function call arguments exit"];
|
||||||
55 [label="Function call arguments exit"];
|
|
||||||
}
|
}
|
||||||
56 [label="Function call: R|<local>/x|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
55 [label="Function call: R|<local>/x|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
57 [label="Exit block"];
|
56 [label="Exit block"];
|
||||||
}
|
}
|
||||||
58 [label="Exit function test_2" style="filled" fillcolor=red];
|
57 [label="Exit function test_2" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
39 -> {40};
|
39 -> {40};
|
||||||
40 -> {41};
|
40 -> {41};
|
||||||
@@ -176,96 +175,96 @@ digraph inPlaceLambdas_kt {
|
|||||||
47 -> {48};
|
47 -> {48};
|
||||||
48 -> {50};
|
48 -> {50};
|
||||||
49 -> {51};
|
49 -> {51};
|
||||||
50 -> {51};
|
50 -> {51} [label="Postponed"];
|
||||||
51 -> {52};
|
51 -> {52};
|
||||||
52 -> {53};
|
52 -> {53};
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
56 -> {57};
|
56 -> {57};
|
||||||
57 -> {58};
|
|
||||||
|
|
||||||
subgraph cluster_20 {
|
subgraph cluster_20 {
|
||||||
color=red
|
color=red
|
||||||
59 [label="Enter function test_3" style="filled" fillcolor=red];
|
58 [label="Enter function test_3" style="filled" fillcolor=red];
|
||||||
subgraph cluster_21 {
|
subgraph cluster_21 {
|
||||||
color=blue
|
color=blue
|
||||||
60 [label="Enter block"];
|
59 [label="Enter block"];
|
||||||
subgraph cluster_22 {
|
subgraph cluster_22 {
|
||||||
color=blue
|
color=blue
|
||||||
61 [label="Enter when"];
|
60 [label="Enter when"];
|
||||||
subgraph cluster_23 {
|
subgraph cluster_23 {
|
||||||
color=blue
|
color=blue
|
||||||
62 [label="Enter when branch condition "];
|
61 [label="Enter when branch condition "];
|
||||||
63 [label="Access variable R|<local>/x|"];
|
62 [label="Access variable R|<local>/x|"];
|
||||||
64 [label="Type operator: (R|<local>/x| is R|A|)"];
|
63 [label="Type operator: (R|<local>/x| is R|A|)"];
|
||||||
65 [label="Exit when branch condition"];
|
64 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
66 [label="Synthetic else branch"];
|
65 [label="Synthetic else branch"];
|
||||||
67 [label="Enter when branch result"];
|
66 [label="Enter when branch result"];
|
||||||
subgraph cluster_24 {
|
subgraph cluster_24 {
|
||||||
color=blue
|
color=blue
|
||||||
68 [label="Enter block"];
|
67 [label="Enter block"];
|
||||||
subgraph cluster_25 {
|
subgraph cluster_25 {
|
||||||
color=blue
|
color=blue
|
||||||
69 [label="Function call arguments enter"];
|
68 [label="Function call arguments enter"];
|
||||||
70 [label="Postponed enter to lambda"];
|
69 [label="Postponed enter to lambda"];
|
||||||
subgraph cluster_26 {
|
subgraph cluster_26 {
|
||||||
color=blue
|
color=blue
|
||||||
71 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
70 [label="Enter function <anonymous>" style="filled" fillcolor=red];
|
||||||
subgraph cluster_27 {
|
subgraph cluster_27 {
|
||||||
color=blue
|
color=blue
|
||||||
72 [label="Enter block"];
|
71 [label="Enter block"];
|
||||||
subgraph cluster_28 {
|
subgraph cluster_28 {
|
||||||
color=blue
|
color=blue
|
||||||
73 [label="Function call arguments enter"];
|
72 [label="Function call arguments enter"];
|
||||||
74 [label="Access variable R|<local>/x|"];
|
73 [label="Access variable R|<local>/x|"];
|
||||||
75 [label="Smart cast: R|<local>/x|"];
|
74 [label="Smart cast: R|<local>/x|"];
|
||||||
76 [label="Function call arguments exit"];
|
75 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
77 [label="Function call: R|<local>/x|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
76 [label="Function call: R|<local>/x|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
||||||
78 [label="Access variable R|<local>/x|"];
|
77 [label="Access variable R|<local>/x|"];
|
||||||
79 [label="Smart cast: R|<local>/x|"];
|
78 [label="Smart cast: R|<local>/x|"];
|
||||||
80 [label="Type operator: (R|<local>/x| as R|B|)"];
|
79 [label="Type operator: (R|<local>/x| as R|B|)"];
|
||||||
81 [label="Exit block"];
|
80 [label="Exit block"];
|
||||||
}
|
}
|
||||||
82 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
81 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
83 [label="Function call arguments exit"];
|
82 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
84 [label="Postponed exit from lambda"];
|
83 [label="Postponed exit from lambda"];
|
||||||
85 [label="Function call: R|kotlin/run|<R|B|>(...)" style="filled" fillcolor=yellow];
|
84 [label="Function call: R|kotlin/run|<R|B|>(...)" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_29 {
|
subgraph cluster_29 {
|
||||||
color=blue
|
color=blue
|
||||||
86 [label="Function call arguments enter"];
|
85 [label="Function call arguments enter"];
|
||||||
87 [label="Access variable R|<local>/x|"];
|
86 [label="Access variable R|<local>/x|"];
|
||||||
88 [label="Smart cast: R|<local>/x|"];
|
87 [label="Smart cast: R|<local>/x|"];
|
||||||
89 [label="Function call arguments exit"];
|
88 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
90 [label="Function call: R|<local>/x|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
89 [label="Function call: R|<local>/x|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
91 [label="Exit block"];
|
90 [label="Exit block"];
|
||||||
}
|
}
|
||||||
92 [label="Exit when branch result"];
|
91 [label="Exit when branch result"];
|
||||||
93 [label="Exit when"];
|
92 [label="Exit when"];
|
||||||
}
|
}
|
||||||
94 [label="Exit block"];
|
93 [label="Exit block"];
|
||||||
}
|
}
|
||||||
95 [label="Exit function test_3" style="filled" fillcolor=red];
|
94 [label="Exit function test_3" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
58 -> {59};
|
||||||
59 -> {60};
|
59 -> {60};
|
||||||
60 -> {61};
|
60 -> {61};
|
||||||
61 -> {62};
|
61 -> {62};
|
||||||
62 -> {63};
|
62 -> {63};
|
||||||
63 -> {64};
|
63 -> {64};
|
||||||
64 -> {65};
|
64 -> {65 66};
|
||||||
65 -> {66 67};
|
65 -> {92};
|
||||||
66 -> {93};
|
66 -> {67};
|
||||||
67 -> {68};
|
67 -> {68};
|
||||||
68 -> {69};
|
68 -> {69};
|
||||||
69 -> {70};
|
69 -> {70 82};
|
||||||
70 -> {71 83};
|
69 -> {83} [style=dotted];
|
||||||
70 -> {84} [style=dotted];
|
69 -> {70} [style=dashed];
|
||||||
70 -> {71} [style=dashed];
|
70 -> {71};
|
||||||
71 -> {72};
|
71 -> {72};
|
||||||
72 -> {73};
|
72 -> {73};
|
||||||
73 -> {74};
|
73 -> {74};
|
||||||
@@ -276,9 +275,9 @@ digraph inPlaceLambdas_kt {
|
|||||||
78 -> {79};
|
78 -> {79};
|
||||||
79 -> {80};
|
79 -> {80};
|
||||||
80 -> {81};
|
80 -> {81};
|
||||||
81 -> {82};
|
81 -> {83};
|
||||||
82 -> {84};
|
82 -> {84};
|
||||||
83 -> {85};
|
83 -> {84} [label="Postponed"];
|
||||||
84 -> {85};
|
84 -> {85};
|
||||||
85 -> {86};
|
85 -> {86};
|
||||||
86 -> {87};
|
86 -> {87};
|
||||||
@@ -289,6 +288,5 @@ digraph inPlaceLambdas_kt {
|
|||||||
91 -> {92};
|
91 -> {92};
|
||||||
92 -> {93};
|
92 -> {93};
|
||||||
93 -> {94};
|
93 -> {94};
|
||||||
94 -> {95};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -23,7 +23,7 @@ FILE: inPlaceLambdas.kt
|
|||||||
^ (R|<local>/x| as R|B|)
|
^ (R|<local>/x| as R|B|)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.R|/B.bar|()
|
R|<local>/x|.<Unresolved name: bar>#()
|
||||||
}
|
}
|
||||||
public final fun test_3(x: R|kotlin/Any?|): R|kotlin/Unit| {
|
public final fun test_3(x: R|kotlin/Any?|): R|kotlin/Unit| {
|
||||||
when () {
|
when () {
|
||||||
@@ -33,7 +33,7 @@ FILE: inPlaceLambdas.kt
|
|||||||
^ (R|<local>/x| as R|B|)
|
^ (R|<local>/x| as R|B|)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
R|<local>/x|.R|/B.bar|()
|
R|<local>/x|.<Unresolved name: bar>#()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -19,7 +19,7 @@ fun test_2(x: Any?) {
|
|||||||
run {
|
run {
|
||||||
x as B
|
x as B
|
||||||
}
|
}
|
||||||
x.bar()
|
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test_3(x: Any?) {
|
fun test_3(x: Any?) {
|
||||||
@@ -28,6 +28,6 @@ fun test_3(x: Any?) {
|
|||||||
x.foo()
|
x.foo()
|
||||||
x as B
|
x as B
|
||||||
}
|
}
|
||||||
x.bar()
|
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -245,7 +245,7 @@ digraph lambdaInWhenBranch_kt {
|
|||||||
57 -> {59};
|
57 -> {59};
|
||||||
58 -> {60};
|
58 -> {60};
|
||||||
59 -> {60} [color=green];
|
59 -> {60} [color=green];
|
||||||
59 -> {63} [color=red];
|
59 -> {63} [color=red label="Postponed"];
|
||||||
60 -> {61};
|
60 -> {61};
|
||||||
61 -> {62};
|
61 -> {62};
|
||||||
62 -> {63};
|
62 -> {63};
|
||||||
|
|||||||
+182
-184
@@ -401,49 +401,48 @@ digraph implicitReceivers_kt {
|
|||||||
color=blue
|
color=blue
|
||||||
140 [label="Function call arguments enter"];
|
140 [label="Function call arguments enter"];
|
||||||
141 [label="Access variable this@R|special/anonymous|"];
|
141 [label="Access variable this@R|special/anonymous|"];
|
||||||
142 [label="Smart cast: this@R|special/anonymous|"];
|
142 [label="Function call arguments exit"];
|
||||||
143 [label="Function call arguments exit"];
|
|
||||||
}
|
}
|
||||||
144 [label="Function call: this@R|special/anonymous|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
143 [label="Function call: this@R|special/anonymous|.<Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_51 {
|
subgraph cluster_51 {
|
||||||
color=blue
|
color=blue
|
||||||
145 [label="Function call arguments enter"];
|
144 [label="Function call arguments enter"];
|
||||||
146 [label="Function call arguments exit"];
|
145 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
147 [label="Function call: this@R|special/anonymous|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
146 [label="Function call: <Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
148 [label="Exit block"];
|
147 [label="Exit block"];
|
||||||
}
|
}
|
||||||
149 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
148 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
150 [label="Function call arguments exit"];
|
149 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
151 [label="Postponed exit from lambda"];
|
150 [label="Postponed exit from lambda"];
|
||||||
152 [label="Function call: R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(...)" style="filled" fillcolor=yellow];
|
151 [label="Function call: R|kotlin/with<Inapplicable(INAPPLICABLE): kotlin/with>#|<R|kotlin/Any|, <ERROR TYPE REF: Cannot infer argument for type parameter R>>(...)" style="filled" fillcolor=yellow];
|
||||||
153 [label="Exit block"];
|
152 [label="Exit block"];
|
||||||
}
|
}
|
||||||
154 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
153 [label="Exit function <anonymous>" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
155 [label="Function call arguments exit"];
|
154 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
156 [label="Postponed exit from lambda"];
|
155 [label="Postponed exit from lambda"];
|
||||||
157 [label="Function call: R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(...)" style="filled" fillcolor=yellow];
|
156 [label="Function call: R|kotlin/with<CS errors: kotlin/with>#|<R|kotlin/Any|, <ERROR TYPE REF: Cannot infer argument for type parameter R>>(...)" style="filled" fillcolor=yellow];
|
||||||
158 [label="Exit block"];
|
157 [label="Exit block"];
|
||||||
}
|
}
|
||||||
159 [label="Exit function test_3" style="filled" fillcolor=red];
|
158 [label="Exit function test_3" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
108 -> {109};
|
108 -> {109};
|
||||||
109 -> {110};
|
109 -> {110};
|
||||||
110 -> {111};
|
110 -> {111};
|
||||||
111 -> {112};
|
111 -> {112};
|
||||||
112 -> {113 155};
|
112 -> {113 154};
|
||||||
112 -> {156} [style=dotted];
|
112 -> {155} [style=dotted];
|
||||||
112 -> {113} [style=dashed];
|
112 -> {113} [style=dashed];
|
||||||
113 -> {114};
|
113 -> {114};
|
||||||
114 -> {115};
|
114 -> {115};
|
||||||
115 -> {116};
|
115 -> {116};
|
||||||
116 -> {117};
|
116 -> {117};
|
||||||
117 -> {118 150};
|
117 -> {118 149};
|
||||||
117 -> {151} [style=dotted];
|
117 -> {150} [style=dotted];
|
||||||
117 -> {118} [style=dashed];
|
117 -> {118} [style=dashed];
|
||||||
118 -> {119};
|
118 -> {119};
|
||||||
119 -> {120};
|
119 -> {120};
|
||||||
@@ -467,7 +466,7 @@ digraph implicitReceivers_kt {
|
|||||||
135 -> {136};
|
135 -> {136};
|
||||||
136 -> {138};
|
136 -> {138};
|
||||||
137 -> {139};
|
137 -> {139};
|
||||||
138 -> {139};
|
138 -> {139} [label="Postponed"];
|
||||||
139 -> {140};
|
139 -> {140};
|
||||||
140 -> {141};
|
140 -> {141};
|
||||||
141 -> {142};
|
141 -> {142};
|
||||||
@@ -477,195 +476,195 @@ digraph implicitReceivers_kt {
|
|||||||
145 -> {146};
|
145 -> {146};
|
||||||
146 -> {147};
|
146 -> {147};
|
||||||
147 -> {148};
|
147 -> {148};
|
||||||
148 -> {149};
|
148 -> {150};
|
||||||
149 -> {151};
|
149 -> {151};
|
||||||
150 -> {152};
|
150 -> {151} [color=green];
|
||||||
151 -> {152} [color=green];
|
150 -> {156} [color=red label="Postponed"];
|
||||||
151 -> {157} [color=red];
|
151 -> {152};
|
||||||
152 -> {153};
|
152 -> {153};
|
||||||
153 -> {154};
|
153 -> {155};
|
||||||
154 -> {156};
|
154 -> {156};
|
||||||
155 -> {157};
|
155 -> {156} [label="Postponed"];
|
||||||
156 -> {157};
|
156 -> {157};
|
||||||
157 -> {158};
|
157 -> {158};
|
||||||
158 -> {159};
|
|
||||||
|
|
||||||
subgraph cluster_52 {
|
subgraph cluster_52 {
|
||||||
color=red
|
color=red
|
||||||
160 [label="Enter function test_4" style="filled" fillcolor=red];
|
159 [label="Enter function test_4" style="filled" fillcolor=red];
|
||||||
subgraph cluster_53 {
|
subgraph cluster_53 {
|
||||||
color=blue
|
color=blue
|
||||||
161 [label="Enter block"];
|
160 [label="Enter block"];
|
||||||
subgraph cluster_54 {
|
subgraph cluster_54 {
|
||||||
color=blue
|
color=blue
|
||||||
162 [label="Enter when"];
|
161 [label="Enter when"];
|
||||||
subgraph cluster_55 {
|
subgraph cluster_55 {
|
||||||
color=blue
|
color=blue
|
||||||
163 [label="Enter when branch condition "];
|
162 [label="Enter when branch condition "];
|
||||||
164 [label="Access variable this@R|/test_4|"];
|
163 [label="Access variable this@R|/test_4|"];
|
||||||
165 [label="Type operator: (this@R|/test_4| !is R|A|)"];
|
164 [label="Type operator: (this@R|/test_4| !is R|A|)"];
|
||||||
166 [label="Exit when branch condition"];
|
165 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
subgraph cluster_56 {
|
subgraph cluster_56 {
|
||||||
color=blue
|
color=blue
|
||||||
167 [label="Enter when branch condition "];
|
166 [label="Enter when branch condition "];
|
||||||
168 [label="Access variable this@R|/test_4|"];
|
167 [label="Access variable this@R|/test_4|"];
|
||||||
169 [label="Smart cast: this@R|/test_4|"];
|
168 [label="Smart cast: this@R|/test_4|"];
|
||||||
170 [label="Type operator: (this@R|/test_4| !is R|B|)"];
|
169 [label="Type operator: (this@R|/test_4| !is R|B|)"];
|
||||||
171 [label="Exit when branch condition"];
|
170 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
subgraph cluster_57 {
|
subgraph cluster_57 {
|
||||||
color=blue
|
color=blue
|
||||||
172 [label="Enter when branch condition else"];
|
171 [label="Enter when branch condition else"];
|
||||||
173 [label="Exit when branch condition"];
|
172 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
174 [label="Enter when branch result"];
|
173 [label="Enter when branch result"];
|
||||||
subgraph cluster_58 {
|
subgraph cluster_58 {
|
||||||
color=blue
|
color=blue
|
||||||
175 [label="Enter block"];
|
174 [label="Enter block"];
|
||||||
subgraph cluster_59 {
|
subgraph cluster_59 {
|
||||||
color=blue
|
color=blue
|
||||||
176 [label="Function call arguments enter"];
|
175 [label="Function call arguments enter"];
|
||||||
177 [label="Access variable this@R|/test_4|"];
|
176 [label="Access variable this@R|/test_4|"];
|
||||||
178 [label="Smart cast: this@R|/test_4|"];
|
177 [label="Smart cast: this@R|/test_4|"];
|
||||||
179 [label="Function call arguments exit"];
|
178 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
180 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
179 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_60 {
|
subgraph cluster_60 {
|
||||||
color=blue
|
color=blue
|
||||||
181 [label="Function call arguments enter"];
|
180 [label="Function call arguments enter"];
|
||||||
182 [label="Function call arguments exit"];
|
181 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
183 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
182 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_61 {
|
subgraph cluster_61 {
|
||||||
color=blue
|
color=blue
|
||||||
184 [label="Function call arguments enter"];
|
183 [label="Function call arguments enter"];
|
||||||
185 [label="Access variable this@R|/test_4|"];
|
184 [label="Access variable this@R|/test_4|"];
|
||||||
186 [label="Smart cast: this@R|/test_4|"];
|
185 [label="Smart cast: this@R|/test_4|"];
|
||||||
187 [label="Function call arguments exit"];
|
186 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
188 [label="Function call: this@R|/test_4|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
187 [label="Function call: this@R|/test_4|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_62 {
|
subgraph cluster_62 {
|
||||||
color=blue
|
color=blue
|
||||||
189 [label="Function call arguments enter"];
|
188 [label="Function call arguments enter"];
|
||||||
190 [label="Function call arguments exit"];
|
189 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
191 [label="Function call: this@R|/test_4|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
190 [label="Function call: this@R|/test_4|.R|/B.bar|()" style="filled" fillcolor=yellow];
|
||||||
192 [label="Exit block"];
|
191 [label="Exit block"];
|
||||||
}
|
}
|
||||||
193 [label="Exit when branch result"];
|
192 [label="Exit when branch result"];
|
||||||
194 [label="Enter when branch result"];
|
193 [label="Enter when branch result"];
|
||||||
subgraph cluster_63 {
|
subgraph cluster_63 {
|
||||||
color=blue
|
color=blue
|
||||||
195 [label="Enter block"];
|
194 [label="Enter block"];
|
||||||
subgraph cluster_64 {
|
subgraph cluster_64 {
|
||||||
color=blue
|
color=blue
|
||||||
196 [label="Function call arguments enter"];
|
195 [label="Function call arguments enter"];
|
||||||
197 [label="Access variable this@R|/test_4|"];
|
196 [label="Access variable this@R|/test_4|"];
|
||||||
198 [label="Smart cast: this@R|/test_4|"];
|
197 [label="Smart cast: this@R|/test_4|"];
|
||||||
199 [label="Function call arguments exit"];
|
198 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
200 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
199 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_65 {
|
subgraph cluster_65 {
|
||||||
color=blue
|
color=blue
|
||||||
201 [label="Function call arguments enter"];
|
200 [label="Function call arguments enter"];
|
||||||
202 [label="Function call arguments exit"];
|
201 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
203 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
202 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_66 {
|
subgraph cluster_66 {
|
||||||
color=blue
|
color=blue
|
||||||
204 [label="Function call arguments enter"];
|
203 [label="Function call arguments enter"];
|
||||||
205 [label="Access variable this@R|/test_4|"];
|
204 [label="Access variable this@R|/test_4|"];
|
||||||
206 [label="Smart cast: this@R|/test_4|"];
|
205 [label="Smart cast: this@R|/test_4|"];
|
||||||
207 [label="Function call arguments exit"];
|
206 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
208 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
207 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_67 {
|
subgraph cluster_67 {
|
||||||
color=blue
|
color=blue
|
||||||
209 [label="Function call arguments enter"];
|
208 [label="Function call arguments enter"];
|
||||||
210 [label="Function call arguments exit"];
|
209 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
211 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
210 [label="Function call: this@R|/test_4|.R|/A.foo|()" style="filled" fillcolor=yellow];
|
||||||
212 [label="Exit block"];
|
211 [label="Exit block"];
|
||||||
}
|
}
|
||||||
213 [label="Exit when branch result"];
|
212 [label="Exit when branch result"];
|
||||||
214 [label="Enter when branch result"];
|
213 [label="Enter when branch result"];
|
||||||
subgraph cluster_68 {
|
subgraph cluster_68 {
|
||||||
color=blue
|
color=blue
|
||||||
215 [label="Enter block"];
|
214 [label="Enter block"];
|
||||||
subgraph cluster_69 {
|
subgraph cluster_69 {
|
||||||
color=blue
|
color=blue
|
||||||
216 [label="Function call arguments enter"];
|
215 [label="Function call arguments enter"];
|
||||||
217 [label="Access variable this@R|/test_4|"];
|
216 [label="Access variable this@R|/test_4|"];
|
||||||
218 [label="Function call arguments exit"];
|
217 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
219 [label="Function call: this@R|/test_4|.<Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
218 [label="Function call: this@R|/test_4|.<Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_70 {
|
subgraph cluster_70 {
|
||||||
color=blue
|
color=blue
|
||||||
220 [label="Function call arguments enter"];
|
219 [label="Function call arguments enter"];
|
||||||
221 [label="Function call arguments exit"];
|
220 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
222 [label="Function call: <Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
221 [label="Function call: <Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_71 {
|
subgraph cluster_71 {
|
||||||
color=blue
|
color=blue
|
||||||
223 [label="Function call arguments enter"];
|
222 [label="Function call arguments enter"];
|
||||||
224 [label="Access variable this@R|/test_4|"];
|
223 [label="Access variable this@R|/test_4|"];
|
||||||
225 [label="Function call arguments exit"];
|
224 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
226 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
225 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_72 {
|
subgraph cluster_72 {
|
||||||
color=blue
|
color=blue
|
||||||
227 [label="Function call arguments enter"];
|
226 [label="Function call arguments enter"];
|
||||||
228 [label="Function call arguments exit"];
|
227 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
229 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
228 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
230 [label="Exit block"];
|
229 [label="Exit block"];
|
||||||
}
|
}
|
||||||
231 [label="Exit when branch result"];
|
230 [label="Exit when branch result"];
|
||||||
232 [label="Exit when"];
|
231 [label="Exit when"];
|
||||||
}
|
}
|
||||||
subgraph cluster_73 {
|
subgraph cluster_73 {
|
||||||
color=blue
|
color=blue
|
||||||
233 [label="Function call arguments enter"];
|
232 [label="Function call arguments enter"];
|
||||||
234 [label="Access variable this@R|/test_4|"];
|
233 [label="Access variable this@R|/test_4|"];
|
||||||
235 [label="Function call arguments exit"];
|
234 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
236 [label="Function call: this@R|/test_4|.<Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
235 [label="Function call: this@R|/test_4|.<Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_74 {
|
subgraph cluster_74 {
|
||||||
color=blue
|
color=blue
|
||||||
237 [label="Function call arguments enter"];
|
236 [label="Function call arguments enter"];
|
||||||
238 [label="Function call arguments exit"];
|
237 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
239 [label="Function call: <Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
238 [label="Function call: <Unresolved name: foo>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_75 {
|
subgraph cluster_75 {
|
||||||
color=blue
|
color=blue
|
||||||
240 [label="Function call arguments enter"];
|
239 [label="Function call arguments enter"];
|
||||||
241 [label="Access variable this@R|/test_4|"];
|
240 [label="Access variable this@R|/test_4|"];
|
||||||
242 [label="Function call arguments exit"];
|
241 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
243 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
242 [label="Function call: this@R|/test_4|.<Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
subgraph cluster_76 {
|
subgraph cluster_76 {
|
||||||
color=blue
|
color=blue
|
||||||
244 [label="Function call arguments enter"];
|
243 [label="Function call arguments enter"];
|
||||||
245 [label="Function call arguments exit"];
|
244 [label="Function call arguments exit"];
|
||||||
}
|
}
|
||||||
246 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
245 [label="Function call: <Unresolved name: bar>#()" style="filled" fillcolor=yellow];
|
||||||
247 [label="Exit block"];
|
246 [label="Exit block"];
|
||||||
}
|
}
|
||||||
248 [label="Exit function test_4" style="filled" fillcolor=red];
|
247 [label="Exit function test_4" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
159 -> {160};
|
||||||
160 -> {161};
|
160 -> {161};
|
||||||
161 -> {162};
|
161 -> {162};
|
||||||
162 -> {163};
|
162 -> {163};
|
||||||
163 -> {164};
|
163 -> {164};
|
||||||
164 -> {165};
|
164 -> {165};
|
||||||
165 -> {166};
|
165 -> {166 213};
|
||||||
166 -> {167 214};
|
166 -> {167};
|
||||||
167 -> {168};
|
167 -> {168};
|
||||||
168 -> {169};
|
168 -> {169};
|
||||||
169 -> {170};
|
169 -> {170};
|
||||||
170 -> {171};
|
170 -> {171 193};
|
||||||
171 -> {172 194};
|
171 -> {172};
|
||||||
172 -> {173};
|
172 -> {173};
|
||||||
173 -> {174};
|
173 -> {174};
|
||||||
174 -> {175};
|
174 -> {175};
|
||||||
@@ -686,8 +685,8 @@ digraph implicitReceivers_kt {
|
|||||||
189 -> {190};
|
189 -> {190};
|
||||||
190 -> {191};
|
190 -> {191};
|
||||||
191 -> {192};
|
191 -> {192};
|
||||||
192 -> {193};
|
192 -> {231};
|
||||||
193 -> {232};
|
193 -> {194};
|
||||||
194 -> {195};
|
194 -> {195};
|
||||||
195 -> {196};
|
195 -> {196};
|
||||||
196 -> {197};
|
196 -> {197};
|
||||||
@@ -706,8 +705,8 @@ digraph implicitReceivers_kt {
|
|||||||
209 -> {210};
|
209 -> {210};
|
||||||
210 -> {211};
|
210 -> {211};
|
||||||
211 -> {212};
|
211 -> {212};
|
||||||
212 -> {213};
|
212 -> {231};
|
||||||
213 -> {232};
|
213 -> {214};
|
||||||
214 -> {215};
|
214 -> {215};
|
||||||
215 -> {216};
|
215 -> {216};
|
||||||
216 -> {217};
|
216 -> {217};
|
||||||
@@ -741,63 +740,62 @@ digraph implicitReceivers_kt {
|
|||||||
244 -> {245};
|
244 -> {245};
|
||||||
245 -> {246};
|
245 -> {246};
|
||||||
246 -> {247};
|
246 -> {247};
|
||||||
247 -> {248};
|
|
||||||
|
|
||||||
subgraph cluster_77 {
|
subgraph cluster_77 {
|
||||||
color=red
|
color=red
|
||||||
249 [label="Enter function test_5" style="filled" fillcolor=red];
|
248 [label="Enter function test_5" style="filled" fillcolor=red];
|
||||||
subgraph cluster_78 {
|
subgraph cluster_78 {
|
||||||
color=blue
|
color=blue
|
||||||
250 [label="Enter block"];
|
249 [label="Enter block"];
|
||||||
subgraph cluster_79 {
|
subgraph cluster_79 {
|
||||||
color=blue
|
color=blue
|
||||||
251 [label="Enter when"];
|
250 [label="Enter when"];
|
||||||
subgraph cluster_80 {
|
subgraph cluster_80 {
|
||||||
color=blue
|
color=blue
|
||||||
252 [label="Enter when branch condition "];
|
251 [label="Enter when branch condition "];
|
||||||
253 [label="Access variable this@R|/test_5|"];
|
252 [label="Access variable this@R|/test_5|"];
|
||||||
254 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"];
|
253 [label="Type operator: (this@R|/test_5| is R|kotlin/collections/List<*>|)"];
|
||||||
255 [label="Exit when branch condition"];
|
254 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
subgraph cluster_81 {
|
subgraph cluster_81 {
|
||||||
color=blue
|
color=blue
|
||||||
256 [label="Enter when branch condition "];
|
255 [label="Enter when branch condition "];
|
||||||
257 [label="Access variable this@R|/test_5|"];
|
256 [label="Access variable this@R|/test_5|"];
|
||||||
258 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"];
|
257 [label="Type operator: (this@R|/test_5| is R|kotlin/String|)"];
|
||||||
259 [label="Exit when branch condition"];
|
258 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
subgraph cluster_82 {
|
subgraph cluster_82 {
|
||||||
color=blue
|
color=blue
|
||||||
260 [label="Enter when branch condition else"];
|
259 [label="Enter when branch condition else"];
|
||||||
261 [label="Exit when branch condition"];
|
260 [label="Exit when branch condition"];
|
||||||
}
|
}
|
||||||
262 [label="Enter when branch result"];
|
261 [label="Enter when branch result"];
|
||||||
subgraph cluster_83 {
|
subgraph cluster_83 {
|
||||||
color=blue
|
color=blue
|
||||||
263 [label="Enter block"];
|
262 [label="Enter block"];
|
||||||
264 [label="Const: Int(0)"];
|
263 [label="Const: Int(0)"];
|
||||||
265 [label="Exit block"];
|
264 [label="Exit block"];
|
||||||
}
|
}
|
||||||
266 [label="Exit when branch result"];
|
265 [label="Exit when branch result"];
|
||||||
267 [label="Enter when branch result"];
|
266 [label="Enter when branch result"];
|
||||||
subgraph cluster_84 {
|
subgraph cluster_84 {
|
||||||
color=blue
|
color=blue
|
||||||
268 [label="Enter block"];
|
267 [label="Enter block"];
|
||||||
269 [label="Access variable R|kotlin/String.length|"];
|
268 [label="Access variable R|kotlin/String.length|"];
|
||||||
270 [label="Exit block"];
|
269 [label="Exit block"];
|
||||||
}
|
}
|
||||||
271 [label="Exit when branch result"];
|
270 [label="Exit when branch result"];
|
||||||
272 [label="Enter when branch result"];
|
271 [label="Enter when branch result"];
|
||||||
subgraph cluster_85 {
|
subgraph cluster_85 {
|
||||||
color=blue
|
color=blue
|
||||||
273 [label="Enter block"];
|
272 [label="Enter block"];
|
||||||
274 [label="Access variable R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|"];
|
273 [label="Access variable R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|"];
|
||||||
275 [label="Exit block"];
|
274 [label="Exit block"];
|
||||||
}
|
}
|
||||||
276 [label="Exit when branch result"];
|
275 [label="Exit when branch result"];
|
||||||
277 [label="Exit when"];
|
276 [label="Exit when"];
|
||||||
}
|
}
|
||||||
278 [label="Jump: ^test_5 when () {
|
277 [label="Jump: ^test_5 when () {
|
||||||
(this@R|/test_5| is R|kotlin/collections/List<*>|) -> {
|
(this@R|/test_5| is R|kotlin/collections/List<*>|) -> {
|
||||||
this@R|/test_5|.R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|
|
this@R|/test_5|.R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|
|
||||||
}
|
}
|
||||||
@@ -809,62 +807,63 @@ digraph implicitReceivers_kt {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"];
|
"];
|
||||||
279 [label="Stub" style="filled" fillcolor=gray];
|
278 [label="Stub" style="filled" fillcolor=gray];
|
||||||
280 [label="Exit block" style="filled" fillcolor=gray];
|
279 [label="Exit block" style="filled" fillcolor=gray];
|
||||||
}
|
}
|
||||||
281 [label="Exit function test_5" style="filled" fillcolor=red];
|
280 [label="Exit function test_5" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
248 -> {249};
|
||||||
249 -> {250};
|
249 -> {250};
|
||||||
250 -> {251};
|
250 -> {251};
|
||||||
251 -> {252};
|
251 -> {252};
|
||||||
252 -> {253};
|
252 -> {253};
|
||||||
253 -> {254};
|
253 -> {254};
|
||||||
254 -> {255};
|
254 -> {255 271};
|
||||||
255 -> {256 272};
|
255 -> {256};
|
||||||
256 -> {257};
|
256 -> {257};
|
||||||
257 -> {258};
|
257 -> {258};
|
||||||
258 -> {259};
|
258 -> {259 266};
|
||||||
259 -> {260 267};
|
259 -> {260};
|
||||||
260 -> {261};
|
260 -> {261};
|
||||||
261 -> {262};
|
261 -> {262};
|
||||||
262 -> {263};
|
262 -> {263};
|
||||||
263 -> {264};
|
263 -> {264};
|
||||||
264 -> {265};
|
264 -> {265};
|
||||||
265 -> {266};
|
265 -> {276};
|
||||||
266 -> {277};
|
266 -> {267};
|
||||||
267 -> {268};
|
267 -> {268};
|
||||||
268 -> {269};
|
268 -> {269};
|
||||||
269 -> {270};
|
269 -> {270};
|
||||||
270 -> {271};
|
270 -> {276};
|
||||||
271 -> {277};
|
271 -> {272};
|
||||||
272 -> {273};
|
272 -> {273};
|
||||||
273 -> {274};
|
273 -> {274};
|
||||||
274 -> {275};
|
274 -> {275};
|
||||||
275 -> {276};
|
275 -> {276};
|
||||||
276 -> {277};
|
276 -> {277};
|
||||||
277 -> {278};
|
277 -> {280};
|
||||||
278 -> {281};
|
277 -> {278} [style=dotted];
|
||||||
278 -> {279} [style=dotted];
|
278 -> {279} [style=dotted];
|
||||||
279 -> {280} [style=dotted];
|
279 -> {280} [style=dotted];
|
||||||
280 -> {281} [style=dotted];
|
|
||||||
|
|
||||||
subgraph cluster_86 {
|
subgraph cluster_86 {
|
||||||
color=red
|
color=red
|
||||||
282 [label="Enter function test_6" style="filled" fillcolor=red];
|
281 [label="Enter function test_6" style="filled" fillcolor=red];
|
||||||
subgraph cluster_87 {
|
subgraph cluster_87 {
|
||||||
color=blue
|
color=blue
|
||||||
283 [label="Enter block"];
|
282 [label="Enter block"];
|
||||||
284 [label="Access variable this@R|/test_6|"];
|
283 [label="Access variable this@R|/test_6|"];
|
||||||
285 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"];
|
284 [label="Type operator: (this@R|/test_6| as R|kotlin/collections/List<*>|)"];
|
||||||
286 [label="Access variable R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|"];
|
285 [label="Access variable R|SubstitutionOverride<kotlin/collections/List.size: R|kotlin/Int|>|"];
|
||||||
287 [label="Access variable this@R|/test_6|"];
|
286 [label="Access variable this@R|/test_6|"];
|
||||||
288 [label="Smart cast: this@R|/test_6|"];
|
287 [label="Smart cast: this@R|/test_6|"];
|
||||||
289 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"];
|
288 [label="Type operator: (this@R|/test_6| as R|kotlin/String|)"];
|
||||||
290 [label="Access variable R|kotlin/String.length|"];
|
289 [label="Access variable R|kotlin/String.length|"];
|
||||||
291 [label="Exit block"];
|
290 [label="Exit block"];
|
||||||
}
|
}
|
||||||
292 [label="Exit function test_6" style="filled" fillcolor=red];
|
291 [label="Exit function test_6" style="filled" fillcolor=red];
|
||||||
}
|
}
|
||||||
|
281 -> {282};
|
||||||
282 -> {283};
|
282 -> {283};
|
||||||
283 -> {284};
|
283 -> {284};
|
||||||
284 -> {285};
|
284 -> {285};
|
||||||
@@ -874,6 +873,5 @@ digraph implicitReceivers_kt {
|
|||||||
288 -> {289};
|
288 -> {289};
|
||||||
289 -> {290};
|
289 -> {290};
|
||||||
290 -> {291};
|
290 -> {291};
|
||||||
291 -> {292};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
-4
@@ -50,16 +50,16 @@ FILE: implicitReceivers.kt
|
|||||||
<Unresolved name: foo>#()
|
<Unresolved name: foo>#()
|
||||||
}
|
}
|
||||||
public final fun test_3(a: R|kotlin/Any|, b: R|kotlin/Any|, c: R|kotlin/Any|): R|kotlin/Unit| {
|
public final fun test_3(a: R|kotlin/Any|, b: R|kotlin/Any|, c: R|kotlin/Any|): R|kotlin/Unit| {
|
||||||
R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(R|<local>/a|, <L> = wa@fun R|kotlin/Any|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
|
R|kotlin/with<CS errors: kotlin/with>#|<R|kotlin/Any|, <ERROR TYPE REF: Cannot infer argument for type parameter R>>(R|<local>/a|, <L> = wa@fun R|kotlin/Any|.<anonymous>(): <ERROR TYPE REF: Cannot infer argument for type parameter R> <inline=Inline, kind=EXACTLY_ONCE> {
|
||||||
R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(R|<local>/b|, <L> = wb@fun R|kotlin/Any|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
|
^ R|kotlin/with<Inapplicable(INAPPLICABLE): kotlin/with>#|<R|kotlin/Any|, <ERROR TYPE REF: Cannot infer argument for type parameter R>>(R|<local>/b|, <L> = wb@fun R|kotlin/Any|.<anonymous>(): <ERROR TYPE REF: Cannot infer argument for type parameter R> <inline=Inline, kind=EXACTLY_ONCE> {
|
||||||
R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(R|<local>/c|, <L> = wc@fun R|kotlin/Any|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
|
R|kotlin/with|<R|kotlin/Any|, R|kotlin/Unit|>(R|<local>/c|, <L> = wc@fun R|kotlin/Any|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=EXACTLY_ONCE> {
|
||||||
(this@R|special/anonymous| as R|A|)
|
(this@R|special/anonymous| as R|A|)
|
||||||
this@R|special/anonymous|.R|/A.foo|()
|
this@R|special/anonymous|.R|/A.foo|()
|
||||||
this@R|special/anonymous|.R|/A.foo|()
|
this@R|special/anonymous|.R|/A.foo|()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
this@R|special/anonymous|.R|/A.foo|()
|
this@R|special/anonymous|.<Unresolved name: foo>#()
|
||||||
this@R|special/anonymous|.R|/A.foo|()
|
^ <Unresolved name: foo>#()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -34,15 +34,15 @@ fun Any?.test_2() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test_3(a: Any, b: Any, c: Any) {
|
fun test_3(a: Any, b: Any, c: Any) {
|
||||||
with(a) wa@{
|
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>with<!>(a) wa@{
|
||||||
with(b) wb@{
|
with(b) wb@{
|
||||||
with(c) wc@{
|
with(c) wc@{
|
||||||
this@wb as A
|
this@wb as A
|
||||||
this@wb.foo()
|
this@wb.foo()
|
||||||
foo()
|
foo()
|
||||||
}
|
}
|
||||||
this.foo()
|
this.<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||||
foo()
|
<!UNRESOLVED_REFERENCE!>foo<!>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -256,7 +256,7 @@ digraph safeCalls_kt {
|
|||||||
79 -> {80};
|
79 -> {80};
|
||||||
80 -> {81};
|
80 -> {81};
|
||||||
82 -> {84};
|
82 -> {84};
|
||||||
83 -> {84};
|
83 -> {84} [label="Postponed"];
|
||||||
84 -> {87};
|
84 -> {87};
|
||||||
85 -> {86};
|
85 -> {86};
|
||||||
86 -> {87};
|
86 -> {87};
|
||||||
@@ -407,7 +407,7 @@ digraph safeCalls_kt {
|
|||||||
127 -> {128} [style=dotted];
|
127 -> {128} [style=dotted];
|
||||||
128 -> {130} [style=dotted];
|
128 -> {130} [style=dotted];
|
||||||
129 -> {131} [style=dotted];
|
129 -> {131} [style=dotted];
|
||||||
130 -> {131} [style=dotted];
|
130 -> {131} [style=dotted label="Postponed"];
|
||||||
131 -> {132} [style=dotted];
|
131 -> {132} [style=dotted];
|
||||||
132 -> {133 142} [style=dotted];
|
132 -> {133 142} [style=dotted];
|
||||||
133 -> {134} [style=dotted];
|
133 -> {134} [style=dotted];
|
||||||
|
|||||||
+1
-1
@@ -340,7 +340,7 @@ digraph smartcastToNothing_kt {
|
|||||||
110 -> {111};
|
110 -> {111};
|
||||||
111 -> {113};
|
111 -> {113};
|
||||||
112 -> {114};
|
112 -> {114};
|
||||||
113 -> {114};
|
113 -> {114} [label="Postponed"];
|
||||||
114 -> {115};
|
114 -> {115};
|
||||||
115 -> {116};
|
115 -> {116};
|
||||||
116 -> {117};
|
116 -> {117};
|
||||||
|
|||||||
+3
-3
@@ -176,18 +176,18 @@ digraph complexPostponedCfg_kt {
|
|||||||
43 -> {44};
|
43 -> {44};
|
||||||
44 -> {46};
|
44 -> {46};
|
||||||
45 -> {47};
|
45 -> {47};
|
||||||
46 -> {47};
|
46 -> {47} [label="Postponed"];
|
||||||
47 -> {48};
|
47 -> {48};
|
||||||
48 -> {49};
|
48 -> {49};
|
||||||
49 -> {51};
|
49 -> {51};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {52} [color=green];
|
51 -> {52} [color=green];
|
||||||
51 -> {57} [color=red];
|
51 -> {57} [color=red label="Postponed"];
|
||||||
52 -> {53};
|
52 -> {53};
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {56};
|
54 -> {56};
|
||||||
55 -> {57};
|
55 -> {57};
|
||||||
56 -> {57};
|
56 -> {57} [label="Postponed"];
|
||||||
57 -> {58};
|
57 -> {58};
|
||||||
58 -> {59};
|
58 -> {59};
|
||||||
59 -> {60};
|
59 -> {60};
|
||||||
|
|||||||
Vendored
+10
-10
@@ -62,7 +62,7 @@ digraph callsInPlace_kt {
|
|||||||
11 -> {12};
|
11 -> {12};
|
||||||
12 -> {14};
|
12 -> {14};
|
||||||
13 -> {15};
|
13 -> {15};
|
||||||
14 -> {15};
|
14 -> {15} [label="Postponed"];
|
||||||
15 -> {16};
|
15 -> {16};
|
||||||
16 -> {17};
|
16 -> {17};
|
||||||
17 -> {18};
|
17 -> {18};
|
||||||
@@ -112,8 +112,8 @@ digraph callsInPlace_kt {
|
|||||||
30 -> {31};
|
30 -> {31};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {34};
|
32 -> {34};
|
||||||
33 -> {34};
|
|
||||||
33 -> {26} [color=green style=dashed];
|
33 -> {26} [color=green style=dashed];
|
||||||
|
33 -> {34} [label="Postponed"];
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
|
|
||||||
@@ -159,8 +159,8 @@ digraph callsInPlace_kt {
|
|||||||
45 -> {46};
|
45 -> {46};
|
||||||
46 -> {48};
|
46 -> {48};
|
||||||
47 -> {49};
|
47 -> {49};
|
||||||
48 -> {49};
|
|
||||||
48 -> {41} [color=green style=dashed];
|
48 -> {41} [color=green style=dashed];
|
||||||
|
48 -> {49} [label="Postponed"];
|
||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {51};
|
50 -> {51};
|
||||||
|
|
||||||
@@ -222,7 +222,7 @@ digraph callsInPlace_kt {
|
|||||||
66 -> {67};
|
66 -> {67};
|
||||||
67 -> {69};
|
67 -> {69};
|
||||||
68 -> {70};
|
68 -> {70};
|
||||||
69 -> {70};
|
69 -> {70} [label="Postponed"];
|
||||||
70 -> {71};
|
70 -> {71};
|
||||||
71 -> {72};
|
71 -> {72};
|
||||||
|
|
||||||
@@ -284,7 +284,7 @@ digraph callsInPlace_kt {
|
|||||||
87 -> {88};
|
87 -> {88};
|
||||||
88 -> {90};
|
88 -> {90};
|
||||||
89 -> {91};
|
89 -> {91};
|
||||||
90 -> {91};
|
90 -> {91} [label="Postponed"];
|
||||||
91 -> {92};
|
91 -> {92};
|
||||||
92 -> {93};
|
92 -> {93};
|
||||||
|
|
||||||
@@ -377,10 +377,10 @@ digraph callsInPlace_kt {
|
|||||||
116 -> {117};
|
116 -> {117};
|
||||||
117 -> {120};
|
117 -> {120};
|
||||||
118 -> {121};
|
118 -> {121};
|
||||||
119 -> {121};
|
|
||||||
119 -> {107} [color=green style=dashed];
|
119 -> {107} [color=green style=dashed];
|
||||||
120 -> {121};
|
119 -> {121} [label="Postponed"];
|
||||||
120 -> {107} [color=green style=dashed];
|
120 -> {107} [color=green style=dashed];
|
||||||
|
120 -> {121} [label="Postponed"];
|
||||||
121 -> {122};
|
121 -> {122};
|
||||||
122 -> {123};
|
122 -> {123};
|
||||||
|
|
||||||
@@ -441,10 +441,10 @@ digraph callsInPlace_kt {
|
|||||||
136 -> {137};
|
136 -> {137};
|
||||||
137 -> {140};
|
137 -> {140};
|
||||||
138 -> {141};
|
138 -> {141};
|
||||||
139 -> {141};
|
|
||||||
139 -> {127} [color=green style=dashed];
|
139 -> {127} [color=green style=dashed];
|
||||||
140 -> {141};
|
139 -> {141} [label="Postponed"];
|
||||||
140 -> {127} [color=green style=dashed];
|
140 -> {127} [color=green style=dashed];
|
||||||
|
140 -> {141} [label="Postponed"];
|
||||||
141 -> {142};
|
141 -> {142};
|
||||||
142 -> {143};
|
142 -> {143};
|
||||||
|
|
||||||
@@ -510,7 +510,7 @@ digraph callsInPlace_kt {
|
|||||||
157 -> {158};
|
157 -> {158};
|
||||||
158 -> {159};
|
158 -> {159};
|
||||||
160 -> {162};
|
160 -> {162};
|
||||||
161 -> {162};
|
161 -> {162} [label="Postponed"];
|
||||||
162 -> {163};
|
162 -> {163};
|
||||||
163 -> {164};
|
163 -> {164};
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -122,8 +122,8 @@ digraph atLeastOnce_kt {
|
|||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {33};
|
|
||||||
32 -> {24} [color=green style=dashed];
|
32 -> {24} [color=green style=dashed];
|
||||||
|
32 -> {33} [label="Postponed"];
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
@@ -183,8 +183,8 @@ digraph atLeastOnce_kt {
|
|||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
|
||||||
52 -> {44} [color=green style=dashed];
|
52 -> {44} [color=green style=dashed];
|
||||||
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
|
|||||||
+2
-2
@@ -121,7 +121,7 @@ digraph atMostOnce_kt {
|
|||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {33};
|
32 -> {33} [label="Postponed"];
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
@@ -180,7 +180,7 @@ digraph atMostOnce_kt {
|
|||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
|
|||||||
+2
-2
@@ -122,7 +122,7 @@ digraph exactlyOnce_kt {
|
|||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {33};
|
32 -> {33} [label="Postponed"];
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
@@ -182,7 +182,7 @@ digraph exactlyOnce_kt {
|
|||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
|
|||||||
+1
-1
@@ -132,7 +132,7 @@ digraph inPlaceLambda_kt {
|
|||||||
35 -> {36};
|
35 -> {36};
|
||||||
36 -> {38};
|
36 -> {38};
|
||||||
37 -> {39};
|
37 -> {39};
|
||||||
38 -> {39};
|
38 -> {39} [label="Postponed"];
|
||||||
39 -> {40};
|
39 -> {40};
|
||||||
40 -> {41};
|
40 -> {41};
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -121,8 +121,8 @@ digraph unknown_kt {
|
|||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {32};
|
30 -> {32};
|
||||||
31 -> {33};
|
31 -> {33};
|
||||||
32 -> {33};
|
|
||||||
32 -> {24} [color=green style=dashed];
|
32 -> {24} [color=green style=dashed];
|
||||||
|
32 -> {33} [label="Postponed"];
|
||||||
33 -> {34};
|
33 -> {34};
|
||||||
34 -> {35};
|
34 -> {35};
|
||||||
35 -> {36};
|
35 -> {36};
|
||||||
@@ -181,8 +181,8 @@ digraph unknown_kt {
|
|||||||
49 -> {50};
|
49 -> {50};
|
||||||
50 -> {52};
|
50 -> {52};
|
||||||
51 -> {53};
|
51 -> {53};
|
||||||
52 -> {53};
|
|
||||||
52 -> {44} [color=green style=dashed];
|
52 -> {44} [color=green style=dashed];
|
||||||
|
52 -> {53} [label="Postponed"];
|
||||||
53 -> {54};
|
53 -> {54};
|
||||||
54 -> {55};
|
54 -> {55};
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
|
|||||||
Vendored
+1
-1
@@ -229,7 +229,7 @@ digraph delegateWithAnonymousObject_kt {
|
|||||||
60 -> {61} [style=dotted];
|
60 -> {61} [style=dotted];
|
||||||
62 -> {64};
|
62 -> {64};
|
||||||
63 -> {64} [color=green];
|
63 -> {64} [color=green];
|
||||||
63 -> {68} [color=red];
|
63 -> {68} [color=red label="Postponed"];
|
||||||
64 -> {65};
|
64 -> {65};
|
||||||
65 -> {66};
|
65 -> {66};
|
||||||
66 -> {67};
|
66 -> {67};
|
||||||
|
|||||||
Vendored
+3
-3
@@ -52,7 +52,7 @@ digraph plusAssignWithLambdaInRhs_kt {
|
|||||||
11 -> {12} [style=dotted];
|
11 -> {12} [style=dotted];
|
||||||
12 -> {13} [style=dotted];
|
12 -> {13} [style=dotted];
|
||||||
13 -> {14} [style=dotted];
|
13 -> {14} [style=dotted];
|
||||||
15 -> {16} [style=dotted];
|
15 -> {16} [style=dotted label="Postponed"];
|
||||||
16 -> {17} [style=dotted];
|
16 -> {17} [style=dotted];
|
||||||
17 -> {18} [style=dotted];
|
17 -> {18} [style=dotted];
|
||||||
|
|
||||||
@@ -175,11 +175,11 @@ digraph plusAssignWithLambdaInRhs_kt {
|
|||||||
45 -> {46};
|
45 -> {46};
|
||||||
46 -> {47};
|
46 -> {47};
|
||||||
47 -> {48};
|
47 -> {48};
|
||||||
49 -> {50};
|
49 -> {50} [label="Postponed"];
|
||||||
50 -> {51};
|
50 -> {51};
|
||||||
51 -> {52};
|
51 -> {52};
|
||||||
53 -> {55};
|
53 -> {55};
|
||||||
54 -> {55};
|
54 -> {55} [label="Postponed"];
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
56 -> {59};
|
56 -> {59};
|
||||||
56 -> {57} [style=dotted];
|
56 -> {57} [style=dotted];
|
||||||
|
|||||||
+2
-2
@@ -128,7 +128,7 @@ finally {
|
|||||||
26 -> {28};
|
26 -> {28};
|
||||||
27 -> {20} [color=green style=dashed];
|
27 -> {20} [color=green style=dashed];
|
||||||
27 -> {28} [color=green];
|
27 -> {28} [color=green];
|
||||||
27 -> {35} [color=red];
|
27 -> {35} [color=red label="Postponed"];
|
||||||
28 -> {29};
|
28 -> {29};
|
||||||
29 -> {30};
|
29 -> {30};
|
||||||
30 -> {31};
|
30 -> {31};
|
||||||
@@ -223,7 +223,7 @@ finally {
|
|||||||
51 -> {52};
|
51 -> {52};
|
||||||
53 -> {55};
|
53 -> {55};
|
||||||
54 -> {55} [color=green];
|
54 -> {55} [color=green];
|
||||||
54 -> {62} [color=red];
|
54 -> {62} [color=red label="Postponed"];
|
||||||
55 -> {56};
|
55 -> {56};
|
||||||
56 -> {57};
|
56 -> {57};
|
||||||
57 -> {58};
|
57 -> {58};
|
||||||
|
|||||||
+2
-1
@@ -55,8 +55,9 @@ abstract class PathAwareControlFlowGraphVisitor<I : ControlFlowInfo<I, *, *>> :
|
|||||||
persistentMapOf(NormalPath to info)
|
persistentMapOf(NormalPath to info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// A normal path forwards all data. (Non-normal paths should only have data in finally blocks.)
|
// A normal or postponed path forwards all data. (Non-normal paths should only have data in finally blocks.)
|
||||||
label == NormalPath -> data
|
label == NormalPath -> data
|
||||||
|
label == PostponedPath -> data
|
||||||
// Labeled edge from a jump statement to a `finally` block forks flow. Usually we'd only have
|
// Labeled edge from a jump statement to a `finally` block forks flow. Usually we'd only have
|
||||||
// NormalPath data here, but technically it's possible (though questionable) to jump from a `finally`
|
// NormalPath data here, but technically it's possible (though questionable) to jump from a `finally`
|
||||||
// (discarding the exception or aborting a previous jump in the process) so merge all data just in case.
|
// (discarding the exception or aborting a previous jump in the process) so merge all data just in case.
|
||||||
|
|||||||
+32
-12
@@ -1280,23 +1280,32 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
private fun CFGNode<*>.buildDefaultFlow(
|
private fun CFGNode<*>.buildDefaultFlow(
|
||||||
builder: (FlowPath, MutableFlow) -> Unit,
|
builder: (FlowPath, MutableFlow) -> Unit,
|
||||||
): MutableFlow {
|
): MutableFlow {
|
||||||
val previousFlows = previousNodes.mapNotNull { node ->
|
val previousFlows = mutableListOf<PersistentFlow>()
|
||||||
|
val statementFlows = mutableListOf<PersistentFlow>()
|
||||||
|
|
||||||
|
for (node in previousNodes) {
|
||||||
val edge = edgeFrom(node)
|
val edge = edgeFrom(node)
|
||||||
if (!usedInDfa(edge)) return@mapNotNull null
|
if (!usedInDfa(edge)) continue
|
||||||
|
|
||||||
// `MergePostponedLambdaExitsNode` nodes form a parallel data flow graph. We never compute
|
// `MergePostponedLambdaExitsNode` nodes form a parallel data flow graph. We never compute
|
||||||
// data flow for any of them until reaching a completed call.
|
// data flow for any of them until reaching a completed call.
|
||||||
if (node is MergePostponedLambdaExitsNode && !node.flowInitialized) node.mergeIncomingFlow()
|
if (node is MergePostponedLambdaExitsNode && !node.flowInitialized) node.mergeIncomingFlow()
|
||||||
|
|
||||||
// For CFGNodes that are the end of alternate flows, use the alternate flow associated with the edge label.
|
// For CFGNodes that are the end of alternate flows, use the alternate flow associated with the edge label.
|
||||||
if (node is FinallyBlockExitNode) {
|
val flow = if (node is FinallyBlockExitNode) {
|
||||||
val alternatePath = FlowPath.CfgEdge(edge.label, node.fir)
|
val alternatePath = FlowPath.CfgEdge(edge.label, node.fir)
|
||||||
node.getAlternateFlow(alternatePath) ?: node.flow
|
node.getAlternateFlow(alternatePath) ?: node.flow
|
||||||
} else {
|
} else {
|
||||||
node.flow
|
node.flow
|
||||||
}
|
}
|
||||||
|
previousFlows.add(flow)
|
||||||
|
if (edge.label != PostponedPath) {
|
||||||
|
statementFlows.add(flow)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val result = logicSystem.joinFlow(previousFlows, isUnion)
|
|
||||||
|
val result = logicSystem.joinFlow(previousFlows, statementFlows, isUnion)
|
||||||
|
|
||||||
if (graphBuilder.lastNodeOrNull == this) {
|
if (graphBuilder.lastNodeOrNull == this) {
|
||||||
// Here it is, the new `lastNode`. If the previous state is the only predecessor, then there is actually
|
// Here it is, the new `lastNode`. If the previous state is the only predecessor, then there is actually
|
||||||
// nothing to update; `addTypeStatement` has already ensured we have the correct information.
|
// nothing to update; `addTypeStatement` has already ensured we have the correct information.
|
||||||
@@ -1305,7 +1314,9 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
}
|
}
|
||||||
currentReceiverState = result
|
currentReceiverState = result
|
||||||
}
|
}
|
||||||
return result.also { builder(FlowPath.Default, it) }
|
|
||||||
|
builder(FlowPath.Default, result)
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun CFGNode<*>.buildAlternateFlow(
|
private fun CFGNode<*>.buildAlternateFlow(
|
||||||
@@ -1313,25 +1324,34 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
builder: (FlowPath, MutableFlow) -> Unit,
|
builder: (FlowPath, MutableFlow) -> Unit,
|
||||||
): MutableFlow {
|
): MutableFlow {
|
||||||
val alternateFlowStart = this is FinallyBlockEnterNode
|
val alternateFlowStart = this is FinallyBlockEnterNode
|
||||||
val previousFlows = previousNodes.mapNotNull { node ->
|
val previousFlows = mutableListOf<PersistentFlow>()
|
||||||
|
val statementFlows = mutableListOf<PersistentFlow>()
|
||||||
|
|
||||||
|
for (node in previousNodes) {
|
||||||
val edge = edgeFrom(node)
|
val edge = edgeFrom(node)
|
||||||
if (!usedInDfa(edge)) return@mapNotNull null
|
if (!usedInDfa(edge)) continue
|
||||||
|
|
||||||
// For CFGNodes that cause alternate flow paths to be created, only edges with matching labels should be merged. However, when
|
// For CFGNodes that cause alternate flow paths to be created, only edges with matching labels should be merged. However, when
|
||||||
// an alternate flow is being propagated through one of these CFGNodes - i.e., when the FirElements do not match - only
|
// an alternate flow is being propagated through one of these CFGNodes - i.e., when the FirElements do not match - only
|
||||||
// NormalPath edges should be merged.
|
// NormalPath edges should be merged.
|
||||||
if (alternateFlowStart) {
|
if (alternateFlowStart) {
|
||||||
if (path.fir == this.fir && edge.label != path.label) {
|
if (path.fir == this.fir && edge.label != path.label) {
|
||||||
return@mapNotNull null
|
continue
|
||||||
} else if (path.fir != this.fir && edge.label != NormalPath) {
|
} else if (path.fir != this.fir && edge.label != NormalPath) {
|
||||||
return@mapNotNull null
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
node.getAlternateFlow(path) ?: node.flow
|
val flow = node.getAlternateFlow(path) ?: node.flow
|
||||||
|
previousFlows.add(flow)
|
||||||
|
if (edge.label != PostponedPath) {
|
||||||
|
statementFlows.add(flow)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val result = logicSystem.joinFlow(previousFlows, isUnion)
|
|
||||||
return result.also { builder(path, it) }
|
val result = logicSystem.joinFlow(previousFlows, statementFlows, isUnion)
|
||||||
|
builder(path, result)
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generally when calling some method on `graphBuilder`, one of the nodes it returns is the new `lastNode`.
|
// Generally when calling some method on `graphBuilder`, one of the nodes it returns is the new `lastNode`.
|
||||||
|
|||||||
+2
-2
@@ -333,7 +333,7 @@ class ControlFlowGraphBuilder {
|
|||||||
if (kind.usedInCfa || !exit.isDead) {
|
if (kind.usedInCfa || !exit.isDead) {
|
||||||
// Since `node` is a union node, it is dead iff any input is dead. For once, `propagateDeadness`
|
// Since `node` is a union node, it is dead iff any input is dead. For once, `propagateDeadness`
|
||||||
// semantics are correct without an `updateDeadStatus`.
|
// semantics are correct without an `updateDeadStatus`.
|
||||||
addEdge(exit, node, preferredKind = kind)
|
addEdge(exit, node, label = PostponedPath, preferredKind = kind)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,7 +381,7 @@ class ControlFlowGraphBuilder {
|
|||||||
} else {
|
} else {
|
||||||
for ((exit, kind) in currentLevelExits) {
|
for ((exit, kind) in currentLevelExits) {
|
||||||
// `node` is a merge node for many inputs anyhow so someone will call `updateDeadStatus` on it.
|
// `node` is a merge node for many inputs anyhow so someone will call `updateDeadStatus` on it.
|
||||||
addEdge(exit, node, preferredKind = kind, propagateDeadness = false)
|
addEdge(exit, node, label = PostponedPath, preferredKind = kind, propagateDeadness = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,15 @@ abstract class LogicSystem(private val context: ConeInferenceContext) {
|
|||||||
return !isNullableNothing
|
return !isNullableNothing
|
||||||
}
|
}
|
||||||
|
|
||||||
fun joinFlow(flows: Collection<PersistentFlow>, union: Boolean): MutableFlow {
|
/**
|
||||||
|
* Creates the next [Flow] by joining a set of previous [Flow]s.
|
||||||
|
*
|
||||||
|
* @param flows All [PersistentFlow]s which flow into the join flow. These will determine assignments and variable aliases for the
|
||||||
|
* resulting join flow.
|
||||||
|
* @param statementFlows A *subset* of [flows] used to determine what [TypeStatement]s will be copied to the join flow.
|
||||||
|
* @param union Determines if [TypeStatement]s from different flows should be combined with union or intersection logic.
|
||||||
|
*/
|
||||||
|
fun joinFlow(flows: Collection<PersistentFlow>, statementFlows: Collection<PersistentFlow>, union: Boolean): MutableFlow {
|
||||||
when (flows.size) {
|
when (flows.size) {
|
||||||
0 -> return MutableFlow()
|
0 -> return MutableFlow()
|
||||||
1 -> return flows.first().fork()
|
1 -> return flows.first().fork()
|
||||||
@@ -37,7 +45,7 @@ abstract class LogicSystem(private val context: ConeInferenceContext) {
|
|||||||
} else {
|
} else {
|
||||||
result.copyCommonAliases(flows)
|
result.copyCommonAliases(flows)
|
||||||
}
|
}
|
||||||
result.copyStatements(flows, commonFlow, union)
|
result.copyStatements(statementFlows, commonFlow, union)
|
||||||
// TODO: compute common implications?
|
// TODO: compute common implications?
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -106,6 +106,10 @@ object UncaughtExceptionPath : EdgeLabel {
|
|||||||
override val label: String get() = "onUncaughtException"
|
override val label: String get() = "onUncaughtException"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object PostponedPath : EdgeLabel {
|
||||||
|
override val label: String get() = "Postponed"
|
||||||
|
}
|
||||||
|
|
||||||
enum class EdgeKind(
|
enum class EdgeKind(
|
||||||
val usedInDfa: Boolean, // propagate flow to alive nodes
|
val usedInDfa: Boolean, // propagate flow to alive nodes
|
||||||
val usedInDeadDfa: Boolean, // propagate flow to dead nodes
|
val usedInDeadDfa: Boolean, // propagate flow to dead nodes
|
||||||
|
|||||||
+2
-2
@@ -772,7 +772,7 @@ digraph kt44814_kt {
|
|||||||
207 -> {209};
|
207 -> {209};
|
||||||
208 -> {195} [color=green style=dashed];
|
208 -> {195} [color=green style=dashed];
|
||||||
208 -> {209} [color=green];
|
208 -> {209} [color=green];
|
||||||
208 -> {216} [style=dotted];
|
208 -> {216} [style=dotted label="Postponed"];
|
||||||
209 -> {210};
|
209 -> {210};
|
||||||
210 -> {211 215};
|
210 -> {211 215};
|
||||||
211 -> {212};
|
211 -> {212};
|
||||||
@@ -817,7 +817,7 @@ digraph kt44814_kt {
|
|||||||
246 -> {247 249};
|
246 -> {247 249};
|
||||||
247 -> {248};
|
247 -> {248};
|
||||||
248 -> {255};
|
248 -> {255};
|
||||||
249 -> {255} [color=red];
|
249 -> {255} [color=red label="Postponed"];
|
||||||
250 -> {251};
|
250 -> {251};
|
||||||
251 -> {252};
|
251 -> {252};
|
||||||
252 -> {253};
|
252 -> {253};
|
||||||
|
|||||||
Vendored
+4
-4
@@ -84,8 +84,8 @@ digraph singleReturnFromTry_kt {
|
|||||||
20 -> {21} [style=dotted];
|
20 -> {21} [style=dotted];
|
||||||
21 -> {23} [style=dotted];
|
21 -> {23} [style=dotted];
|
||||||
22 -> {24};
|
22 -> {24};
|
||||||
23 -> {24};
|
|
||||||
23 -> {14} [color=green style=dashed];
|
23 -> {14} [color=green style=dashed];
|
||||||
|
23 -> {24} [label="Postponed"];
|
||||||
24 -> {25} [style=dotted];
|
24 -> {25} [style=dotted];
|
||||||
25 -> {26} [style=dotted];
|
25 -> {26} [style=dotted];
|
||||||
26 -> {27} [style=dotted];
|
26 -> {27} [style=dotted];
|
||||||
@@ -225,7 +225,7 @@ digraph singleReturnFromTry_kt {
|
|||||||
59 -> {61};
|
59 -> {61};
|
||||||
60 -> {51} [color=green style=dashed];
|
60 -> {51} [color=green style=dashed];
|
||||||
60 -> {61} [color=green];
|
60 -> {61} [color=green];
|
||||||
60 -> {69} [style=dotted];
|
60 -> {69} [style=dotted label="Postponed"];
|
||||||
61 -> {62} [style=dotted];
|
61 -> {62} [style=dotted];
|
||||||
62 -> {63} [style=dotted];
|
62 -> {63} [style=dotted];
|
||||||
63 -> {64} [style=dotted];
|
63 -> {64} [style=dotted];
|
||||||
@@ -321,8 +321,8 @@ digraph singleReturnFromTry_kt {
|
|||||||
91 -> {92} [style=dotted];
|
91 -> {92} [style=dotted];
|
||||||
92 -> {94} [style=dotted];
|
92 -> {94} [style=dotted];
|
||||||
93 -> {95};
|
93 -> {95};
|
||||||
94 -> {95};
|
|
||||||
94 -> {75} [color=green style=dashed];
|
94 -> {75} [color=green style=dashed];
|
||||||
|
94 -> {95} [label="Postponed"];
|
||||||
95 -> {96} [style=dotted];
|
95 -> {96} [style=dotted];
|
||||||
96 -> {97} [style=dotted];
|
96 -> {97} [style=dotted];
|
||||||
97 -> {98} [style=dotted];
|
97 -> {98} [style=dotted];
|
||||||
@@ -416,7 +416,7 @@ digraph singleReturnFromTry_kt {
|
|||||||
113 -> {115};
|
113 -> {115};
|
||||||
114 -> {105} [color=green style=dashed];
|
114 -> {105} [color=green style=dashed];
|
||||||
114 -> {115} [color=green];
|
114 -> {115} [color=green];
|
||||||
114 -> {129} [color=red];
|
114 -> {129} [color=red label="Postponed"];
|
||||||
115 -> {116} [style=dotted];
|
115 -> {116} [style=dotted];
|
||||||
116 -> {117} [style=dotted];
|
116 -> {117} [style=dotted];
|
||||||
117 -> {118} [style=dotted];
|
117 -> {118} [style=dotted];
|
||||||
|
|||||||
+2
-2
@@ -135,7 +135,7 @@ digraph delegatedConstructorArguments_kt {
|
|||||||
12 -> {14};
|
12 -> {14};
|
||||||
13 -> {6} [color=green style=dashed];
|
13 -> {6} [color=green style=dashed];
|
||||||
13 -> {14} [color=green];
|
13 -> {14} [color=green];
|
||||||
13 -> {15} [color=red];
|
13 -> {15} [color=red label="Postponed"];
|
||||||
14 -> {15};
|
14 -> {15};
|
||||||
15 -> {30} [color=green label="return@/Test.Test"];
|
15 -> {30} [color=green label="return@/Test.Test"];
|
||||||
15 -> {45} [color=red];
|
15 -> {45} [color=red];
|
||||||
@@ -153,7 +153,7 @@ digraph delegatedConstructorArguments_kt {
|
|||||||
26 -> {28};
|
26 -> {28};
|
||||||
27 -> {20} [color=green style=dashed];
|
27 -> {20} [color=green style=dashed];
|
||||||
27 -> {28} [color=green];
|
27 -> {28} [color=green];
|
||||||
27 -> {29} [color=red];
|
27 -> {29} [color=red label="Postponed"];
|
||||||
28 -> {29};
|
28 -> {29};
|
||||||
29 -> {30} [color=green label="return@/Test.Test"];
|
29 -> {30} [color=green label="return@/Test.Test"];
|
||||||
29 -> {55} [color=red];
|
29 -> {55} [color=red];
|
||||||
|
|||||||
+1
-1
@@ -467,7 +467,7 @@ digraph smartCastInCatch_fir_kt {
|
|||||||
148 -> {150};
|
148 -> {150};
|
||||||
149 -> {151};
|
149 -> {151};
|
||||||
150 -> {151} [color=green];
|
150 -> {151} [color=green];
|
||||||
150 -> {163} [color=red];
|
150 -> {163} [color=red label="Postponed"];
|
||||||
151 -> {152};
|
151 -> {152};
|
||||||
152 -> {153};
|
152 -> {153};
|
||||||
153 -> {154 163};
|
153 -> {154 163};
|
||||||
|
|||||||
+1
-1
@@ -1062,7 +1062,7 @@ digraph castInTryWithJump_fir_kt {
|
|||||||
344 -> {345} [style=dotted];
|
344 -> {345} [style=dotted];
|
||||||
345 -> {347} [style=dotted];
|
345 -> {347} [style=dotted];
|
||||||
346 -> {348} [style=dotted];
|
346 -> {348} [style=dotted];
|
||||||
347 -> {348} [style=dotted];
|
347 -> {348} [style=dotted label="Postponed"];
|
||||||
348 -> {349} [style=dotted];
|
348 -> {349} [style=dotted];
|
||||||
349 -> {350} [style=dotted];
|
349 -> {350} [style=dotted];
|
||||||
350 -> {351} [style=dotted];
|
350 -> {351} [style=dotted];
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ fun foo(arg: Int?) {
|
|||||||
x.hashCode()
|
x.hashCode()
|
||||||
x = null
|
x = null
|
||||||
}
|
}
|
||||||
if (<!SENSELESS_COMPARISON!>x != null<!>) x = 42
|
if (x != null) x = 42
|
||||||
// Unsafe because of lambda
|
// Unsafe because of lambda
|
||||||
x<!UNSAFE_CALL!>.<!>hashCode()
|
x<!UNSAFE_CALL!>.<!>hashCode()
|
||||||
}
|
}
|
||||||
+2
-2
@@ -10,13 +10,13 @@ fun testSafeCaptureVarInInitializer() {
|
|||||||
|
|
||||||
val s = when (val y = run { x = 42; 32 }) {
|
val s = when (val y = run { x = 42; 32 }) {
|
||||||
0 -> {
|
0 -> {
|
||||||
x.inc() // TODO fix smart casts for captured variables
|
x<!UNSAFE_CALL!>.<!>inc() // TODO fix smart casts for captured variables
|
||||||
"0"
|
"0"
|
||||||
}
|
}
|
||||||
else -> "!= 0"
|
else -> "!= 0"
|
||||||
}
|
}
|
||||||
|
|
||||||
x.inc() // TODO fix smart casts for captured variables
|
x<!UNSAFE_CALL!>.<!>inc() // TODO fix smart casts for captured variables
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-48
@@ -1,48 +0,0 @@
|
|||||||
// !LANGUAGE: +VariableDeclarationInWhenSubject
|
|
||||||
|
|
||||||
fun foo(s1: Int, s2: Int) = s1 + s2
|
|
||||||
|
|
||||||
fun test1(x: String?) =
|
|
||||||
when (val y = x?.length) {
|
|
||||||
null -> 0
|
|
||||||
else -> foo(x.length, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test2(x: String?) {
|
|
||||||
when (val y = run { x!! }) {
|
|
||||||
"foo" -> x.length
|
|
||||||
"bar" -> y.length
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test3(x: String?, y: String?) {
|
|
||||||
when (val z = x ?: y!!) {
|
|
||||||
"foo" -> x<!UNSAFE_CALL!>.<!>length
|
|
||||||
"bar" -> y<!UNSAFE_CALL!>.<!>length
|
|
||||||
"baz" -> z.length
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> id(x: T): T = x
|
|
||||||
|
|
||||||
fun test4(x: String?) {
|
|
||||||
when (val y = id(x!!)) {
|
|
||||||
"foo" -> x.length
|
|
||||||
"bar" -> y.length
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Inv<T>(val data: T)
|
|
||||||
|
|
||||||
fun test5(x: Inv<out Any?>) {
|
|
||||||
when (val y = x.data) {
|
|
||||||
is String -> y.length // should be ok
|
|
||||||
null -> x.data.<!UNRESOLVED_REFERENCE!>length<!> // should be error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test6(x: Inv<out String?>) {
|
|
||||||
when (val y = x.data) {
|
|
||||||
is String -> x.data.length // should be ok
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+6
-4
@@ -1,11 +1,13 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: +VariableDeclarationInWhenSubject
|
// !LANGUAGE: +VariableDeclarationInWhenSubject
|
||||||
|
// DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
||||||
|
|
||||||
fun foo(s1: Int, s2: Int) = s1 + s2
|
fun foo(s1: Int, s2: Int) = s1 + s2
|
||||||
|
|
||||||
fun test1(x: String?) =
|
fun test1(x: String?) =
|
||||||
when (val y = x?.length) {
|
when (val y = x?.length) {
|
||||||
null -> 0
|
null -> 0
|
||||||
else -> foo(<!DEBUG_INFO_SMARTCAST!>x<!>.length, <!DEBUG_INFO_SMARTCAST!>y<!>)
|
else -> foo(x.length, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2(x: String?) {
|
fun test2(x: String?) {
|
||||||
@@ -27,7 +29,7 @@ fun <T> id(x: T): T = x
|
|||||||
|
|
||||||
fun test4(x: String?) {
|
fun test4(x: String?) {
|
||||||
when (val y = id(x!!)) {
|
when (val y = id(x!!)) {
|
||||||
"foo" -> <!DEBUG_INFO_SMARTCAST!>x<!>.length
|
"foo" -> x.length
|
||||||
"bar" -> y.length
|
"bar" -> y.length
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,13 +38,13 @@ class Inv<T>(val data: T)
|
|||||||
|
|
||||||
fun test5(x: Inv<out Any?>) {
|
fun test5(x: Inv<out Any?>) {
|
||||||
when (val y = x.data) {
|
when (val y = x.data) {
|
||||||
is String -> <!DEBUG_INFO_SMARTCAST!>y<!>.length // should be ok
|
is String -> y.length // should be ok
|
||||||
null -> x.data.<!UNRESOLVED_REFERENCE!>length<!> // should be error
|
null -> x.data.<!UNRESOLVED_REFERENCE!>length<!> // should be error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test6(x: Inv<out String?>) {
|
fun test6(x: Inv<out String?>) {
|
||||||
when (val y = x.data) {
|
when (val y = x.data) {
|
||||||
is String -> <!DEBUG_INFO_SMARTCAST!>x.data<!>.length // should be ok
|
is String -> x.data.length // should be ok
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-27
@@ -1,27 +0,0 @@
|
|||||||
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
|
|
||||||
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
|
|
||||||
|
|
||||||
fun testRequireSmartcast(x: Any?) {
|
|
||||||
require(x is String)
|
|
||||||
x.length
|
|
||||||
}
|
|
||||||
|
|
||||||
fun testRequireUnreachableCode() {
|
|
||||||
require(false)
|
|
||||||
println("Can't get here!")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun testRequireWithMessage(x: Any?) {
|
|
||||||
require(x is String) { "x is not String!" }
|
|
||||||
x.length
|
|
||||||
}
|
|
||||||
|
|
||||||
fun testRequireWithFailingMessage(x: Any?) {
|
|
||||||
require(x is String) { throw kotlin.IllegalStateException("What a strange idea") }
|
|
||||||
x.length
|
|
||||||
}
|
|
||||||
|
|
||||||
fun tesRequireNotNullWithMessage(x: Int?) {
|
|
||||||
requireNotNull(x) { "x is null!"}
|
|
||||||
x.inc()
|
|
||||||
}
|
|
||||||
+27
-6
@@ -1,9 +1,11 @@
|
|||||||
// !LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -INVISIBLE_REFERENCE -INVISIBLE_MEMBER
|
// LANGUAGE: +ReadDeserializedContracts +UseReturnsEffect
|
||||||
|
// DIAGNOSTICS: -INVISIBLE_REFERENCE, -INVISIBLE_MEMBER, -DEBUG_INFO_SMARTCAST
|
||||||
|
// SKIP_TXT
|
||||||
|
|
||||||
fun testRequireSmartcast(x: Any?) {
|
fun testRequireSmartcast(x: Any?) {
|
||||||
require(x is String)
|
require(x is String)
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.length
|
x.length
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testRequireUnreachableCode() {
|
fun testRequireUnreachableCode() {
|
||||||
@@ -13,15 +15,34 @@ fun testRequireUnreachableCode() {
|
|||||||
|
|
||||||
fun testRequireWithMessage(x: Any?) {
|
fun testRequireWithMessage(x: Any?) {
|
||||||
require(x is String) { "x is not String!" }
|
require(x is String) { "x is not String!" }
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.length
|
x.length
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testRequireWithFailingMessage(x: Any?) {
|
fun testRequireWithFailingMessage(x: Any?) {
|
||||||
require(x is String) { throw kotlin.IllegalStateException("What a strange idea") }
|
require(x is String) { throw kotlin.IllegalStateException("What a strange idea") }
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.length
|
x.length
|
||||||
}
|
}
|
||||||
|
|
||||||
fun tesRequireNotNullWithMessage(x: Int?) {
|
fun tesRequireNotNullWithMessage(x: Int?) {
|
||||||
requireNotNull(x) { "x is null!"}
|
requireNotNull(x) { "x is null!"}
|
||||||
<!DEBUG_INFO_SMARTCAST!>x<!>.inc()
|
x.inc()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testRequireAndDefiniteReturn(x: Any, b: Boolean) {
|
||||||
|
if (b) {
|
||||||
|
require(x is String)
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
x.length
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun testRequireWithFailingMessageAndDefiniteReturn(x: Any, b: Boolean) {
|
||||||
|
if (b) {
|
||||||
|
require(x is String) { "x is not String!" }
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
x.length
|
||||||
}
|
}
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
package
|
|
||||||
|
|
||||||
public fun tesRequireNotNullWithMessage(/*0*/ x: kotlin.Int?): kotlin.Unit
|
|
||||||
public fun testRequireSmartcast(/*0*/ x: kotlin.Any?): kotlin.Unit
|
|
||||||
public fun testRequireUnreachableCode(): kotlin.Unit
|
|
||||||
public fun testRequireWithFailingMessage(/*0*/ x: kotlin.Any?): kotlin.Unit
|
|
||||||
public fun testRequireWithMessage(/*0*/ x: kotlin.Any?): kotlin.Unit
|
|
||||||
+1
-1
@@ -3,5 +3,5 @@
|
|||||||
fun foo(y: String) {
|
fun foo(y: String) {
|
||||||
var x: String? = null
|
var x: String? = null
|
||||||
y.let { x = it }
|
y.let { x = it }
|
||||||
x.length // Smart cast is not possible
|
x<!UNSAFE_CALL!>.<!>length // Smart cast is not possible
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -4,6 +4,6 @@ fun foo(y: String?) {
|
|||||||
var x: String? = null
|
var x: String? = null
|
||||||
if (x != null) {
|
if (x != null) {
|
||||||
y?.let { x = it }
|
y?.let { x = it }
|
||||||
x.length // not-null or not-null
|
x<!UNSAFE_CALL!>.<!>length // not-null or not-null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
-39
@@ -1,39 +0,0 @@
|
|||||||
// !OPT_IN: kotlin.contracts.ExperimentalContracts
|
|
||||||
// SKIP_TXT
|
|
||||||
|
|
||||||
/*
|
|
||||||
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE)
|
|
||||||
*
|
|
||||||
* SECTIONS: contracts, analysis, smartcasts
|
|
||||||
* NUMBER: 12
|
|
||||||
* DESCRIPTION: Smartcasts after non-null assertions or not-null value assignment in lambdas of contract function with 'exactly once' or 'at least once' CallsInPlace effects.
|
|
||||||
* UNEXPECTED BEHAVIOUR
|
|
||||||
* ISSUES: KT-26148
|
|
||||||
* HELPERS: contractFunctions
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TESTCASE NUMBER: 1
|
|
||||||
fun case_1(arg: Int?) {
|
|
||||||
funWithExactlyOnceCallsInPlace { arg!! }
|
|
||||||
arg.inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
// TESTCASE NUMBER: 2
|
|
||||||
fun case_2(arg: Int?) {
|
|
||||||
funWithAtLeastOnceCallsInPlace { arg!! }
|
|
||||||
arg.inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
// TESTCASE NUMBER: 3
|
|
||||||
fun case_3() {
|
|
||||||
val value_1: Boolean?
|
|
||||||
funWithExactlyOnceCallsInPlace { value_1 = false }
|
|
||||||
value_1.not()
|
|
||||||
}
|
|
||||||
|
|
||||||
// TESTCASE NUMBER: 4
|
|
||||||
fun case_4() {
|
|
||||||
val value_1: Boolean?
|
|
||||||
funWithAtLeastOnceCallsInPlace { <!VAL_REASSIGNMENT!>value_1<!> = true }
|
|
||||||
value_1.not()
|
|
||||||
}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !OPT_IN: kotlin.contracts.ExperimentalContracts
|
// !OPT_IN: kotlin.contracts.ExperimentalContracts
|
||||||
// SKIP_TXT
|
// SKIP_TXT
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user