diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java index a7103156fc1..ca351a41131 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.java @@ -70,6 +70,7 @@ import static org.jetbrains.kotlin.codegen.AsmUtil.getMethodAsmFlags; import static org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil.*; import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUtilKt.isInlineOnly; +import static org.jetbrains.kotlin.resolve.inline.InlineUtil.isInlinableParameterExpression; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isFunctionLiteral; public class InlineCodegen extends CallGenerator { @@ -783,12 +784,6 @@ public class InlineCodegen extends CallGenerator { isInlinableParameterExpression(deparenthesized); } - private static boolean isInlinableParameterExpression(@Nullable KtExpression deparenthesized) { - return deparenthesized instanceof KtLambdaExpression || - deparenthesized instanceof KtNamedFunction || - deparenthesized instanceof KtCallableReferenceExpression; - } - private LambdaInfo rememberClosure(@NotNull KtExpression expression, @NotNull Type type, @NotNull ValueParameterDescriptor parameter) { KtExpression lambda = KtPsiUtil.deparenthesize(expression); assert isInlinableParameterExpression(lambda) : "Couldn't find inline expression in " + expression.getText(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 2f705a9bad5..faa14e8957f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -926,7 +926,7 @@ public interface Errors { DiagnosticFactory0 INLINE_PROPERTY_WITH_BACKING_FIELD = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 NON_INTERNAL_PUBLISHED_API = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 PROTECTED_CALL_FROM_PUBLIC_INLINE = DiagnosticFactory1.create(WARNING); - + DiagnosticFactory2 INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 NON_LOCAL_SUSPENSION_POINT = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 ILLEGAL_SUSPEND_FUNCTION_CALL = DiagnosticFactory1.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 3a7249758c2..2173c55b142 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -836,6 +836,7 @@ public class DefaultErrorMessages { MAP.put(INLINE_PROPERTY_WITH_BACKING_FIELD, "Inline property cannot have backing field"); MAP.put(NON_INTERNAL_PUBLISHED_API, "@PublishedApi annotation is only applicable for internal declaration"); MAP.put(PROTECTED_CALL_FROM_PUBLIC_INLINE, "Protected function call from public-API inline function is deprecated", NAME); + MAP.put(INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE, "Invalid default value for inline parameter: ''{0}''. Only lambdas, anonymous functions, and callable references are supported", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); //Inline non locals MAP.put(NON_LOCAL_RETURN_NOT_ALLOWED, "Can''t inline ''{0}'' here: it may contain non-local returns. Add ''crossinline'' modifier to parameter declaration ''{0}''", ELEMENT_TEXT); MAP.put(INLINE_CALL_CYCLE, "The ''{0}'' invocation is a part of inline cycle", NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzerExtensions.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzerExtensions.java index 25bfd7aeaaa..9126696062a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzerExtensions.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnalyzerExtensions.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.psi.KtCallableDeclaration; import org.jetbrains.kotlin.psi.KtNamedFunction; @@ -37,10 +38,16 @@ public class AnalyzerExtensions { @NotNull private final BindingTrace trace; @NotNull private final Iterable reasonableInlineRules; + private LanguageVersionSettings languageVersionSettings; - public AnalyzerExtensions(@NotNull BindingTrace trace, @NotNull Iterable reasonableInlineRules) { + public AnalyzerExtensions( + @NotNull BindingTrace trace, + @NotNull Iterable reasonableInlineRules, + @NotNull LanguageVersionSettings languageVersionSettings + ) { this.trace = trace; this.reasonableInlineRules = reasonableInlineRules; + this.languageVersionSettings = languageVersionSettings; } public void process(@NotNull BodiesResolveContext bodiesResolveContext) { @@ -66,7 +73,7 @@ public class AnalyzerExtensions { @NotNull private List getFunctionExtensions(@NotNull FunctionDescriptor functionDescriptor) { if (InlineUtil.isInline(functionDescriptor)) { - return Collections.singletonList(new InlineAnalyzerExtension(reasonableInlineRules)); + return Collections.singletonList(new InlineAnalyzerExtension(reasonableInlineRules, languageVersionSettings)); } return Collections.emptyList(); } @@ -74,7 +81,7 @@ public class AnalyzerExtensions { @NotNull private List getPropertyExtensions(@NotNull PropertyDescriptor propertyDescriptor) { if (InlineUtil.hasInlineAccessors(propertyDescriptor)) { - return Collections.singletonList(new InlineAnalyzerExtension(reasonableInlineRules)); + return Collections.singletonList(new InlineAnalyzerExtension(reasonableInlineRules, languageVersionSettings)); } return Collections.emptyList(); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt index fe193d8695b..f58a3ebff16 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.resolve.inline +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable import org.jetbrains.kotlin.diagnostics.Errors @@ -26,7 +28,10 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue -class InlineAnalyzerExtension(private val reasonableInlineRules: Iterable) : AnalyzerExtensions.AnalyzerExtension { +class InlineAnalyzerExtension( + private val reasonableInlineRules: Iterable, + private val languageVersionSettings: LanguageVersionSettings +) : AnalyzerExtensions.AnalyzerExtension { override fun process(descriptor: CallableMemberDescriptor, functionOrProperty: KtCallableDeclaration, trace: BindingTrace) { checkModalityAndOverrides(descriptor, functionOrProperty, trace) @@ -86,14 +91,28 @@ class InlineAnalyzerExtension(private val reasonableInlineRules: Iterable + if (!InlineUtil.isInlinableParameterExpression(KtPsiUtil.deparenthesize(defaultValue))) { + trace.report(Errors.INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE.on(defaultValue, defaultValue, parameterDescriptor)) + } + } + } + private fun checkModalityAndOverrides( callableDescriptor: CallableMemberDescriptor, functionOrProperty: KtCallableDeclaration, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java index 171c5581a11..b0a79926c29 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineUtil.java @@ -200,4 +200,10 @@ public class InlineUtil { return false; } + + public static boolean isInlinableParameterExpression(@Nullable KtExpression deparenthesized) { + return deparenthesized instanceof KtLambdaExpression || + deparenthesized instanceof KtNamedFunction || + deparenthesized instanceof KtCallableReferenceExpression; + } } diff --git a/compiler/testData/codegen/boxInline/defaultValues/varArgNoInline.kt b/compiler/testData/codegen/boxInline/defaultValues/varArgNoInline.kt new file mode 100644 index 00000000000..bfd1c940bc5 --- /dev/null +++ b/compiler/testData/codegen/boxInline/defaultValues/varArgNoInline.kt @@ -0,0 +1,20 @@ +// FILE: 1.kt +//WITH_RUNTIME +package test + +var res = "" + +inline fun inlineFun(vararg s : () -> String = arrayOf({ "OK" })) { + for (p in s) { + res += p() + } +} + +// FILE: 2.kt +//NO_CHECK_LAMBDA_INLINING +import test.* + +fun box(): String { + inlineFun() + return res +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.kt new file mode 100644 index 00000000000..0dbe03dcabc --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.kt @@ -0,0 +1,48 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE +// !LANGUAGE: -InlineDefaultFunctionalParameters + +fun test() = "OK" + +val prop = "OK" + +class Foo { + fun test() = "OK" + val prop = "OK" +} + +object FooObject { + fun test() = "OK" + val prop = "OK" +} + +inline fun default1(s : () -> String = { "OK" }) {} +inline fun default2(s : () -> String = ::test) {} +inline fun default3(s : () -> String = ::prop) {} +inline fun default4(s : () -> String = FooObject::test) {} +inline fun default5(s : () -> String = FooObject::prop) {} +inline fun default6(s : (a: Foo) -> String = Foo::test) {} +inline fun default7(s : (a: Foo) -> String = Foo::prop) {} + +val a = Foo() + +inline fun default8(s : () -> String = a::test) {} +inline fun default9(s : () -> String = a::prop) {} + +inline fun default10(s : () -> String = object : Function0 { + override fun invoke(): String { + return "FAIL" + } +}) {} + + +abstract class Base { + abstract fun foo(f: () -> Unit = { }) +} + +class Derived : Base() { + override final inline fun foo(f: () -> Unit) { + f() + } +} + +inline fun default11(s : () -> Derived = ::Derived) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.txt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.txt new file mode 100644 index 00000000000..0ccf9886d2e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.txt @@ -0,0 +1,50 @@ +package + +public val a: Foo +public val prop: kotlin.String = "OK" +public inline fun default1(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default10(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default11(/*0*/ s: () -> Derived = ...): kotlin.Unit +public inline fun default2(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default3(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default4(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default5(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default6(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit +public inline fun default7(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit +public inline fun default8(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default9(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public fun test(): kotlin.String + +public abstract class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Derived : Base { + public constructor Derived() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final inline override /*1*/ fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo { + public constructor Foo() + public final val prop: kotlin.String = "OK" + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public object FooObject { + private constructor FooObject() + public final val prop: kotlin.String = "OK" + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt new file mode 100644 index 00000000000..c3661e10d3d --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt @@ -0,0 +1,47 @@ +// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE +// !LANGUAGE: +InlineDefaultFunctionalParameters + +fun test() = "OK" + +val prop = "OK" + +class Foo { + fun test() = "OK" + val prop = "OK" +} + +object FooObject { + fun test() = "OK" + val prop = "OK" +} + +inline fun default1(s : () -> String = {"OK"}) {} +inline fun default2(s : () -> String = ::test) {} +inline fun default3(s : () -> String = ::prop) {} +inline fun default4(s : () -> String = FooObject::test) {} +inline fun default5(s : () -> String = FooObject::prop) {} +inline fun default6(s : (a: Foo) -> String = Foo::test) {} +inline fun default7(s : (a: Foo) -> String = Foo::prop) {} + +val a = Foo() + +inline fun default8(s : () -> String = a::test) {} +inline fun default9(s : () -> String = a::prop) {} + +inline fun default10(s : () -> String = object : Function0 { + override fun invoke(): String { + return "FAIL" + } +}) {} + +abstract class Base { + abstract fun foo(f: () -> Unit = { }) +} + +class Derived : Base() { + override final inline fun foo(f: () -> Unit) { + f() + } +} + +inline fun default11(s : () -> Derived = ::Derived) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.txt b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.txt new file mode 100644 index 00000000000..0ccf9886d2e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.txt @@ -0,0 +1,50 @@ +package + +public val a: Foo +public val prop: kotlin.String = "OK" +public inline fun default1(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default10(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default11(/*0*/ s: () -> Derived = ...): kotlin.Unit +public inline fun default2(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default3(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default4(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default5(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default6(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit +public inline fun default7(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit +public inline fun default8(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public inline fun default9(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit +public fun test(): kotlin.String + +public abstract class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Derived : Base { + public constructor Derived() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final inline override /*1*/ fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Foo { + public constructor Foo() + public final val prop: kotlin.String = "OK" + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public object FooObject { + private constructor FooObject() + public final val prop: kotlin.String = "OK" + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index c643ff26961..8980b4c04c7 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -11053,6 +11053,18 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("defaultLambdaInlineDisable.kt") + public void testDefaultLambdaInlineDisable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlineDisable.kt"); + doTest(fileName); + } + + @TestMetadata("defaultLambdaInlining.kt") + public void testDefaultLambdaInlining() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/defaultLambdaInlining.kt"); + doTest(fileName); + } + @TestMetadata("extensionOnFunction.kt") public void testExtensionOnFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java index 069bbc24245..09189af97fa 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -941,6 +941,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTest(fileName); } + @TestMetadata("varArgNoInline.kt") + public void testVarArgNoInline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/varArgNoInline.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index 0d6ce1b022e..ad99594247d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -941,6 +941,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doTest(fileName); } + @TestMetadata("varArgNoInline.kt") + public void testVarArgNoInline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/defaultValues/varArgNoInline.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/codegen/boxInline/defaultValues/lambdaInlining") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index b08b99d006a..072ecb9ef01 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -50,6 +50,7 @@ enum class LanguageFeature( DefaultImportOfPackageKotlinComparisons(KOTLIN_1_1), ArrayLiteralsInAnnotations(KOTLIN_1_2), + InlineDefaultFunctionalParameters(KOTLIN_1_2), // Experimental features