Resolve invalid return from constructor.

Change-Id: Ibec6d4e307b22fedb78a72531c852480a61cd8eb
Reviewed-on: https://dart-review.googlesource.com/68501
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 8eb13a5..203479c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -3831,6 +3831,32 @@
     assertType(aRef, 'int');
   }
 
+  test_invalid_constructor_return_blockBody() async {
+    addTestFile(r'''
+int a = 0;
+class C {
+  C() {
+    return a;
+  }
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    assertTopGetRef('a;', 'a');
+  }
+
+  test_invalid_constructor_return_expressionBody() async {
+    addTestFile(r'''
+int a = 0;
+class C {
+  C() => a;
+}
+''');
+    await resolveTestFile();
+    expect(result.errors, isNotEmpty);
+    assertTopGetRef('a;', 'a');
+  }
+
   test_invalid_deferred_type_localVariable() async {
     addTestFile(r'''
 import 'dart:async' deferred as a;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 0429009..dedcf53 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1761,11 +1761,15 @@
       bool hasExpression, Token beginToken, Token endToken) {
     debugEvent("ReturnStatement");
     Expression expression = hasExpression ? popForValue() : null;
+    var statement = forest.returnStatement(beginToken, expression, endToken);
     if (expression != null && inConstructor) {
-      push(buildCompileTimeErrorStatement(
-          fasta.messageConstructorWithReturnType, beginToken.charOffset));
+      Expression error = buildCompileTimeError(
+          fasta.messageConstructorWithReturnType,
+          beginToken.charOffset,
+          lengthForToken(beginToken));
+      push(new InvalidStatementJudgment(error, statement));
     } else {
-      push(forest.returnStatement(beginToken, expression, endToken));
+      push(statement);
     }
   }