diff --git a/compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt b/compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt new file mode 100644 index 00000000000..d61dbc529e3 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt @@ -0,0 +1,27 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +open class Foo(val args: String){ + constructor(arg: Any = 1) : this(arg.toString()) { + } +} +open class Base(val baseArgs: String) +open class Bar(arg: Any = 1) : Base(arg.toString()) { + val args = arg.toString() +} +object TF : Foo() {} +object TF2 : Foo(2) {} + +fun box(): String { + val f = object : Foo() {} + val f2 = object : Foo(2) {} + val b = object : Bar() {} + + f.args.let { if (it != "1") return "Fail 1: $it" } + f2.args.let { if (it != "2") return "Fail 2: $it" } + TF.args.let { if (it != "1") return "Fail 3: $it" } + TF2.args.let { if (it != "2") return "Fail 4: $it" } + b.args.let { if (it != "1") return "Fail 5: $it" } + b.baseArgs.let { if (it != "1") return "Fail 6: $it" } + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt b/compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt new file mode 100644 index 00000000000..68d561947e4 --- /dev/null +++ b/compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt @@ -0,0 +1,22 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +abstract class O(val value: String) { + constructor(o: Char = 'O') : this("$o") +} + +abstract class K { + val value: String + + constructor(k: Char = 'K') { + value = "$k" + } +} + +fun box(): String { + + val o = object : O() {} + + val k = object : K() {} + + return o.value + k.value +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 6b7500c381c..282df342804 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -9234,6 +9234,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); @@ -9243,6 +9248,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/manyArgs.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9ce4f55d9e4..8713d9e5612 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -9234,6 +9234,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); @@ -9243,6 +9248,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes public void testManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/manyArgs.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 59e16164f08..3f837c69af7 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -8084,6 +8084,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); @@ -8093,6 +8098,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT public void testManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/manyArgs.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index f4666d093b3..ec6d3b09a67 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8084,6 +8084,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); @@ -8093,6 +8098,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testManyArgs() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/manyArgs.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 47f3b864e6b..f32d23bd186 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -6954,10 +6954,20 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 95d6eac546a..d3448ed6ebb 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8029,10 +8029,20 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt2852.kt"); } + @TestMetadata("kt30517.kt") + public void testKt30517() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt30517.kt"); + } + @TestMetadata("kt3060.kt") public void testKt3060() throws Exception { runTest("compiler/testData/codegen/box/defaultArguments/constructor/kt3060.kt"); } + + @TestMetadata("objectExpressionDelegatingToSecondaryConstructor.kt") + public void testObjectExpressionDelegatingToSecondaryConstructor() throws Exception { + runTest("compiler/testData/codegen/box/defaultArguments/constructor/objectExpressionDelegatingToSecondaryConstructor.kt"); + } } @TestMetadata("compiler/testData/codegen/box/defaultArguments/convention") diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index fe1642942e8..c032620c946 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -242,16 +242,20 @@ public final class ClassInitializerTranslator extends AbstractTranslator { addCallToSuperMethod(arguments, initializer, superCall.getCall().getCallElement()); } else { - int maxValueArgumentIndex = 0; - for (ValueParameterDescriptor arg : superCall.getValueArguments().keySet()) { - ResolvedValueArgument resolvedArg = superCall.getValueArguments().get(arg); - if (!(resolvedArg instanceof DefaultValueArgument)) { - maxValueArgumentIndex = Math.max(maxValueArgumentIndex, arg.getIndex() + 1); + // Add `void 0` for the trailing default arguments + // Anonymous object constructor already has all the parameters proxied, including ones with default values + if (!DescriptorUtils.isAnonymousObject(classDescriptor)) { + int maxValueArgumentIndex = 0; + for (ValueParameterDescriptor arg : superCall.getValueArguments().keySet()) { + ResolvedValueArgument resolvedArg = superCall.getValueArguments().get(arg); + if (!(resolvedArg instanceof DefaultValueArgument)) { + maxValueArgumentIndex = Math.max(maxValueArgumentIndex, arg.getIndex() + 1); + } + } + int padSize = superDescriptor.getValueParameters().size() - maxValueArgumentIndex; + while (padSize-- > 0) { + arguments.add(Namer.getUndefinedExpression()); } - } - int padSize = superDescriptor.getValueParameters().size() - maxValueArgumentIndex; - while (padSize-- > 0) { - arguments.add(Namer.getUndefinedExpression()); } addCallToSuperSecondaryConstructor(arguments, superDescriptor); }