diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.kt b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.kt new file mode 100644 index 00000000000..cd3cb396769 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.kt @@ -0,0 +1,17 @@ +// !LANGUAGE: +AllowContractsForCustomFunctions +UseReturnsEffect +// !USE_EXPERIMENTAL: kotlin.contracts.ExperimentalContracts + +import kotlin.contracts.* + +fun Any.nullWhenString(): Any? { + contract { + returns(null) implies (this@nullWhenString is String) + } + return if (this is String) null else this +} + +fun test(x: Int?) { + if (x?.nullWhenString() == null) { + x.length + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.txt b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.txt new file mode 100644 index 00000000000..a6928c4979b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.txt @@ -0,0 +1,5 @@ +package + +public fun test(/*0*/ x: kotlin.Int?): kotlin.Unit +public fun kotlin.Any.nullWhenString(): kotlin.Any? + Returns(NULL) -> is String diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 2bfb740e8fc..b86188806f9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -1286,6 +1286,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/receiver.kt"); } + @TestMetadata("safecallAndReturnsNull.kt") + public void testSafecallAndReturnsNull() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.kt"); + } + @TestMetadata("throwsEffect.kt") public void testThrowsEffect() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/throwsEffect.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index d186009de0b..cdb624420a6 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -1286,6 +1286,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/receiver.kt"); } + @TestMetadata("safecallAndReturnsNull.kt") + public void testSafecallAndReturnsNull() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/safecallAndReturnsNull.kt"); + } + @TestMetadata("throwsEffect.kt") public void testThrowsEffect() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/contracts/smartcasts/throwsEffect.kt");