diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java index 7c17bfbc858..c571fbeae46 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ControlStructureTypingVisitor.java @@ -460,7 +460,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { if (containingFunctionDescriptor != null) { if (!InlineDescriptorUtils.checkNonLocalReturnUsage(containingFunctionDescriptor, expression, context.trace) || - containingFunctionDescriptor instanceof ConstructorDescriptor) { + isClassInitializer(containingFunInfo)) { // Unqualified, in a function literal context.trace.report(RETURN_NOT_ALLOWED.on(expression)); resultType = ErrorUtils.createErrorType(RETURN_NOT_ALLOWED_MESSAGE); @@ -504,6 +504,11 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { return DataFlowUtils.checkType(resultType, expression, context, context.dataFlowInfo); } + private static boolean isClassInitializer(@NotNull Pair containingFunInfo) { + return containingFunInfo.getFirst() instanceof ConstructorDescriptor && + !(containingFunInfo.getSecond() instanceof JetSecondaryConstructor); + } + @Override public JetTypeInfo visitBreakExpression(@NotNull JetBreakExpression expression, ExpressionTypingContext context) { LabelResolver.INSTANCE.resolveControlLabel(expression, context); @@ -523,7 +528,10 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { @NotNull ExpressionTypingContext context ) { JetType expectedType; - if (function instanceof JetFunction) { + if (function instanceof JetSecondaryConstructor) { + expectedType = KotlinBuiltIns.getInstance().getUnitType(); + } + else if (function instanceof JetFunction) { JetFunction jetFunction = (JetFunction) function; expectedType = context.trace.get(EXPECTED_RETURN_TYPE, jetFunction); diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/return.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/return.kt new file mode 100644 index 00000000000..71181bbfe91 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/return.kt @@ -0,0 +1,17 @@ + +class A { + init { + return + return 1 + } + constructor() { + if (1 == 1) { + return + return 1 + } + return + return foo() + } + + fun foo(): Int = 1 +} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/return.txt b/compiler/testData/diagnostics/tests/secondaryConstructors/return.txt new file mode 100644 index 00000000000..7516980f633 --- /dev/null +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/return.txt @@ -0,0 +1,9 @@ +package + +internal final class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final fun foo(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 21ed3380b49..8cf6400d741 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -10439,6 +10439,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("return.kt") + public void testReturn() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/return.kt"); + doTest(fileName); + } + @TestMetadata("superAnyNonEmpty.kt") public void testSuperAnyNonEmpty() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/secondaryConstructors/superAnyNonEmpty.kt");