From 02be1063c1e28a3b0da45007fbfb1359676d02b9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 20 Nov 2014 12:39:48 +0400 Subject: [PATCH] Do not report a warning on an inline function with a reified parameter #KT-6273 Fixed --- .../resolve/extension/InlineAnalyzerExtension.java | 10 ++++++++++ .../tests/generics/tpAsReified/Conventions.kt | 2 +- .../tests/generics/tpAsReified/InFunction.kt | 2 +- .../tests/generics/tpAsReified/InlineableReified.kt | 2 +- .../diagnostics/tests/generics/tpAsReified/LocalFun.kt | 2 +- .../testData/diagnostics/tests/inline/inlineReified.kt | 2 ++ .../diagnostics/tests/inline/inlineReified.txt | 3 +++ .../testsWithStdLib/reified/arrayConstruction.kt | 1 - .../testsWithStdLib/reified/arrayOfNullsReified.kt | 2 +- .../reified/reifiedNothingSubstitution.kt | 2 +- .../jet/checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 11 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inline/inlineReified.kt create mode 100644 compiler/testData/diagnostics/tests/inline/inlineReified.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java index 201d1e654a0..8a9a638bdbf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java @@ -128,11 +128,21 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz hasInlinable |= checkInlinableParameter(receiverParameter, receiver, functionDescriptor, trace); } + hasInlinable |= containsReifiedTypeParameters(functionDescriptor); + if (!hasInlinable) { trace.report(Errors.NOTHING_TO_INLINE.on(function, functionDescriptor)); } } + private static boolean containsReifiedTypeParameters(@NotNull FunctionDescriptor descriptor) { + for (TypeParameterDescriptor typeParameterDescriptor : descriptor.getTypeParameters()) { + if (typeParameterDescriptor.isReified()) return true; + } + + return false; + } + public static boolean checkInlinableParameter( @NotNull CallableDescriptor parameter, @NotNull JetElement expression, diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt index 797d5cdff9e..bb0546bf698 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/Conventions.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER +// !DIAGNOSTICS: -UNUSED_PARAMETER inline fun T.plus(p: T): T = this diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.kt index 34157dc067a..e673b9e1fa5 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/InFunction.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER +// !DIAGNOSTICS: -UNUSED_PARAMETER inline fun f(): T = throw UnsupportedOperationException() diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/InlineableReified.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/InlineableReified.kt index a4fdc6c2574..d8c35c93cd3 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/InlineableReified.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/InlineableReified.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER +// !DIAGNOSTICS: -UNUSED_PARAMETER inline fun bar(x: T1, y: T2): T2 = y inline fun foo(z: R): R = bar(1, z) diff --git a/compiler/testData/diagnostics/tests/generics/tpAsReified/LocalFun.kt b/compiler/testData/diagnostics/tests/generics/tpAsReified/LocalFun.kt index 2af48e7f4cf..6892134bc2d 100644 --- a/compiler/testData/diagnostics/tests/generics/tpAsReified/LocalFun.kt +++ b/compiler/testData/diagnostics/tests/generics/tpAsReified/LocalFun.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER -NOT_YET_SUPPORTED_IN_INLINE +// !DIAGNOSTICS: -UNUSED_PARAMETER -NOT_YET_SUPPORTED_IN_INLINE inline fun foo(x: T) { fun<reified R> bar() { diff --git a/compiler/testData/diagnostics/tests/inline/inlineReified.kt b/compiler/testData/diagnostics/tests/inline/inlineReified.kt new file mode 100644 index 00000000000..c6a4332e529 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/inlineReified.kt @@ -0,0 +1,2 @@ +inline fun foo(): T3 = null!! + diff --git a/compiler/testData/diagnostics/tests/inline/inlineReified.txt b/compiler/testData/diagnostics/tests/inline/inlineReified.txt new file mode 100644 index 00000000000..49aa4c98e7f --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/inlineReified.txt @@ -0,0 +1,3 @@ +package + +kotlin.inline() internal fun foo(): T3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt index bd06668ac46..791c1aee9f7 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayConstruction.kt @@ -1,4 +1,3 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE fun fail1(): Array = Array(1) { null!! } fun ok1(block: () -> Array): Array = block() diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt index cf6b8df0e93..83e9bfe9ceb 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/arrayOfNullsReified.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_VARIABLE +// !DIAGNOSTICS: -UNUSED_VARIABLE fun foo() { val x = arrayOfNulls(5) diff --git a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt index 81219aaf2f6..13751a433b8 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/reified/reifiedNothingSubstitution.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_PARAMETER -UNREACHABLE_CODE -UNUSED_VARIABLE -REIFIED_TYPE_PARAMETER_NO_INLINE +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNREACHABLE_CODE -UNUSED_VARIABLE inline fun foo(block: () -> T): String = block().toString() diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 49f45a31c00..4e3d4cc23bb 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -5597,6 +5597,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("inlineReified.kt") + public void testInlineReified() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/inlineReified.kt"); + doTest(fileName); + } + @TestMetadata("invoke.kt") public void testInvoke() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/invoke.kt");