[Test] Reproduce KT-63414, KT-64500 and KT-64501

This commit is contained in:
Dmitriy Novozhilov
2023-12-21 10:57:06 +02:00
committed by Space Team
parent 3346cc4b19
commit 6031f80e01
10 changed files with 514 additions and 0 deletions
@@ -0,0 +1,76 @@
FILE: infiniteLoop.kt
public final fun getCondition(): R|kotlin/Boolean| {
^getCondition Boolean(true)
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final fun test_1(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, AT_LEAST_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.AT_LEAST_ONCE|)
}
)
}
while(Boolean(true)) {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final fun test_2(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, AT_LEAST_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.AT_LEAST_ONCE|)
}
)
}
do {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
while(Boolean(true))
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final fun test_3(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, AT_LEAST_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.AT_LEAST_ONCE|)
}
)
}
while(R|/getCondition|()) {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final fun test_4(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, AT_LEAST_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.AT_LEAST_ONCE|)
}
)
}
do {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
while(R|/getCondition|())
}
@@ -0,0 +1,37 @@
// ISSUE: KT-64500
import kotlin.contracts.*
fun getCondition(): Boolean = true
@OptIn(ExperimentalContracts::class)
fun test_1(f: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.AT_LEAST_ONCE) }<!>
while (true) {
f()
}
}
@OptIn(ExperimentalContracts::class)
fun test_2(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.AT_LEAST_ONCE) }
do {
f()
} while (true)
}
@OptIn(ExperimentalContracts::class)
fun test_3(f: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.AT_LEAST_ONCE) }<!>
while (getCondition()) {
f()
}
}
@OptIn(ExperimentalContracts::class)
fun test_4(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.AT_LEAST_ONCE) }
do {
f()
} while (getCondition())
}
@@ -0,0 +1,46 @@
FILE: namedArgument.kt
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun myRun(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_1(g: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(g, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/g|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
R|/myRun|(f = R|<local>/g|)
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_2(g: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(g, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/g|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
R|/myRun|(R|<local>/g|)
}
@@ -0,0 +1,20 @@
// ISSUE: KT-64501
import kotlin.contracts.*
@OptIn(ExperimentalContracts::class)
inline fun myRun(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }
f()
}
@OptIn(ExperimentalContracts::class)
inline fun test_1(g: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(g, InvocationKind.EXACTLY_ONCE) }<!>
myRun(f = g)
}
@OptIn(ExperimentalContracts::class)
inline fun test_2(g: () -> Unit) {
contract { callsInPlace(g, InvocationKind.EXACTLY_ONCE) }
myRun(g)
}
@@ -0,0 +1,174 @@
FILE: tryFinally.kt
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_1(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
finally {
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_2(f: R|() -> kotlin/Int|): R|kotlin/Int|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Int|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
^test_2 R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|()
}
finally {
R|kotlin/io/println|()
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_3(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_4(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
throw R|java/lang/Exception.Exception|()
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_5(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
throw R|java/lang/Exception.Exception|()
}
finally {
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_6(f: R|() -> kotlin/Int|): R|kotlin/Int|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Int|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
^test_6 R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
throw R|java/lang/Exception.Exception|()
}
finally {
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_7(f: R|() -> kotlin/Unit|): R|kotlin/Unit|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Unit|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
}
finally {
}
}
@R|kotlin/OptIn|(markerClass = vararg(<getClass>(Q|kotlin/contracts/ExperimentalContracts|))) public final inline fun test_8(f: R|() -> kotlin/Int|): R|kotlin/Int|
[R|Contract description]
<
CallsInPlace(f, EXACTLY_ONCE)
>
{
{
R|kotlin/contracts/contract|(<L> = contract@fun R|kotlin/contracts/ContractBuilder|.<anonymous>(): R|kotlin/Unit| <inline=Inline, kind=UNKNOWN> {
this@R|special/anonymous|.R|kotlin/contracts/ContractBuilder.callsInPlace|<R|kotlin/Int|>(R|<local>/f|, Q|kotlin/contracts/InvocationKind|.R|kotlin/contracts/InvocationKind.EXACTLY_ONCE|)
}
)
}
try {
^test_8 R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|()
}
catch (<unused var>: R|kotlin/Exception|) {
^test_8 Int(1)
}
finally {
}
}
@@ -0,0 +1,89 @@
// ISSUE: KT-63414
import kotlin.contracts.*
@OptIn(ExperimentalContracts::class)
inline fun test_1(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) } // should be ok
try {
f()
} finally {
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_2(f: () -> Int): Int {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }<!> // should be ok
try {
return f()
} finally {
println()
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_3(f: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }<!> // should be error
try {
f()
} catch (_: Exception) {
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_4(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) } // should be ok
try {
f()
} catch (_: Exception) {
throw Exception()
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_5(f: () -> Unit) {
contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) } // should be ok
try {
f()
} catch (_: Exception) {
throw Exception()
} finally {
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_6(f: () -> Int): Int {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }<!> // should be ok
try {
return f()
} catch (_: Exception) {
throw Exception()
} finally {
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_7(f: () -> Unit) {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }<!> // should be error
try {
f()
} catch (_: Exception) {
} finally {
}
}
@OptIn(ExperimentalContracts::class)
inline fun test_8(f: () -> Int): Int {
<!WRONG_INVOCATION_KIND!>contract { callsInPlace(f, InvocationKind.EXACTLY_ONCE) }<!> // should be error
try {
return f()
} catch (_: Exception) {
return 1
} finally {
}
}