diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java index 65e2f3e7ef5..dac2a567365 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.calls.checkers; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; @@ -114,6 +115,18 @@ class InlineChecker implements CallChecker { } } + if (parent != null) { + //UGLY HACK + //check there is no casts + PsiElement current = expression; + while (current != parent) { + if (current instanceof KtBinaryExpressionWithTypeRHS) { + return false; + } + current = current.getParent(); + } + } + return parent != null; } diff --git a/compiler/testData/diagnostics/tests/inline/isCheck.kt b/compiler/testData/diagnostics/tests/inline/isCheck.kt new file mode 100644 index 00000000000..9aab3d5c8bf --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/isCheck.kt @@ -0,0 +1,10 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION +inline public fun reg(converter: (Any) -> Any, flag: Boolean) { + flag + converter("") +} + +public inline fun register(converter: (Any) -> Any) { + converter is (Any) -> Any + reg(converter, converter is (Any) -> Any) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/isCheck.txt b/compiler/testData/diagnostics/tests/inline/isCheck.txt new file mode 100644 index 00000000000..d454837a7ee --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/isCheck.txt @@ -0,0 +1,4 @@ +package + +public inline fun reg(/*0*/ converter: (kotlin.Any) -> kotlin.Any, /*1*/ flag: kotlin.Boolean): kotlin.Unit +public inline fun register(/*0*/ converter: (kotlin.Any) -> kotlin.Any): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inline/lambdaCast.kt b/compiler/testData/diagnostics/tests/inline/lambdaCast.kt new file mode 100644 index 00000000000..128d406d7a1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/lambdaCast.kt @@ -0,0 +1,9 @@ +// !DIAGNOSTICS: -UNCHECKED_CAST -USELESS_CAST +inline public fun reg(convertFunc: (Any) -> Any) { + convertFunc("") +} + +public inline fun register(converter: (T) -> R) { + converter as (Any) -> Any + reg(converter as (Any) -> Any) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/lambdaCast.txt b/compiler/testData/diagnostics/tests/inline/lambdaCast.txt new file mode 100644 index 00000000000..f3abbcbd49a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/lambdaCast.txt @@ -0,0 +1,4 @@ +package + +public inline fun reg(/*0*/ convertFunc: (kotlin.Any) -> kotlin.Any): kotlin.Unit +public inline fun register(/*0*/ converter: (T) -> R): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inline/stringTemplate.kt b/compiler/testData/diagnostics/tests/inline/stringTemplate.kt new file mode 100644 index 00000000000..c7a89195617 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/stringTemplate.kt @@ -0,0 +1,10 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION +inline public fun reg(converter: (Any) -> Any, str: String) { + str + converter("") +} + +public inline fun register(converter: (Any) -> Any) { + "123$converter" + reg(converter, "123$converter") +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/stringTemplate.txt b/compiler/testData/diagnostics/tests/inline/stringTemplate.txt new file mode 100644 index 00000000000..76bda65ea5d --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/stringTemplate.txt @@ -0,0 +1,4 @@ +package + +public inline fun reg(/*0*/ converter: (kotlin.Any) -> kotlin.Any, /*1*/ str: kotlin.String): kotlin.Unit +public inline fun register(/*0*/ converter: (kotlin.Any) -> kotlin.Any): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inline/when.kt b/compiler/testData/diagnostics/tests/inline/when.kt new file mode 100644 index 00000000000..43853c94bc0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/when.kt @@ -0,0 +1,11 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION +inline public fun reg(converter: (Any) -> Any) { + converter("") +} + +public inline fun register(converter: (Any) -> Any) { + reg(when(converter) { + is (Any) -> Any -> converter + else -> converter + }) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/when.txt b/compiler/testData/diagnostics/tests/inline/when.txt new file mode 100644 index 00000000000..26da29deaf9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/when.txt @@ -0,0 +1,4 @@ +package + +public inline fun reg(/*0*/ converter: (kotlin.Any) -> kotlin.Any): kotlin.Unit +public inline fun register(/*0*/ converter: (kotlin.Any) -> kotlin.Any): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 73efae6e7e7..c28c695f727 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -8310,6 +8310,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("isCheck.kt") + public void testIsCheck() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/isCheck.kt"); + doTest(fileName); + } + @TestMetadata("kt4869.kt") public void testKt4869() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/kt4869.kt"); @@ -8322,6 +8328,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("lambdaCast.kt") + public void testLambdaCast() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/lambdaCast.kt"); + doTest(fileName); + } + @TestMetadata("localFun.kt") public void testLocalFun() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/localFun.kt"); @@ -8382,6 +8394,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("stringTemplate.kt") + public void testStringTemplate() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/stringTemplate.kt"); + doTest(fileName); + } + @TestMetadata("unsupportedConstruction.kt") public void testUnsupportedConstruction() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/unsupportedConstruction.kt"); @@ -8394,6 +8412,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("when.kt") + public void testWhen() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/when.kt"); + doTest(fileName); + } + @TestMetadata("wrongUsage.kt") public void testWrongUsage() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/wrongUsage.kt");