From c92d6854157ec3058222981e19ddf6b78e932250 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 29 Jun 2022 16:55:41 +0200 Subject: [PATCH] FIR: postpone callable reference candidate in default argument case #KT-53019 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 12 ++++ .../runners/ir/Fir2IrTextTestGenerated.java | 6 ++ .../ir/LightTreeFir2IrTextTestGenerated.java | 6 ++ .../jetbrains/kotlin/fir/FirCallResolver.kt | 13 ++++ .../codegen/box/fir/cannotCastToFunction.kt | 22 ++++++ .../box/fir/cannotCastToFunctionInIf.kt | 19 +++++ .../cannotCastToFunction.fir.ir.txt | 69 ++++++++++++++++++ .../cannotCastToFunction.fir.kt.txt | 30 ++++++++ .../firProblems/cannotCastToFunction.ir.txt | 71 +++++++++++++++++++ .../firProblems/cannotCastToFunction.kt | 10 +++ .../firProblems/cannotCastToFunction.kt.txt | 36 ++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 12 ++++ .../test/runners/ir/IrTextTestGenerated.java | 6 ++ .../klib/KlibTextTestCaseGenerated.java | 5 ++ 14 files changed, 317 insertions(+) create mode 100644 compiler/testData/codegen/box/fir/cannotCastToFunction.kt create mode 100644 compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt create mode 100644 compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.ir.txt create mode 100644 compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.kt.txt create mode 100644 compiler/testData/ir/irText/firProblems/cannotCastToFunction.ir.txt create mode 100644 compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt create mode 100644 compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index feb10fc6353..de8827e3d99 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -17721,6 +17721,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt"); } + @Test + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/codegen/box/fir/cannotCastToFunction.kt"); + } + + @Test + @TestMetadata("cannotCastToFunctionInIf.kt") + public void testCannotCastToFunctionInIf() throws Exception { + runTest("compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt"); + } + @Test @TestMetadata("ClassBuilder.kt") public void testClassBuilder() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index f412d261583..af7a67f21b2 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -2494,6 +2494,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/firProblems/candidateSymbol.kt"); } + @Test + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt"); + } + @Test @TestMetadata("ClashResolutionDescriptor.kt") public void testClashResolutionDescriptor() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index a2bebf40c76..28c52f38b9c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -2494,6 +2494,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/firProblems/candidateSymbol.kt"); } + @Test + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt"); + } + @Test @TestMetadata("ClashResolutionDescriptor.kt") public void testClashResolutionDescriptor() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 381ba81f63b..d2b7c891944 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -456,6 +456,19 @@ class FirCallResolver( } val chosenCandidate = reducedCandidates.single() + if (!resolvedCallableReferenceAtom.hasBeenPostponed && + expectedType is ConeTypeVariableType && + chosenCandidate.symbol.fir.let { func -> + func is FirSimpleFunction && func.valueParameters.any { param -> + param.defaultValue != null + } + } + ) { + resolvedCallableReferenceAtom.hasBeenPostponed = true + return applicability to true + } + + constraintSystemBuilder.runTransaction { chosenCandidate.outerConstraintBuilderEffect!!(this) true diff --git a/compiler/testData/codegen/box/fir/cannotCastToFunction.kt b/compiler/testData/codegen/box/fir/cannotCastToFunction.kt new file mode 100644 index 00000000000..6eea96ea1eb --- /dev/null +++ b/compiler/testData/codegen/box/fir/cannotCastToFunction.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND: JVM_IR + +open class IrElement + +fun IrElement.dumpKotlinLike(options: String = ""): String = "O" + +fun IrElement.dump(normalizeNames: Boolean = false, stableOrder: Boolean = false): String = "K" + +fun select(flag: Boolean, a: T, b: T): T = + if (flag) a else b + +fun dump(data: IrElement, dumpStrategy: String): String { + // Note: K1 reports TYPE_MISMATCH here (see also cannotCastToFunctionInIf.kt working both in K1/K2) + val dump: IrElement.() -> String = select(dumpStrategy == "KotlinLike", IrElement::dumpKotlinLike, IrElement::dump) + return data.dump() +} + +fun box(): String { + val element = IrElement() + return dump(element, "KotlinLike") + dump(element, "OtherStrategy") +} diff --git a/compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt b/compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt new file mode 100644 index 00000000000..1d115a999bd --- /dev/null +++ b/compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM_IR +// See KT-53019 +// See also cannotCastToFunction.kt with select instead of if + +open class IrElement + +fun IrElement.dumpKotlinLike(options: String = ""): String = "O" + +fun IrElement.dump(normalizeNames: Boolean = false, stableOrder: Boolean = false): String = "K" + +fun dump(data: IrElement, dumpStrategy: String): String { + val dump: IrElement.() -> String = if (dumpStrategy == "KotlinLike") IrElement::dumpKotlinLike else IrElement::dump + return data.dump() +} + +fun box(): String { + val element = IrElement() + return dump(element, "KotlinLike") + dump(element, "OtherStrategy") +} diff --git a/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.ir.txt b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.ir.txt new file mode 100644 index 00000000000..abc91bb3a44 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.ir.txt @@ -0,0 +1,69 @@ +FILE fqName: fileName:/cannotCastToFunction.kt + CLASS CLASS name:IrElement modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.IrElement + CONSTRUCTOR visibility:public <> () returnType:.IrElement [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IrElement modality:OPEN visibility:public superTypes:[kotlin.Any]' + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:dumpKotlinLike visibility:public modality:FINAL <> ($receiver:.IrElement, options:kotlin.String) returnType:kotlin.String + $receiver: VALUE_PARAMETER name: type:.IrElement + VALUE_PARAMETER name:options index:0 type:kotlin.String + EXPRESSION_BODY + CONST String type=kotlin.String value="" + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun dumpKotlinLike (options: kotlin.String): kotlin.String declared in ' + CONST String type=kotlin.String value="O" + FUN name:dump visibility:public modality:FINAL <> ($receiver:.IrElement, normalizeNames:kotlin.Boolean, stableOrder:kotlin.Boolean) returnType:kotlin.String + $receiver: VALUE_PARAMETER name: type:.IrElement + VALUE_PARAMETER name:normalizeNames index:0 type:kotlin.Boolean + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + VALUE_PARAMETER name:stableOrder index:1 type:kotlin.Boolean + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun dump (normalizeNames: kotlin.Boolean, stableOrder: kotlin.Boolean): kotlin.String declared in ' + CONST String type=kotlin.String value="K" + FUN name:dump visibility:public modality:FINAL <> (data:.IrElement, dumpStrategy:kotlin.String) returnType:kotlin.String + VALUE_PARAMETER name:data index:0 type:.IrElement + VALUE_PARAMETER name:dumpStrategy index:1 type:kotlin.String + BLOCK_BODY + VAR name:dump type:@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> [val] + WHEN type=@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> origin=IF + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'dumpStrategy: kotlin.String declared in .dump' type=kotlin.String origin=null + arg1: CONST String type=kotlin.String value="KotlinLike" + then: FUN_EXPR type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE + FUN ADAPTER_FOR_CALLABLE_REFERENCE name:dumpKotlinLike visibility:local modality:FINAL <> (p0:.IrElement) returnType:kotlin.String + VALUE_PARAMETER ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE name:p0 index:0 type:.IrElement + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun dumpKotlinLike (p0: .IrElement): kotlin.String declared in .dump' + CALL 'public final fun dumpKotlinLike (options: kotlin.String): kotlin.String declared in ' type=kotlin.String origin=null + $receiver: GET_VAR 'p0: .IrElement declared in .dump.dumpKotlinLike' type=.IrElement origin=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: FUN_EXPR type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE + FUN ADAPTER_FOR_CALLABLE_REFERENCE name:dump visibility:local modality:FINAL <> (p0:.IrElement) returnType:kotlin.String + VALUE_PARAMETER ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE name:p0 index:0 type:.IrElement + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun dump (p0: .IrElement): kotlin.String declared in .dump' + CALL 'public final fun dump (normalizeNames: kotlin.Boolean, stableOrder: kotlin.Boolean): kotlin.String declared in ' type=kotlin.String origin=null + $receiver: GET_VAR 'p0: .IrElement declared in .dump.dump' type=.IrElement origin=null + RETURN type=kotlin.Nothing from='public final fun dump (data: .IrElement, dumpStrategy: kotlin.String): kotlin.String declared in ' + CALL 'public abstract fun invoke (p1: P1 of kotlin.Function1): R of kotlin.Function1 [operator] declared in kotlin.Function1' type=kotlin.String origin=INVOKE + $this: GET_VAR 'val dump: @[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> [val] declared in .dump' type=@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> origin=VARIABLE_AS_FUNCTION + p1: GET_VAR 'data: .IrElement declared in .dump' type=.IrElement origin=null diff --git a/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.kt.txt b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.kt.txt new file mode 100644 index 00000000000..9ebfd9b29ee --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.fir.kt.txt @@ -0,0 +1,30 @@ +open class IrElement { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + +} + +fun IrElement.dumpKotlinLike(options: String = ""): String { + return "O" +} + +fun IrElement.dump(normalizeNames: Boolean = false, stableOrder: Boolean = false): String { + return "K" +} + +fun dump(data: IrElement, dumpStrategy: String): String { + val dump: @ExtensionFunctionType Function1 = when { + EQEQ(arg0 = dumpStrategy, arg1 = "KotlinLike") -> local fun dumpKotlinLike(p0: IrElement): String { + return p0.dumpKotlinLike() + } + + else -> local fun dump(p0: IrElement): String { + return p0.dump() + } + + } + return dump.invoke(p1 = data) +} diff --git a/compiler/testData/ir/irText/firProblems/cannotCastToFunction.ir.txt b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.ir.txt new file mode 100644 index 00000000000..683be48c925 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.ir.txt @@ -0,0 +1,71 @@ +FILE fqName: fileName:/cannotCastToFunction.kt + CLASS CLASS name:IrElement modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.IrElement + CONSTRUCTOR visibility:public <> () returnType:.IrElement [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IrElement modality:OPEN visibility:public superTypes:[kotlin.Any]' + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:dumpKotlinLike visibility:public modality:FINAL <> ($receiver:.IrElement, options:kotlin.String) returnType:kotlin.String + $receiver: VALUE_PARAMETER name: type:.IrElement + VALUE_PARAMETER name:options index:0 type:kotlin.String + EXPRESSION_BODY + CONST String type=kotlin.String value="" + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun dumpKotlinLike (options: kotlin.String): kotlin.String declared in ' + CONST String type=kotlin.String value="O" + FUN name:dump visibility:public modality:FINAL <> ($receiver:.IrElement, normalizeNames:kotlin.Boolean, stableOrder:kotlin.Boolean) returnType:kotlin.String + $receiver: VALUE_PARAMETER name: type:.IrElement + VALUE_PARAMETER name:normalizeNames index:0 type:kotlin.Boolean + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + VALUE_PARAMETER name:stableOrder index:1 type:kotlin.Boolean + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun dump (normalizeNames: kotlin.Boolean, stableOrder: kotlin.Boolean): kotlin.String declared in ' + CONST String type=kotlin.String value="K" + FUN name:dump visibility:public modality:FINAL <> (data:.IrElement, dumpStrategy:kotlin.String) returnType:kotlin.String + VALUE_PARAMETER name:data index:0 type:.IrElement + VALUE_PARAMETER name:dumpStrategy index:1 type:kotlin.String + BLOCK_BODY + VAR name:dump type:@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> [val] + WHEN type=@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> origin=IF + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'dumpStrategy: kotlin.String declared in .dump' type=kotlin.String origin=null + arg1: CONST String type=kotlin.String value="KotlinLike" + then: BLOCK type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE + FUN ADAPTER_FOR_CALLABLE_REFERENCE name:dumpKotlinLike visibility:local modality:FINAL <> (p0:.IrElement) returnType:kotlin.String + VALUE_PARAMETER ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE name:p0 index:0 type:.IrElement + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun dumpKotlinLike (p0: .IrElement): kotlin.String declared in .dump' + CALL 'public final fun dumpKotlinLike (options: kotlin.String): kotlin.String declared in ' type=kotlin.String origin=null + $receiver: GET_VAR 'p0: .IrElement declared in .dump.dumpKotlinLike' type=.IrElement origin=null + FUNCTION_REFERENCE 'local final fun dumpKotlinLike (p0: .IrElement): kotlin.String declared in .dump' type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE reflectionTarget=public final fun dumpKotlinLike (options: kotlin.String): kotlin.String declared in + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: BLOCK type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE + FUN ADAPTER_FOR_CALLABLE_REFERENCE name:dump visibility:local modality:FINAL <> (p0:.IrElement) returnType:kotlin.String + VALUE_PARAMETER ADAPTER_PARAMETER_FOR_CALLABLE_REFERENCE name:p0 index:0 type:.IrElement + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun dump (p0: .IrElement): kotlin.String declared in .dump' + CALL 'public final fun dump (normalizeNames: kotlin.Boolean, stableOrder: kotlin.Boolean): kotlin.String declared in ' type=kotlin.String origin=null + $receiver: GET_VAR 'p0: .IrElement declared in .dump.dump' type=.IrElement origin=null + FUNCTION_REFERENCE 'local final fun dump (p0: .IrElement): kotlin.String declared in .dump' type=kotlin.Function1<.IrElement, kotlin.String> origin=ADAPTED_FUNCTION_REFERENCE reflectionTarget=public final fun dump (normalizeNames: kotlin.Boolean, stableOrder: kotlin.Boolean): kotlin.String declared in + RETURN type=kotlin.Nothing from='public final fun dump (data: .IrElement, dumpStrategy: kotlin.String): kotlin.String declared in ' + CALL 'public abstract fun invoke (p1: P1 of kotlin.Function1): R of kotlin.Function1 [operator] declared in kotlin.Function1' type=kotlin.String origin=INVOKE + $this: GET_VAR 'val dump: @[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> [val] declared in .dump' type=@[ExtensionFunctionType] kotlin.Function1<.IrElement, kotlin.String> origin=VARIABLE_AS_FUNCTION + p1: GET_VAR 'data: .IrElement declared in .dump' type=.IrElement origin=null diff --git a/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt new file mode 100644 index 00000000000..c6967411c27 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt @@ -0,0 +1,10 @@ +open class IrElement + +fun IrElement.dumpKotlinLike(options: String = ""): String = "O" + +fun IrElement.dump(normalizeNames: Boolean = false, stableOrder: Boolean = false): String = "K" + +fun dump(data: IrElement, dumpStrategy: String): String { + val dump: IrElement.() -> String = if (dumpStrategy == "KotlinLike") IrElement::dumpKotlinLike else IrElement::dump + return data.dump() +} diff --git a/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt.txt b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt.txt new file mode 100644 index 00000000000..4f229f18e0e --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt.txt @@ -0,0 +1,36 @@ +open class IrElement { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + +} + +fun IrElement.dumpKotlinLike(options: String = ""): String { + return "O" +} + +fun IrElement.dump(normalizeNames: Boolean = false, stableOrder: Boolean = false): String { + return "K" +} + +fun dump(data: IrElement, dumpStrategy: String): String { + val dump: @ExtensionFunctionType Function1 = when { + EQEQ(arg0 = dumpStrategy, arg1 = "KotlinLike") -> { // BLOCK + local fun dumpKotlinLike(p0: IrElement): String { + return p0.dumpKotlinLike() + } + + ::dumpKotlinLike + } + else -> { // BLOCK + local fun dump(p0: IrElement): String { + return p0.dump() + } + + ::dump + } + } + return dump.invoke(p1 = data) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 3a71bb9954b..8ba6dffdb8b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -17721,6 +17721,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt"); } + @Test + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/codegen/box/fir/cannotCastToFunction.kt"); + } + + @Test + @TestMetadata("cannotCastToFunctionInIf.kt") + public void testCannotCastToFunctionInIf() throws Exception { + runTest("compiler/testData/codegen/box/fir/cannotCastToFunctionInIf.kt"); + } + @Test @TestMetadata("ClassBuilder.kt") public void testClassBuilder() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index bae533dc833..90007938da8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -2494,6 +2494,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/firProblems/candidateSymbol.kt"); } + @Test + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt"); + } + @Test @TestMetadata("ClashResolutionDescriptor.kt") public void testClashResolutionDescriptor() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java index e979d167d9a..8ed0f492bb9 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java @@ -1857,6 +1857,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/firProblems/candidateSymbol.kt"); } + @TestMetadata("cannotCastToFunction.kt") + public void testCannotCastToFunction() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/cannotCastToFunction.kt"); + } + @TestMetadata("DeepCopyIrTree.kt") public void testDeepCopyIrTree() throws Exception { runTest("compiler/testData/ir/irText/firProblems/DeepCopyIrTree.kt");