diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 1cc0a9090fb..aa28746f47a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -1001,7 +1001,10 @@ public class JetControlFlowProcessor { builder.declareParameter(parameter); JetExpression defaultValue = parameter.getDefaultValue(); if (defaultValue != null) { + Label skipDefaultValue = builder.createUnboundLabel("after default value for parameter " + parameter.getName()); + builder.nondeterministicJump(skipDefaultValue, defaultValue, null); generateInstructions(defaultValue, context); + builder.bindLabel(skipDefaultValue); } generateInitializer(parameter, createSyntheticValue(parameter)); } diff --git a/compiler/testData/cfg/functions/DefaultValuesForArguments.instructions b/compiler/testData/cfg/functions/DefaultValuesForArguments.instructions new file mode 100644 index 00000000000..a42371f93ab --- /dev/null +++ b/compiler/testData/cfg/functions/DefaultValuesForArguments.instructions @@ -0,0 +1,22 @@ +== foo == +fun foo(i: Int = 1) = i + 2 +--------------------- +L0: + 1 + v(i: Int = 1) + jmp?(L2 [after default value for parameter i]) NEXT:[magic(i: Int = 1) -> , r(1) -> ] + r(1) -> +L2 [after default value for parameter i]: + magic(i: Int = 1) -> PREV:[jmp?(L2 [after default value for parameter i]), r(1) -> ] + w(i|) + r(i) -> + r(2) -> + mark(i + 2) + call(+, plus|, ) -> +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/functions/DefaultValuesForArguments.kt b/compiler/testData/cfg/functions/DefaultValuesForArguments.kt new file mode 100644 index 00000000000..3b6a8f9835c --- /dev/null +++ b/compiler/testData/cfg/functions/DefaultValuesForArguments.kt @@ -0,0 +1 @@ +fun foo(i: Int = 1) = i + 2 \ No newline at end of file diff --git a/compiler/testData/cfg/functions/DefaultValuesForArguments.values b/compiler/testData/cfg/functions/DefaultValuesForArguments.values new file mode 100644 index 00000000000..4c5426bd1d6 --- /dev/null +++ b/compiler/testData/cfg/functions/DefaultValuesForArguments.values @@ -0,0 +1,8 @@ +== foo == +fun foo(i: Int = 1) = i + 2 +--------------------- +1 NEW() +i NEW() +2 NEW() +i + 2 NEW(, ) +===================== diff --git a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java index 5d9e7198df8..597bde87fe3 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.cfg.AbstractControlFlowTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @TestMetadata("compiler/testData/cfg") -@InnerTestClasses({ControlFlowTestGenerated.Arrays.class, ControlFlowTestGenerated.Basic.class, ControlFlowTestGenerated.Bugs.class, ControlFlowTestGenerated.ControlStructures.class, ControlFlowTestGenerated.Conventions.class, ControlFlowTestGenerated.DeadCode.class, ControlFlowTestGenerated.Declarations.class, ControlFlowTestGenerated.Expressions.class, ControlFlowTestGenerated.TailCalls.class}) +@InnerTestClasses({ControlFlowTestGenerated.Arrays.class, ControlFlowTestGenerated.Basic.class, ControlFlowTestGenerated.Bugs.class, ControlFlowTestGenerated.ControlStructures.class, ControlFlowTestGenerated.Conventions.class, ControlFlowTestGenerated.DeadCode.class, ControlFlowTestGenerated.Declarations.class, ControlFlowTestGenerated.Expressions.class, ControlFlowTestGenerated.Functions.class, ControlFlowTestGenerated.TailCalls.class}) public class ControlFlowTestGenerated extends AbstractControlFlowTest { public void testAllFilesPresentInCfg() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg"), Pattern.compile("^(.+)\\.kt$"), true); @@ -406,6 +406,19 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { } + @TestMetadata("compiler/testData/cfg/functions") + public static class Functions extends AbstractControlFlowTest { + public void testAllFilesPresentInFunctions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/functions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("DefaultValuesForArguments.kt") + public void testDefaultValuesForArguments() throws Exception { + doTest("compiler/testData/cfg/functions/DefaultValuesForArguments.kt"); + } + + } + @TestMetadata("compiler/testData/cfg/tailCalls") public static class TailCalls extends AbstractControlFlowTest { public void testAllFilesPresentInTailCalls() throws Exception { @@ -450,6 +463,7 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { suite.addTestSuite(DeadCode.class); suite.addTest(Declarations.innerSuite()); suite.addTestSuite(Expressions.class); + suite.addTestSuite(Functions.class); suite.addTestSuite(TailCalls.class); return suite; } diff --git a/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java index cbe2296d004..4a9f13962dc 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java @@ -33,7 +33,7 @@ import org.jetbrains.jet.cfg.AbstractPseudoValueTest; @InnerTestClasses({PseudoValueTestGenerated.Cfg.class, PseudoValueTestGenerated.Cfg_variables.class}) public class PseudoValueTestGenerated extends AbstractPseudoValueTest { @TestMetadata("compiler/testData/cfg") - @InnerTestClasses({Cfg.Arrays.class, Cfg.Basic.class, Cfg.Bugs.class, Cfg.ControlStructures.class, Cfg.Conventions.class, Cfg.DeadCode.class, Cfg.Declarations.class, Cfg.Expressions.class, Cfg.TailCalls.class}) + @InnerTestClasses({Cfg.Arrays.class, Cfg.Basic.class, Cfg.Bugs.class, Cfg.ControlStructures.class, Cfg.Conventions.class, Cfg.DeadCode.class, Cfg.Declarations.class, Cfg.Expressions.class, Cfg.Functions.class, Cfg.TailCalls.class}) public static class Cfg extends AbstractPseudoValueTest { public void testAllFilesPresentInCfg() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg"), Pattern.compile("^(.+)\\.kt$"), true); @@ -408,6 +408,19 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest { } + @TestMetadata("compiler/testData/cfg/functions") + public static class Functions extends AbstractPseudoValueTest { + public void testAllFilesPresentInFunctions() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/cfg/functions"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("DefaultValuesForArguments.kt") + public void testDefaultValuesForArguments() throws Exception { + doTest("compiler/testData/cfg/functions/DefaultValuesForArguments.kt"); + } + + } + @TestMetadata("compiler/testData/cfg/tailCalls") public static class TailCalls extends AbstractPseudoValueTest { public void testAllFilesPresentInTailCalls() throws Exception { @@ -452,6 +465,7 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest { suite.addTestSuite(DeadCode.class); suite.addTest(Declarations.innerSuite()); suite.addTestSuite(Expressions.class); + suite.addTestSuite(Functions.class); suite.addTestSuite(TailCalls.class); return suite; }