[FE 1.0] Always create return value for CallInstruction
This fixes missing `USED_AS_EXPRESSION` recordings ^KT-47527 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
b2372ff0b9
commit
ae608ea67f
+6
@@ -16364,6 +16364,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
|
||||
Generated
+6
@@ -458,6 +458,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt45308.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt47527.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("localClassWithOverrides.kt")
|
||||
public void testLocalClassWithOverrides() throws Exception {
|
||||
|
||||
+1
-3
@@ -17,7 +17,6 @@
|
||||
package org.jetbrains.kotlin.cfg.pseudocode
|
||||
|
||||
import com.intellij.util.containers.Stack
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.cfg.*
|
||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.BlockScope
|
||||
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
|
||||
@@ -383,14 +382,13 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() {
|
||||
receiverValues: Map<PseudoValue, ReceiverValue>,
|
||||
arguments: Map<PseudoValue, ValueParameterDescriptor>
|
||||
): CallInstruction {
|
||||
val returnType = resolvedCall.resultingDescriptor.returnType
|
||||
val instruction = CallInstruction(
|
||||
valueElement,
|
||||
currentScope,
|
||||
resolvedCall,
|
||||
receiverValues,
|
||||
arguments,
|
||||
if (returnType != null && KotlinBuiltIns.isNothing(returnType)) null else valueFactory
|
||||
valueFactory
|
||||
)
|
||||
add(instruction)
|
||||
return instruction
|
||||
|
||||
@@ -52,7 +52,7 @@ L0:
|
||||
mark({ if (flag) { s.add(it) } else { s.remove(it) } return true })
|
||||
r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> <v3>
|
||||
mark(let { if (flag) { s.add(it) } else { s.remove(it) } return true })
|
||||
call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>)
|
||||
call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>) -> <v4>
|
||||
L4 [before inlined declaration]:
|
||||
inlined({ if (flag) { s.add(it) } else { s.remove(it) } return true }) NEXT:[<SINK>]
|
||||
L3 [result of call]:
|
||||
|
||||
@@ -28,8 +28,8 @@ fun test(name: String?, flag: Boolean): Boolean {
|
||||
<v1>: Boolean NEW: magic[FAKE_INITIALIZER](flag: Boolean) -> <v1>
|
||||
name <v2>: String NEW: r(name) -> <v2>
|
||||
{ if (flag) { s.add(it) } else { s.remove(it) } return true } <v3>: {<: (String) -> Nothing} NEW: r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> <v3>
|
||||
let { if (flag) { s.add(it) } else { s.remove(it) } return true } !<v4>: *
|
||||
name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } !<v4>: * COPY
|
||||
let { if (flag) { s.add(it) } else { s.remove(it) } return true } <v4>: * NEW: call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>) -> <v4>
|
||||
name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } <v4>: * COPY
|
||||
false <v5>: Boolean NEW: r(false) -> <v5>
|
||||
return false !<v6>: *
|
||||
{ name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } !<v6>: * COPY
|
||||
|
||||
@@ -55,9 +55,9 @@ L0:
|
||||
L4 [after local declaration]:
|
||||
r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> <v3> PREV:[jmp?(L4)]
|
||||
mark(let { if (flag) { s.add(it) } else { s.remove(it) } return true })
|
||||
call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>)
|
||||
call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>) -> <v4>
|
||||
L3 [result of call]:
|
||||
jmp?(L2) NEXT:[mark({ name?.hashCode() }), r(false) -> <v5>] PREV:[jf(L3), call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>)]
|
||||
jmp?(L2) NEXT:[mark({ name?.hashCode() }), r(false) -> <v5>] PREV:[jf(L3), call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>) -> <v4>]
|
||||
r(false) -> <v5>
|
||||
6 mark({ name?.hashCode() })
|
||||
mark(name?.hashCode())
|
||||
|
||||
@@ -28,8 +28,8 @@ fun test(name: String?, flag: Boolean): Boolean {
|
||||
<v1>: Boolean NEW: magic[FAKE_INITIALIZER](flag: Boolean) -> <v1>
|
||||
name <v2>: String NEW: r(name) -> <v2>
|
||||
{ if (flag) { s.add(it) } else { s.remove(it) } return true } <v3>: {<: (String) -> Nothing} NEW: r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> <v3>
|
||||
let { if (flag) { s.add(it) } else { s.remove(it) } return true } !<v4>: *
|
||||
name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } !<v4>: * COPY
|
||||
let { if (flag) { s.add(it) } else { s.remove(it) } return true } <v4>: * NEW: call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|<v2>, <v3>) -> <v4>
|
||||
name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } <v4>: * COPY
|
||||
false <v5>: Boolean NEW: r(false) -> <v5>
|
||||
return false !<v6>: *
|
||||
{ name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } !<v6>: * COPY
|
||||
|
||||
@@ -103,13 +103,13 @@ L2 [after local declaration]:
|
||||
mark({ return })
|
||||
r({ return }) -> <v1>
|
||||
mark(let { return })
|
||||
call(let { return }, let|<v0>, <v1>)
|
||||
call(let { return }, let|<v0>, <v1>) -> <v2>
|
||||
L6 [before inlined declaration]:
|
||||
inlined({ return }) NEXT:[<SINK>]
|
||||
L5 [result of call]:
|
||||
L7 [after inlined declaration]:
|
||||
mark(f(null?.let { return })) PREV:[jf(L5)]
|
||||
call(f(null?.let { return }), f|!<v2>) -> <v3>
|
||||
call(f(null?.let { return }), f|<v2>) -> <v3>
|
||||
mark(doSomething())
|
||||
call(doSomething(), doSomething) -> <v4>
|
||||
L1:
|
||||
@@ -163,28 +163,28 @@ L0:
|
||||
magic[FAKE_INITIALIZER](x: Any?) -> <v0>
|
||||
w(x|<v0>)
|
||||
mark(x?.let { return true })
|
||||
jf(L2) NEXT:[mark(x?.let { return true } ?: false), r(x) -> <v1>]
|
||||
jf(L2) NEXT:[mark(x?.let { return true } ?: false), r(x) -> <v1>]
|
||||
r(x) -> <v1>
|
||||
mark({ return true })
|
||||
r({ return true }) -> <v2>
|
||||
mark(let { return true })
|
||||
call(let { return true }, let|<v1>, <v2>)
|
||||
call(let { return true }, let|<v1>, <v2>) -> <v3>
|
||||
L3 [before inlined declaration]:
|
||||
inlined({ return true }) NEXT:[<SINK>]
|
||||
inlined({ return true }) NEXT:[<SINK>]
|
||||
L2 [result of call]:
|
||||
L4 [after inlined declaration]:
|
||||
mark(x?.let { return true } ?: false) PREV:[jf(L2)]
|
||||
jt(L7|!<v3>) NEXT:[r(false) -> <v4>, merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5>]
|
||||
mark(x?.let { return true } ?: false) PREV:[jf(L2)]
|
||||
jt(L7|<v3>) NEXT:[r(false) -> <v4>, merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5>]
|
||||
r(false) -> <v4>
|
||||
L7 [after elvis operator]:
|
||||
merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5> PREV:[jt(L7|!<v3>), r(false) -> <v4>]
|
||||
merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5> PREV:[jt(L7|<v3>), r(false) -> <v4>]
|
||||
ret(*|<v5>) L1
|
||||
L1:
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>, inlined({ return true })]
|
||||
<SINK> PREV:[<ERROR>, <END>, inlined({ return true })]
|
||||
=====================
|
||||
== inlined anonymous_2 ==
|
||||
{
|
||||
|
||||
@@ -45,9 +45,9 @@ fun test2() {
|
||||
---------------------
|
||||
null <v0>: Nothing NEW: r(null) -> <v0>
|
||||
{ return } <v1>: {<: (Nothing) -> Nothing} NEW: r({ return }) -> <v1>
|
||||
let { return } !<v2>: *
|
||||
null?.let { return } !<v2>: * COPY
|
||||
f(null?.let { return }) <v3>: * NEW: call(f(null?.let { return }), f|!<v2>) -> <v3>
|
||||
let { return } <v2>: * NEW: call(let { return }, let|<v0>, <v1>) -> <v2>
|
||||
null?.let { return } <v2>: * COPY
|
||||
f(null?.let { return }) <v3>: * NEW: call(f(null?.let { return }), f|<v2>) -> <v3>
|
||||
doSomething() <v4>: * NEW: call(doSomething(), doSomething) -> <v4>
|
||||
{ fun f(x: Any?) = x f(null?.let { return }) // false unreachable here doSomething() } <v4>: * COPY
|
||||
=====================
|
||||
@@ -72,10 +72,10 @@ fun test3(x: Any?): Boolean =
|
||||
<v0>: * NEW: magic[FAKE_INITIALIZER](x: Any?) -> <v0>
|
||||
x <v1>: {<: Any} NEW: r(x) -> <v1>
|
||||
{ return true } <v2>: {<: (Any) -> Nothing} NEW: r({ return true }) -> <v2>
|
||||
let { return true } !<v3>: *
|
||||
x?.let { return true } !<v3>: * COPY
|
||||
let { return true } <v3>: Boolean NEW: call(let { return true }, let|<v1>, <v2>) -> <v3>
|
||||
x?.let { return true } <v3>: Boolean COPY
|
||||
false <v4>: Boolean NEW: r(false) -> <v4>
|
||||
x?.let { return true } ?: false <v5>: Boolean NEW: merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5>
|
||||
x?.let { return true } ?: false <v5>: Boolean NEW: merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5>
|
||||
=====================
|
||||
== inlined anonymous_2 ==
|
||||
{
|
||||
|
||||
@@ -106,10 +106,10 @@ L2 [after local declaration]:
|
||||
L6 [after local declaration]:
|
||||
r({ return }) -> <v1> PREV:[jmp?(L6)]
|
||||
mark(let { return })
|
||||
call(let { return }, let|<v0>, <v1>)
|
||||
call(let { return }, let|<v0>, <v1>) -> <v2>
|
||||
L5 [result of call]:
|
||||
mark(f(null?.let { return })) PREV:[jf(L5), call(let { return }, let|<v0>, <v1>)]
|
||||
call(f(null?.let { return }), f|!<v2>) -> <v3>
|
||||
mark(f(null?.let { return })) PREV:[jf(L5), call(let { return }, let|<v0>, <v1>) -> <v2>]
|
||||
call(f(null?.let { return }), f|<v2>) -> <v3>
|
||||
mark(doSomething())
|
||||
call(doSomething(), doSomething) -> <v4>
|
||||
L1:
|
||||
@@ -163,28 +163,28 @@ L0:
|
||||
magic[FAKE_INITIALIZER](x: Any?) -> <v0>
|
||||
w(x|<v0>)
|
||||
mark(x?.let { return true })
|
||||
jf(L2) NEXT:[mark(x?.let { return true } ?: false), r(x) -> <v1>]
|
||||
jf(L2) NEXT:[mark(x?.let { return true } ?: false), r(x) -> <v1>]
|
||||
r(x) -> <v1>
|
||||
mark({ return true })
|
||||
jmp?(L3) NEXT:[r({ return true }) -> <v2>, d({ return true })]
|
||||
d({ return true }) NEXT:[<SINK>]
|
||||
jmp?(L3) NEXT:[r({ return true }) -> <v2>, d({ return true })]
|
||||
d({ return true }) NEXT:[<SINK>]
|
||||
L3 [after local declaration]:
|
||||
r({ return true }) -> <v2> PREV:[jmp?(L3)]
|
||||
r({ return true }) -> <v2> PREV:[jmp?(L3)]
|
||||
mark(let { return true })
|
||||
call(let { return true }, let|<v1>, <v2>)
|
||||
call(let { return true }, let|<v1>, <v2>) -> <v3>
|
||||
L2 [result of call]:
|
||||
mark(x?.let { return true } ?: false) PREV:[jf(L2), call(let { return true }, let|<v1>, <v2>)]
|
||||
jt(L6|!<v3>) NEXT:[r(false) -> <v4>, merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5>]
|
||||
mark(x?.let { return true } ?: false) PREV:[jf(L2), call(let { return true }, let|<v1>, <v2>) -> <v3>]
|
||||
jt(L6|<v3>) NEXT:[r(false) -> <v4>, merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5>]
|
||||
r(false) -> <v4>
|
||||
L6 [after elvis operator]:
|
||||
merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5> PREV:[jt(L6|!<v3>), r(false) -> <v4>]
|
||||
merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5> PREV:[jt(L6|<v3>), r(false) -> <v4>]
|
||||
ret(*|<v5>) L1
|
||||
L1:
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
|
||||
<END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>, d({ return true })]
|
||||
<SINK> PREV:[<ERROR>, <END>, d({ return true })]
|
||||
=====================
|
||||
== anonymous_2 ==
|
||||
{
|
||||
|
||||
@@ -45,9 +45,9 @@ fun test2() {
|
||||
---------------------
|
||||
null <v0>: Nothing NEW: r(null) -> <v0>
|
||||
{ return } <v1>: {<: (Nothing) -> Nothing} NEW: r({ return }) -> <v1>
|
||||
let { return } !<v2>: *
|
||||
null?.let { return } !<v2>: * COPY
|
||||
f(null?.let { return }) <v3>: * NEW: call(f(null?.let { return }), f|!<v2>) -> <v3>
|
||||
let { return } <v2>: * NEW: call(let { return }, let|<v0>, <v1>) -> <v2>
|
||||
null?.let { return } <v2>: * COPY
|
||||
f(null?.let { return }) <v3>: * NEW: call(f(null?.let { return }), f|<v2>) -> <v3>
|
||||
doSomething() <v4>: * NEW: call(doSomething(), doSomething) -> <v4>
|
||||
{ fun f(x: Any?) = x f(null?.let { return }) // false unreachable here doSomething() } <v4>: * COPY
|
||||
=====================
|
||||
@@ -72,10 +72,10 @@ fun test3(x: Any?): Boolean =
|
||||
<v0>: * NEW: magic[FAKE_INITIALIZER](x: Any?) -> <v0>
|
||||
x <v1>: {<: Any} NEW: r(x) -> <v1>
|
||||
{ return true } <v2>: {<: (Any) -> Nothing} NEW: r({ return true }) -> <v2>
|
||||
let { return true } !<v3>: *
|
||||
x?.let { return true } !<v3>: * COPY
|
||||
let { return true } <v3>: Boolean NEW: call(let { return true }, let|<v1>, <v2>) -> <v3>
|
||||
x?.let { return true } <v3>: Boolean COPY
|
||||
false <v4>: Boolean NEW: r(false) -> <v4>
|
||||
x?.let { return true } ?: false <v5>: Boolean NEW: merge(x?.let { return true } ?: false|!<v3>, <v4>) -> <v5>
|
||||
x?.let { return true } ?: false <v5>: Boolean NEW: merge(x?.let { return true } ?: false|<v3>, <v4>) -> <v5>
|
||||
=====================
|
||||
== anonymous_2 ==
|
||||
{
|
||||
|
||||
@@ -52,14 +52,14 @@ L0:
|
||||
L3 [after local declaration]:
|
||||
r({ throw Exception() }) -> <v1> PREV:[jmp?(L3)]
|
||||
mark(let { throw Exception() })
|
||||
call(let { throw Exception() }, let|<v0>, <v1>)
|
||||
call(let { throw Exception() }, let|<v0>, <v1>) -> <v2>
|
||||
L2 [result of call]:
|
||||
mark(fn()?.let { throw Exception() } ?: "unreachable?") PREV:[jf(L2), call(let { throw Exception() }, let|<v0>, <v1>)]
|
||||
jt(L6|!<v2>) NEXT:[mark("unreachable?"), merge(fn()?.let { throw Exception() } ?: "unreachable?"|!<v2>, <v3>) -> <v4>]
|
||||
mark(fn()?.let { throw Exception() } ?: "unreachable?") PREV:[jf(L2), call(let { throw Exception() }, let|<v0>, <v1>) -> <v2>]
|
||||
jt(L6|<v2>) NEXT:[mark("unreachable?"), merge(fn()?.let { throw Exception() } ?: "unreachable?"|<v2>, <v3>) -> <v4>]
|
||||
mark("unreachable?")
|
||||
r("unreachable?") -> <v3>
|
||||
L6 [after elvis operator]:
|
||||
merge(fn()?.let { throw Exception() } ?: "unreachable?"|!<v2>, <v3>) -> <v4> PREV:[jt(L6|!<v2>), r("unreachable?") -> <v3>]
|
||||
merge(fn()?.let { throw Exception() } ?: "unreachable?"|<v2>, <v3>) -> <v4> PREV:[jt(L6|<v2>), r("unreachable?") -> <v3>]
|
||||
w(x|<v4>)
|
||||
r(x) -> <v5>
|
||||
ret(*|<v5>) L1
|
||||
@@ -119,16 +119,16 @@ L2 [after elvis operator]:
|
||||
L4 [after local declaration]:
|
||||
r({ throw Exception() }) -> <v5> PREV:[jmp?(L4)]
|
||||
mark(let { throw Exception() })
|
||||
call(let { throw Exception() }, let|<v4>, <v5>)
|
||||
call(let { throw Exception() }, let|<v4>, <v5>) -> <v6>
|
||||
jmp(error) NEXT:[<ERROR>]
|
||||
L3 [result of call]:
|
||||
jmp(error) NEXT:[<ERROR>] PREV:[jf(L3)]
|
||||
- mark(x?.let { throw Exception() } ?: "unreachable") PREV:[]
|
||||
- jt(L7|!<v6>) NEXT:[mark("unreachable"), merge(x?.let { throw Exception() } ?: "unreachable"|!<v6>, <v7>) -> <v8>] PREV:[]
|
||||
- jt(L7|<v6>) NEXT:[mark("unreachable"), merge(x?.let { throw Exception() } ?: "unreachable"|<v6>, <v7>) -> <v8>] PREV:[]
|
||||
- mark("unreachable") PREV:[]
|
||||
- r("unreachable") -> <v7> PREV:[]
|
||||
L7 [after elvis operator]:
|
||||
- merge(x?.let { throw Exception() } ?: "unreachable"|!<v6>, <v7>) -> <v8> PREV:[]
|
||||
- merge(x?.let { throw Exception() } ?: "unreachable"|<v6>, <v7>) -> <v8> PREV:[]
|
||||
- w(y|<v8>) PREV:[]
|
||||
- r(y) -> <v9> PREV:[]
|
||||
- ret(*|<v9>) L1 PREV:[]
|
||||
|
||||
+6
-6
@@ -20,10 +20,10 @@ fun foo(): String {
|
||||
---------------------
|
||||
fn() <v0>: String NEW: call(fn(), fn) -> <v0>
|
||||
{ throw Exception() } <v1>: {<: (String) -> Nothing} NEW: r({ throw Exception() }) -> <v1>
|
||||
let { throw Exception() } !<v2>: *
|
||||
fn()?.let { throw Exception() } !<v2>: * COPY
|
||||
let { throw Exception() } <v2>: AND{Boolean, String} NEW: call(let { throw Exception() }, let|<v0>, <v1>) -> <v2>
|
||||
fn()?.let { throw Exception() } <v2>: AND{Boolean, String} COPY
|
||||
"unreachable?" <v3>: String NEW: r("unreachable?") -> <v3>
|
||||
fn()?.let { throw Exception() } ?: "unreachable?" <v4>: String NEW: merge(fn()?.let { throw Exception() } ?: "unreachable?"|!<v2>, <v3>) -> <v4>
|
||||
fn()?.let { throw Exception() } ?: "unreachable?" <v4>: String NEW: merge(fn()?.let { throw Exception() } ?: "unreachable?"|<v2>, <v3>) -> <v4>
|
||||
x <v5>: String NEW: r(x) -> <v5>
|
||||
return x !<v6>: *
|
||||
{ val x = fn()?.let { throw Exception() } ?: "unreachable?" return x } !<v6>: * COPY
|
||||
@@ -48,10 +48,10 @@ return ""
|
||||
fn() ?: return "" <v3>: String NEW: merge(fn() ?: return ""|<v0>, !<v2>) -> <v3>
|
||||
x <v4>: String NEW: r(x) -> <v4>
|
||||
{ throw Exception() } <v5>: {<: (String) -> Nothing} NEW: r({ throw Exception() }) -> <v5>
|
||||
let { throw Exception() } !<v6>: *
|
||||
x?.let { throw Exception() } !<v6>: * COPY
|
||||
let { throw Exception() } <v6>: AND{Boolean, String} NEW: call(let { throw Exception() }, let|<v4>, <v5>) -> <v6>
|
||||
x?.let { throw Exception() } <v6>: AND{Boolean, String} COPY
|
||||
"unreachable" <v7>: String NEW: r("unreachable") -> <v7>
|
||||
x?.let { throw Exception() } ?: "unreachable" <v8>: String NEW: merge(x?.let { throw Exception() } ?: "unreachable"|!<v6>, <v7>) -> <v8>
|
||||
x?.let { throw Exception() } ?: "unreachable" <v8>: String NEW: merge(x?.let { throw Exception() } ?: "unreachable"|<v6>, <v7>) -> <v8>
|
||||
y <v9>: String NEW: r(y) -> <v9>
|
||||
return y !<v10>: *
|
||||
{ val x = fn() ?: return "" val y = x?.let { throw Exception() } ?: "unreachable" return y } !<v10>: * COPY
|
||||
|
||||
@@ -45,14 +45,14 @@ L0:
|
||||
- call(doSomething(), doSomething|<v1>) -> <v2> PREV:[]
|
||||
- mark(bar().doSomething()) PREV:[]
|
||||
- mark(bar()) PREV:[]
|
||||
- call(bar(), bar) PREV:[]
|
||||
- call(bar(), bar) -> <v3> PREV:[]
|
||||
- jmp(error) NEXT:[<ERROR>] PREV:[]
|
||||
- mark(doSomething()) PREV:[]
|
||||
- call(doSomething(), doSomething|!<v3>) -> <v4> PREV:[]
|
||||
- call(doSomething(), doSomething|<v3>) -> <v4> PREV:[]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
=====================
|
||||
|
||||
+8
-8
@@ -13,12 +13,12 @@ fun foo() {
|
||||
bar().doSomething()
|
||||
}
|
||||
---------------------
|
||||
null <v0>: * NEW: r(null) -> <v0>
|
||||
null!! <v1>: * NEW: magic[NOT_NULL_ASSERTION](null!!|<v0>) -> <v1>
|
||||
doSomething() <v2>: * NEW: call(doSomething(), doSomething|<v1>) -> <v2>
|
||||
null!!.doSomething() <v2>: * COPY
|
||||
bar() !<v3>: *
|
||||
doSomething() <v4>: * NEW: call(doSomething(), doSomething|!<v3>) -> <v4>
|
||||
bar().doSomething() <v4>: * COPY
|
||||
{ null!!.doSomething() bar().doSomething() } <v4>: * COPY
|
||||
null <v0>: * NEW: r(null) -> <v0>
|
||||
null!! <v1>: * NEW: magic[NOT_NULL_ASSERTION](null!!|<v0>) -> <v1>
|
||||
doSomething() <v2>: * NEW: call(doSomething(), doSomething|<v1>) -> <v2>
|
||||
null!!.doSomething() <v2>: * COPY
|
||||
bar() <v3>: * NEW: call(bar(), bar) -> <v3>
|
||||
doSomething() <v4>: * NEW: call(doSomething(), doSomething|<v3>) -> <v4>
|
||||
bar().doSomething() <v4>: * COPY
|
||||
{ null!!.doSomething() bar().doSomething() } <v4>: * COPY
|
||||
=====================
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
// ISSUE: KT-47527
|
||||
// WITH_STDLIB
|
||||
|
||||
fun test_1(value: Any?): String? = value?.let { return "O" }
|
||||
fun test_2(value: Any?): String? = run {
|
||||
value?.let { return "K" }
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ""
|
||||
result += test_1(1) ?: return "fail 1"
|
||||
result += test_2(1) ?: return "fail 2"
|
||||
return result
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
fun test_1(value: Any?): String? {
|
||||
return { // BLOCK
|
||||
val tmp0_safe_receiver: Any? = value
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
|
||||
else -> tmp0_safe_receiver.let<Any, Nothing>(block = local fun <anonymous>(it: Any): Nothing {
|
||||
return "O"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun test_2(value: Any?): String? {
|
||||
return run<Nothing?>(block = local fun <anonymous>(): Nothing? {
|
||||
return { // BLOCK
|
||||
val tmp1_safe_receiver: Any? = value
|
||||
when {
|
||||
EQEQ(arg0 = tmp1_safe_receiver, arg1 = null) -> null
|
||||
else -> tmp1_safe_receiver.let<Any, Nothing>(block = local fun <anonymous>(it: Any): Nothing {
|
||||
return "K"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result: String = ""
|
||||
result = result.plus(other = { // BLOCK
|
||||
val <elvis>: String? = test_1(value = 1)
|
||||
when {
|
||||
EQEQ(arg0 = <elvis>, arg1 = null) -> return "fail 1"
|
||||
else -> <elvis>
|
||||
}
|
||||
})
|
||||
result = result.plus(other = { // BLOCK
|
||||
val <elvis>: String? = test_2(value = 1)
|
||||
when {
|
||||
EQEQ(arg0 = <elvis>, arg1 = null) -> return "fail 2"
|
||||
else -> <elvis>
|
||||
}
|
||||
})
|
||||
return result
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
FILE fqName:<root> fileName:/kt47527.kt
|
||||
FUN name:test_1 visibility:public modality:FINAL <> (value:kotlin.Any?) returnType:kotlin.String?
|
||||
VALUE_PARAMETER name:value index:0 type:kotlin.Any?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
BLOCK type=kotlin.Nothing? origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.Any? [val]
|
||||
GET_VAR 'value: kotlin.Any? declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
WHEN type=kotlin.Nothing? origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_0: kotlin.Any? [val] declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: CONST Null type=kotlin.Nothing? value=null
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: CALL 'public final fun let <T, R> (block: kotlin.Function1<T of kotlin.StandardKt.let, R of kotlin.StandardKt.let>): R of kotlin.StandardKt.let [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
<T>: kotlin.Any
|
||||
<R>: kotlin.Nothing
|
||||
$receiver: GET_VAR 'val tmp_0: kotlin.Any? [val] declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
block: FUN_EXPR type=kotlin.Function1<kotlin.Any, kotlin.Nothing> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Any) returnType:kotlin.Nothing
|
||||
VALUE_PARAMETER name:it index:0 type:kotlin.Any
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CONST String type=kotlin.String value="O"
|
||||
FUN name:test_2 visibility:public modality:FINAL <> (value:kotlin.Any?) returnType:kotlin.String?
|
||||
VALUE_PARAMETER name:value index:0 type:kotlin.Any?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CALL 'public final fun run <R> (block: kotlin.Function0<R of kotlin.StandardKt.run>): R of kotlin.StandardKt.run [inline] declared in kotlin.StandardKt' type=kotlin.Nothing? origin=null
|
||||
<R>: kotlin.Nothing?
|
||||
block: FUN_EXPR type=kotlin.Function0<kotlin.Nothing?> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Nothing?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='local final fun <anonymous> (): kotlin.Nothing? declared in <root>.test_2'
|
||||
BLOCK type=kotlin.Nothing? origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:kotlin.Any? [val]
|
||||
GET_VAR 'value: kotlin.Any? declared in <root>.test_2' type=kotlin.Any? origin=null
|
||||
WHEN type=kotlin.Nothing? origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_1: kotlin.Any? [val] declared in <root>.test_2.<anonymous>' type=kotlin.Any? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: CONST Null type=kotlin.Nothing? value=null
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: CALL 'public final fun let <T, R> (block: kotlin.Function1<T of kotlin.StandardKt.let, R of kotlin.StandardKt.let>): R of kotlin.StandardKt.let [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
<T>: kotlin.Any
|
||||
<R>: kotlin.Nothing
|
||||
$receiver: GET_VAR 'val tmp_1: kotlin.Any? [val] declared in <root>.test_2.<anonymous>' type=kotlin.Any? origin=null
|
||||
block: FUN_EXPR type=kotlin.Function1<kotlin.Any, kotlin.Nothing> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Any) returnType:kotlin.Nothing
|
||||
VALUE_PARAMETER name:it index:0 type:kotlin.Any
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CONST String type=kotlin.String value="K"
|
||||
FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||
BLOCK_BODY
|
||||
VAR name:result type:kotlin.String [var]
|
||||
CONST String type=kotlin.String value=""
|
||||
SET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.Unit origin=EQ
|
||||
CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=null
|
||||
$this: GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=null
|
||||
other: BLOCK type=kotlin.String origin=ELVIS
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.String? [val]
|
||||
CALL 'public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>' type=kotlin.String? origin=null
|
||||
value: CONST Int type=kotlin.Int value=1
|
||||
WHEN type=kotlin.String origin=ELVIS
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_2: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
CONST String type=kotlin.String value="fail 1"
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: GET_VAR 'val tmp_2: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
SET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.Unit origin=EQ
|
||||
CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=null
|
||||
$this: GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=null
|
||||
other: BLOCK type=kotlin.String origin=ELVIS
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:kotlin.String? [val]
|
||||
CALL 'public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>' type=kotlin.String? origin=null
|
||||
value: CONST Int type=kotlin.Int value=1
|
||||
WHEN type=kotlin.String origin=ELVIS
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_3: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
CONST String type=kotlin.String value="fail 2"
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: GET_VAR 'val tmp_3: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=null
|
||||
@@ -0,0 +1,14 @@
|
||||
// ISSUE: KT-47527
|
||||
// WITH_STDLIB
|
||||
|
||||
fun test_1(value: Any?): String? = value?.let { return "O" }
|
||||
fun test_2(value: Any?): String? = run {
|
||||
value?.let { return "K" }
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = ""
|
||||
result += test_1(1) ?: return "fail 1"
|
||||
result += test_2(1) ?: return "fail 2"
|
||||
return result
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
fun test_1(value: Any?): String? {
|
||||
return { // BLOCK
|
||||
val tmp0_safe_receiver: Any? = value
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
|
||||
else -> tmp0_safe_receiver.let<Any, Nothing>(block = local fun <anonymous>(it: Any): Nothing {
|
||||
return "O"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun test_2(value: Any?): String? {
|
||||
return run<Nothing?>(block = local fun <anonymous>(): Nothing? {
|
||||
return { // BLOCK
|
||||
val tmp0_safe_receiver: Any? = value
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
|
||||
else -> tmp0_safe_receiver.let<Any, Nothing>(block = local fun <anonymous>(it: Any): Nothing {
|
||||
return "K"
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result: String = ""
|
||||
result = result.plus(other = { // BLOCK
|
||||
val tmp0_elvis_lhs: String? = test_1(value = 1)
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_elvis_lhs, arg1 = null) -> return "fail 1"
|
||||
else -> tmp0_elvis_lhs
|
||||
}
|
||||
})
|
||||
result = result.plus(other = { // BLOCK
|
||||
val tmp1_elvis_lhs: String? = test_2(value = 1)
|
||||
when {
|
||||
EQEQ(arg0 = tmp1_elvis_lhs, arg1 = null) -> return "fail 2"
|
||||
else -> tmp1_elvis_lhs
|
||||
}
|
||||
})
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
FILE fqName:<root> fileName:/kt47527.kt
|
||||
FUN name:test_1 visibility:public modality:FINAL <> (value:kotlin.Any?) returnType:kotlin.String?
|
||||
VALUE_PARAMETER name:value index:0 type:kotlin.Any?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
BLOCK type=kotlin.Nothing? origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.Any? [val]
|
||||
GET_VAR 'value: kotlin.Any? declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
WHEN type=kotlin.Nothing? origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_0: kotlin.Any? [val] declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: CONST Null type=kotlin.Nothing? value=null
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: CALL 'public final fun let <T, R> (block: kotlin.Function1<T of kotlin.StandardKt.let, R of kotlin.StandardKt.let>): R of kotlin.StandardKt.let [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
<T>: kotlin.Any
|
||||
<R>: kotlin.Nothing
|
||||
$receiver: GET_VAR 'val tmp_0: kotlin.Any? [val] declared in <root>.test_1' type=kotlin.Any? origin=null
|
||||
block: FUN_EXPR type=kotlin.Function1<kotlin.Any, kotlin.Nothing> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Any) returnType:kotlin.Nothing
|
||||
VALUE_PARAMETER name:it index:0 type:kotlin.Any
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CONST String type=kotlin.String value="O"
|
||||
FUN name:test_2 visibility:public modality:FINAL <> (value:kotlin.Any?) returnType:kotlin.String?
|
||||
VALUE_PARAMETER name:value index:0 type:kotlin.Any?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CALL 'public final fun run <R> (block: kotlin.Function0<R of kotlin.StandardKt.run>): R of kotlin.StandardKt.run [inline] declared in kotlin.StandardKt' type=kotlin.Nothing? origin=null
|
||||
<R>: kotlin.Nothing?
|
||||
block: FUN_EXPR type=kotlin.Function0<kotlin.Nothing?> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Nothing?
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='local final fun <anonymous> (): kotlin.Nothing? declared in <root>.test_2'
|
||||
BLOCK type=kotlin.Nothing? origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:kotlin.Any? [val]
|
||||
GET_VAR 'value: kotlin.Any? declared in <root>.test_2' type=kotlin.Any? origin=null
|
||||
WHEN type=kotlin.Nothing? origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_1: kotlin.Any? [val] declared in <root>.test_2.<anonymous>' type=kotlin.Any? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: CONST Null type=kotlin.Nothing? value=null
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: CALL 'public final fun let <T, R> (block: kotlin.Function1<T of kotlin.StandardKt.let, R of kotlin.StandardKt.let>): R of kotlin.StandardKt.let [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
<T>: kotlin.Any
|
||||
<R>: kotlin.Nothing
|
||||
$receiver: GET_VAR 'val tmp_1: kotlin.Any? [val] declared in <root>.test_2.<anonymous>' type=kotlin.Any? origin=null
|
||||
block: FUN_EXPR type=kotlin.Function1<kotlin.Any, kotlin.Nothing> origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.Any) returnType:kotlin.Nothing
|
||||
VALUE_PARAMETER name:it index:0 type:kotlin.Any
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>'
|
||||
CONST String type=kotlin.String value="K"
|
||||
FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||
BLOCK_BODY
|
||||
VAR name:result type:kotlin.String [var]
|
||||
CONST String type=kotlin.String value=""
|
||||
SET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.Unit origin=PLUSEQ
|
||||
CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=PLUSEQ
|
||||
$this: GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=PLUSEQ
|
||||
other: BLOCK type=kotlin.String origin=ELVIS
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.String? [val]
|
||||
CALL 'public final fun test_1 (value: kotlin.Any?): kotlin.String? declared in <root>' type=kotlin.String? origin=null
|
||||
value: CONST Int type=kotlin.Int value=1
|
||||
WHEN type=kotlin.String origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_2: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
CONST String type=kotlin.String value="fail 1"
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: GET_VAR 'val tmp_2: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
SET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.Unit origin=PLUSEQ
|
||||
CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=PLUSEQ
|
||||
$this: GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=PLUSEQ
|
||||
other: BLOCK type=kotlin.String origin=ELVIS
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:kotlin.String? [val]
|
||||
CALL 'public final fun test_2 (value: kotlin.Any?): kotlin.String? declared in <root>' type=kotlin.String? origin=null
|
||||
value: CONST Int type=kotlin.Int value=1
|
||||
WHEN type=kotlin.String origin=null
|
||||
BRANCH
|
||||
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'val tmp_3: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
CONST String type=kotlin.String value="fail 2"
|
||||
BRANCH
|
||||
if: CONST Boolean type=kotlin.Boolean value=true
|
||||
then: GET_VAR 'val tmp_3: kotlin.String? [val] declared in <root>.box' type=kotlin.String? origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
GET_VAR 'var result: kotlin.String [var] declared in <root>.box' type=kotlin.String origin=null
|
||||
@@ -1,11 +0,0 @@
|
||||
fun <R : Number> Number.convert(): R {
|
||||
return TODO()
|
||||
}
|
||||
|
||||
fun foo(arg: Number) {
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val x: Int = 0
|
||||
foo(arg = x.convert<Number>())
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
FILE fqName:<root> fileName:/argumentMappedWithError.kt
|
||||
FUN name:convert visibility:public modality:FINAL <R> ($receiver:kotlin.Number) returnType:R of <root>.convert
|
||||
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Number]
|
||||
$receiver: VALUE_PARAMETER name:<this> type:kotlin.Number
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun convert <R> (): R of <root>.convert declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:foo visibility:public modality:FINAL <> (arg:kotlin.Number) returnType:kotlin.Unit
|
||||
VALUE_PARAMETER name:arg index:0 type:kotlin.Number
|
||||
BLOCK_BODY
|
||||
FUN name:main visibility:public modality:FINAL <> (args:kotlin.Array<kotlin.String>) returnType:kotlin.Unit
|
||||
VALUE_PARAMETER name:args index:0 type:kotlin.Array<kotlin.String>
|
||||
BLOCK_BODY
|
||||
VAR name:x type:kotlin.Int [val]
|
||||
CONST Int type=kotlin.Int value=0
|
||||
CALL 'public final fun foo (arg: kotlin.Number): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
|
||||
arg: CALL 'public final fun convert <R> (): R of <root>.convert declared in <root>' type=kotlin.Number origin=null
|
||||
<R>: kotlin.Number
|
||||
$receiver: GET_VAR 'val x: kotlin.Int [val] declared in <root>.main' type=kotlin.Int origin=null
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
fun <R : Number> Number.convert(): R = TODO()
|
||||
|
||||
fun foo(arg: Number) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fun <R : Number> Number.convert(): R {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
fun foo(arg: Number) {
|
||||
|
||||
@@ -3,7 +3,8 @@ FILE fqName:<root> fileName:/argumentMappedWithError.kt
|
||||
TYPE_PARAMETER name:R index:0 variance: superTypes:[kotlin.Number]
|
||||
$receiver: VALUE_PARAMETER name:<this> type:kotlin.Number
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun convert <R> (): R of <root>.convert declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:foo visibility:public modality:FINAL <> (arg:kotlin.Number) returnType:kotlin.Unit
|
||||
VALUE_PARAMETER name:arg index:0 type:kotlin.Number
|
||||
BLOCK_BODY
|
||||
|
||||
@@ -18,7 +18,7 @@ fun bar(s: String?, t: String?): String {
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
|
||||
else -> tmp0_safe_receiver.let<String, Nothing?>(block = local fun <anonymous>(it: String): Nothing? {
|
||||
{ // BLOCK
|
||||
return { // BLOCK
|
||||
val tmp0_safe_receiver: String? = t
|
||||
when {
|
||||
EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null
|
||||
@@ -27,7 +27,7 @@ fun bar(s: String?, t: String?): String {
|
||||
}
|
||||
)
|
||||
}
|
||||
} /*~> Unit */
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ FILE fqName:<root> fileName:/SafeLetWithReturn.kt
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:kotlin.String) returnType:kotlin.Nothing?
|
||||
VALUE_PARAMETER name:it index:0 type:kotlin.String
|
||||
BLOCK_BODY
|
||||
TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: kotlin.String): kotlin.Nothing? declared in <root>.bar'
|
||||
BLOCK type=kotlin.Nothing? origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:kotlin.String? [val]
|
||||
GET_VAR 't: kotlin.String? declared in <root>.bar' type=kotlin.String? origin=null
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
fun box(): String {
|
||||
val map: MutableMap<Fun, String> = mutableMapOf<Fun, String>()
|
||||
val fn: Fun = local fun <anonymous>(it: @FlexibleNullability String?): @FlexibleNullability String? {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
/*-> Fun */
|
||||
return map.computeIfAbsent(p0 = fn, p1 = local fun <anonymous>(it: @EnhancedNullability Fun): @EnhancedNullability String {
|
||||
|
||||
+2
-1
@@ -11,7 +11,8 @@ FILE fqName:<root> fileName:/test.kt
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:@[FlexibleNullability] kotlin.String?) returnType:@[FlexibleNullability] kotlin.String?
|
||||
VALUE_PARAMETER name:it index:0 type:@[FlexibleNullability] kotlin.String?
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in <root>.box'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String
|
||||
CALL 'public open fun computeIfAbsent (p0: @[EnhancedNullability] K of kotlin.collections.MutableMap, p1: @[EnhancedNullability] java.util.function.Function<in @[EnhancedNullability] K of kotlin.collections.MutableMap, out @[EnhancedNullability] V of kotlin.collections.MutableMap>): @[EnhancedNullability] V of kotlin.collections.MutableMap declared in kotlin.collections.MutableMap' type=@[EnhancedNullability] kotlin.String origin=null
|
||||
|
||||
@@ -3,7 +3,7 @@ interface CPointed {
|
||||
}
|
||||
|
||||
inline fun <reified T : CPointed> CPointed.reinterpret(): T {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
class CInt32VarX<T : Any?> : CPointed {
|
||||
@@ -18,7 +18,7 @@ class CInt32VarX<T : Any?> : CPointed {
|
||||
typealias CInt32Var = CInt32VarX<Int>
|
||||
var <T_INT : Int> CInt32VarX<T_INT>.value: T_INT
|
||||
get(): T_INT {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
set(value: T_INT) {
|
||||
}
|
||||
|
||||
@@ -18,7 +18,8 @@ FILE fqName:<root> fileName:/integerCoercionToT.kt
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[<root>.CPointed]
|
||||
$receiver: VALUE_PARAMETER name:<this> type:<root>.CPointed
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun reinterpret <T> (): T of <root>.reinterpret [inline] declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
CLASS CLASS name:CInt32VarX modality:FINAL visibility:public superTypes:[<root>.CPointed]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.CInt32VarX<T of <root>.CInt32VarX>
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
|
||||
@@ -46,7 +47,8 @@ FILE fqName:<root> fileName:/integerCoercionToT.kt
|
||||
TYPE_PARAMETER name:T_INT index:0 variance: superTypes:[kotlin.Int]
|
||||
$receiver: VALUE_PARAMETER name:<this> type:<root>.CInt32VarX<T_INT of <root>.<get-value>>
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun <get-value> <T_INT> (): T_INT of <root>.<get-value> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:<set-value> visibility:public modality:FINAL <T_INT> ($receiver:<root>.CInt32VarX<T_INT of <root>.<set-value>>, value:T_INT of <root>.<set-value>) returnType:kotlin.Unit
|
||||
correspondingProperty: PROPERTY name:value visibility:public modality:FINAL [var]
|
||||
TYPE_PARAMETER name:T_INT index:0 variance: superTypes:[kotlin.Int]
|
||||
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
fun <X : Any?, Y : Any?> foo(): Function1<X, Y> {
|
||||
return TODO()
|
||||
}
|
||||
|
||||
interface Inv2<A : Any?, B : Any?> {
|
||||
|
||||
}
|
||||
|
||||
fun <T : Any?, R : Any?> check(x: T, y: R, f: Function1<T, R>): Inv2<T, R> {
|
||||
return TODO()
|
||||
}
|
||||
|
||||
fun test(): Inv2<String, Int> {
|
||||
return check<String, Int>(x = "", y = 1, f = foo<String, Int>())
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val x: Inv2<String, Int> = test()
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
FILE fqName:<root> fileName:/fixationOrder1.kt
|
||||
FUN name:foo visibility:public modality:FINAL <X, Y> () returnType:kotlin.Function1<X of <root>.foo, Y of <root>.foo>
|
||||
TYPE_PARAMETER name:X index:0 variance: superTypes:[kotlin.Any?]
|
||||
TYPE_PARAMETER name:Y index:1 variance: superTypes:[kotlin.Any?]
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun foo <X, Y> (): kotlin.Function1<X of <root>.foo, Y of <root>.foo> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
CLASS INTERFACE name:Inv2 modality:ABSTRACT visibility:public superTypes:[kotlin.Any]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Inv2<A of <root>.Inv2, B of <root>.Inv2>
|
||||
TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?]
|
||||
TYPE_PARAMETER name:B index:1 variance: superTypes:[kotlin.Any?]
|
||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||
overridden:
|
||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
|
||||
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
|
||||
overridden:
|
||||
public open fun hashCode (): kotlin.Int declared in kotlin.Any
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
|
||||
overridden:
|
||||
public open fun toString (): kotlin.String declared in kotlin.Any
|
||||
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
|
||||
FUN name:check visibility:public modality:FINAL <T, R> (x:T of <root>.check, y:R of <root>.check, f:kotlin.Function1<T of <root>.check, R of <root>.check>) returnType:<root>.Inv2<T of <root>.check, R of <root>.check>
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
|
||||
TYPE_PARAMETER name:R index:1 variance: superTypes:[kotlin.Any?]
|
||||
VALUE_PARAMETER name:x index:0 type:T of <root>.check
|
||||
VALUE_PARAMETER name:y index:1 type:R of <root>.check
|
||||
VALUE_PARAMETER name:f index:2 type:kotlin.Function1<T of <root>.check, R of <root>.check>
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun check <T, R> (x: T of <root>.check, y: R of <root>.check, f: kotlin.Function1<T of <root>.check, R of <root>.check>): <root>.Inv2<T of <root>.check, R of <root>.check> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:test visibility:public modality:FINAL <> () returnType:<root>.Inv2<kotlin.String, kotlin.Int>
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test (): <root>.Inv2<kotlin.String, kotlin.Int> declared in <root>'
|
||||
CALL 'public final fun check <T, R> (x: T of <root>.check, y: R of <root>.check, f: kotlin.Function1<T of <root>.check, R of <root>.check>): <root>.Inv2<T of <root>.check, R of <root>.check> declared in <root>' type=<root>.Inv2<kotlin.String, kotlin.Int> origin=null
|
||||
<T>: kotlin.String
|
||||
<R>: kotlin.Int
|
||||
x: CONST String type=kotlin.String value=""
|
||||
y: CONST Int type=kotlin.Int value=1
|
||||
f: CALL 'public final fun foo <X, Y> (): kotlin.Function1<X of <root>.foo, Y of <root>.foo> declared in <root>' type=kotlin.Function1<kotlin.String, kotlin.Int> origin=null
|
||||
<X>: kotlin.String
|
||||
<Y>: kotlin.Int
|
||||
FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String
|
||||
BLOCK_BODY
|
||||
VAR name:x type:<root>.Inv2<kotlin.String, kotlin.Int> [val]
|
||||
CALL 'public final fun test (): <root>.Inv2<kotlin.String, kotlin.Int> declared in <root>' type=<root>.Inv2<kotlin.String, kotlin.Int> origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
|
||||
CONST String type=kotlin.String value="OK"
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
fun <X, Y> foo(): (X) -> Y = TODO()
|
||||
|
||||
interface Inv2<A, B>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fun <X : Any?, Y : Any?> foo(): Function1<X, Y> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
interface Inv2<A : Any?, B : Any?> {
|
||||
@@ -7,7 +7,7 @@ interface Inv2<A : Any?, B : Any?> {
|
||||
}
|
||||
|
||||
fun <T : Any?, R : Any?> check(x: T, y: R, f: Function1<T, R>): Inv2<T, R> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
fun test(): Inv2<String, Int> {
|
||||
|
||||
@@ -3,7 +3,8 @@ FILE fqName:<root> fileName:/fixationOrder1.kt
|
||||
TYPE_PARAMETER name:X index:0 variance: superTypes:[kotlin.Any?]
|
||||
TYPE_PARAMETER name:Y index:1 variance: superTypes:[kotlin.Any?]
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun foo <X, Y> (): kotlin.Function1<X of <root>.foo, Y of <root>.foo> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
CLASS INTERFACE name:Inv2 modality:ABSTRACT visibility:public superTypes:[kotlin.Any]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Inv2<A of <root>.Inv2, B of <root>.Inv2>
|
||||
TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?]
|
||||
@@ -28,7 +29,8 @@ FILE fqName:<root> fileName:/fixationOrder1.kt
|
||||
VALUE_PARAMETER name:y index:1 type:R of <root>.check
|
||||
VALUE_PARAMETER name:f index:2 type:kotlin.Function1<T of <root>.check, R of <root>.check>
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun check <T, R> (x: T of <root>.check, y: R of <root>.check, f: kotlin.Function1<T of <root>.check, R of <root>.check>): <root>.Inv2<T of <root>.check, R of <root>.check> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:test visibility:public modality:FINAL <> () returnType:<root>.Inv2<kotlin.String, kotlin.Int>
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun test (): <root>.Inv2<kotlin.String, kotlin.Int> declared in <root>'
|
||||
|
||||
@@ -23,7 +23,7 @@ suspend fun <T : Any?> FlowCollector<T>.invokeSafely(action: @ExtensionFunctionT
|
||||
|
||||
@OptIn(markerClass = [ExperimentalTypeInference::class])
|
||||
inline fun <T : Any?> unsafeFlow(@BuilderInference crossinline block: @ExtensionFunctionType SuspendFunction1<FlowCollector<T>, Unit>): Flow<T> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
@Deprecated(message = "binary compatibility with a version w/o FlowCollector receiver", level = DeprecationLevel.HIDDEN)
|
||||
@@ -85,12 +85,12 @@ class SafeCollector<T : Any?> : FlowCollector<T> {
|
||||
|
||||
@OptIn(markerClass = [ExperimentalTypeInference::class])
|
||||
fun <T : Any?> flow(@BuilderInference block: @ExtensionFunctionType SuspendFunction1<FlowCollector<T>, Unit>): Flow<T> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
@OptIn(markerClass = [ExperimentalTypeInference::class])
|
||||
suspend fun <R : Any?> flowScope(@BuilderInference block: @ExtensionFunctionType SuspendFunction1<CoroutineScope, R>): R {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
suspend inline fun <T : Any?> Flow<T>.collect(crossinline action: SuspendFunction1<@ParameterName(name = "value") T, Unit>) {
|
||||
@@ -128,7 +128,7 @@ interface ReceiveChannel<out E : Any?> {
|
||||
|
||||
@OptIn(markerClass = [ExperimentalTypeInference::class])
|
||||
fun <E : Any?> CoroutineScope.produce(@BuilderInference block: @ExtensionFunctionType SuspendFunction1<ProducerScope<E>, Unit>): ReceiveChannel<E> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
interface ProducerScope<in E : Any?> : CoroutineScope, SendChannel<E> {
|
||||
|
||||
@@ -59,7 +59,8 @@ FILE fqName:<root> fileName:/castsInsideCoroutineInference.kt
|
||||
annotations:
|
||||
BuilderInference
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun unsafeFlow <T> (block: @[ExtensionFunctionType] kotlin.coroutines.SuspendFunction1<<root>.FlowCollector<T of <root>.unsafeFlow>, kotlin.Unit>): <root>.Flow<T of <root>.unsafeFlow> [inline] declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:onCompletion visibility:public modality:FINAL <T> ($receiver:<root>.Flow<T of <root>.onCompletion>, action:kotlin.coroutines.SuspendFunction1<@[ParameterName(name = 'cause')] kotlin.Throwable?, kotlin.Unit>) returnType:<root>.Flow<T of <root>.onCompletion>
|
||||
annotations:
|
||||
Deprecated(message = 'binary compatibility with a version w/o FlowCollector receiver', replaceWith = <null>, level = GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:HIDDEN' type=kotlin.DeprecationLevel)
|
||||
@@ -198,7 +199,8 @@ FILE fqName:<root> fileName:/castsInsideCoroutineInference.kt
|
||||
annotations:
|
||||
BuilderInference
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun flow <T> (block: @[ExtensionFunctionType] kotlin.coroutines.SuspendFunction1<<root>.FlowCollector<T of <root>.flow>, kotlin.Unit>): <root>.Flow<T of <root>.flow> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:flowScope visibility:public modality:FINAL <R> (block:@[ExtensionFunctionType] kotlin.coroutines.SuspendFunction1<<root>.CoroutineScope, R of <root>.flowScope>) returnType:R of <root>.flowScope [suspend]
|
||||
annotations:
|
||||
OptIn(markerClass = [CLASS_REFERENCE 'CLASS IR_EXTERNAL_DECLARATION_STUB ANNOTATION_CLASS name:ExperimentalTypeInference modality:FINAL visibility:public superTypes:[kotlin.Annotation]' type=kotlin.reflect.KClass<kotlin.experimental.ExperimentalTypeInference>])
|
||||
@@ -207,7 +209,8 @@ FILE fqName:<root> fileName:/castsInsideCoroutineInference.kt
|
||||
annotations:
|
||||
BuilderInference
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun flowScope <R> (block: @[ExtensionFunctionType] kotlin.coroutines.SuspendFunction1<<root>.CoroutineScope, R of <root>.flowScope>): R of <root>.flowScope [suspend] declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:collect visibility:public modality:FINAL <T> ($receiver:<root>.Flow<T of <root>.collect>, action:kotlin.coroutines.SuspendFunction1<@[ParameterName(name = 'value')] T of <root>.collect, kotlin.Unit>) returnType:kotlin.Unit [inline,suspend]
|
||||
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?]
|
||||
$receiver: VALUE_PARAMETER name:<this> type:<root>.Flow<T of <root>.collect>
|
||||
@@ -315,7 +318,8 @@ FILE fqName:<root> fileName:/castsInsideCoroutineInference.kt
|
||||
annotations:
|
||||
BuilderInference
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public final fun produce <E> (block: @[ExtensionFunctionType] kotlin.coroutines.SuspendFunction1<<root>.ProducerScope<E of <root>.produce>, kotlin.Unit>): <root>.ReceiveChannel<E of <root>.produce> declared in <root>'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
CLASS INTERFACE name:ProducerScope modality:ABSTRACT visibility:public superTypes:[<root>.CoroutineScope; <root>.SendChannel<E of <root>.ProducerScope>]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.ProducerScope<E of <root>.ProducerScope>
|
||||
TYPE_PARAMETER name:E index:0 variance:in superTypes:[kotlin.Any?]
|
||||
|
||||
+5
-5
@@ -10,23 +10,23 @@ class MySet : Set<String> {
|
||||
|
||||
override val size: Int
|
||||
override get(): Int {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
override operator fun contains(element: String): Boolean {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
override fun containsAll(elements: Collection<String>): Boolean {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
override fun isEmpty(): Boolean {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
override operator fun iterator(): Iterator<String> {
|
||||
TODO()
|
||||
return TODO()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+10
-5
@@ -17,33 +17,38 @@ FILE fqName:<root> fileName:/implicitNotNullOnPlatformType.kt
|
||||
public abstract fun <get-size> (): kotlin.Int declared in kotlin.collections.Set
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.MySet
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public open fun <get-size> (): kotlin.Int declared in <root>.MySet'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:contains visibility:public modality:OPEN <> ($this:<root>.MySet, element:kotlin.String) returnType:kotlin.Boolean [operator]
|
||||
overridden:
|
||||
public abstract fun contains (element: E of kotlin.collections.Set): kotlin.Boolean [operator] declared in kotlin.collections.Set
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.MySet
|
||||
VALUE_PARAMETER name:element index:0 type:kotlin.String
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public open fun contains (element: kotlin.String): kotlin.Boolean [operator] declared in <root>.MySet'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:containsAll visibility:public modality:OPEN <> ($this:<root>.MySet, elements:kotlin.collections.Collection<kotlin.String>) returnType:kotlin.Boolean
|
||||
overridden:
|
||||
public abstract fun containsAll (elements: kotlin.collections.Collection<E of kotlin.collections.Set>): kotlin.Boolean declared in kotlin.collections.Set
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.MySet
|
||||
VALUE_PARAMETER name:elements index:0 type:kotlin.collections.Collection<kotlin.String>
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public open fun containsAll (elements: kotlin.collections.Collection<kotlin.String>): kotlin.Boolean declared in <root>.MySet'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:isEmpty visibility:public modality:OPEN <> ($this:<root>.MySet) returnType:kotlin.Boolean
|
||||
overridden:
|
||||
public abstract fun isEmpty (): kotlin.Boolean declared in kotlin.collections.Set
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.MySet
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public open fun isEmpty (): kotlin.Boolean declared in <root>.MySet'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN name:iterator visibility:public modality:OPEN <> ($this:<root>.MySet) returnType:kotlin.collections.Iterator<kotlin.String> [operator]
|
||||
overridden:
|
||||
public abstract fun iterator (): kotlin.collections.Iterator<E of kotlin.collections.Set> [operator] declared in kotlin.collections.Set
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.MySet
|
||||
BLOCK_BODY
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
RETURN type=kotlin.Nothing from='public open fun iterator (): kotlin.collections.Iterator<kotlin.String> [operator] declared in <root>.MySet'
|
||||
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
|
||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||
overridden:
|
||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.Set
|
||||
|
||||
+6
@@ -16334,6 +16334,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
|
||||
+6
@@ -16364,6 +16364,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
|
||||
Generated
+6
@@ -458,6 +458,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt45308.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt47527.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("localClassWithOverrides.kt")
|
||||
public void testLocalClassWithOverrides() throws Exception {
|
||||
|
||||
+5
@@ -13470,6 +13470,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt785.kt");
|
||||
|
||||
@@ -355,6 +355,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt45308.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("localClassWithOverrides.kt")
|
||||
public void testLocalClassWithOverrides() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/localClassWithOverrides.kt");
|
||||
|
||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
Generated
+5
@@ -11869,6 +11869,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt785.kt");
|
||||
|
||||
Generated
+5
@@ -11275,6 +11275,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt785.kt");
|
||||
|
||||
Generated
+5
@@ -11275,6 +11275,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt785.kt");
|
||||
|
||||
js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java
Generated
+5
@@ -5765,6 +5765,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
||||
runTest("compiler/testData/codegen/box/functions/kt47449.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt47527.kt")
|
||||
public void testKt47527() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt47527.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt785.kt")
|
||||
public void testKt785() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/functions/kt785.kt");
|
||||
|
||||
Reference in New Issue
Block a user