diff --git a/DEPS b/DEPS
index 4799c7d..c8310ef 100644
--- a/DEPS
+++ b/DEPS
@@ -77,7 +77,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_rev": "3b3f55766af13d895d2020ec001a28e8dc147f91",
-  "async_rev": "80886150a5e6c58006c8ae5a6c2aa7108638e2a9",
+  "async_rev": "3f58c326bd4928fca9ddc10c72b19cb7ac659256",
   "bazel_worker_rev": "ceeba0982d4ff40d32371c9d35f3d2dc1868de20",
   "benchmark_harness_rev": "c546dbd9f639f75cd2f75de8df2eb9f8ea15e8e7",
   "boolean_selector_rev": "437e7f06c7e416bed91e16ae1df453555897e945",
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index a9f8bfa..a0e3573 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2782,6 +2782,14 @@
     problemMessage: r"""Unable to decode bytes as UTF-8.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeEnumAbstractMember = messageEnumAbstractMember;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageEnumAbstractMember = const MessageCode(
+    "EnumAbstractMember",
+    problemMessage: r"""Enums can't declare abstract members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 6874ce4..cfd19e2 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -12,6 +12,8 @@
 import 'package:analysis_server/src/handler/legacy/analysis_get_signature.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_reanalyze.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_set_analysis_roots.dart';
+import 'package:analysis_server/src/handler/legacy/analysis_set_general_subscriptions.dart';
+import 'package:analysis_server/src/handler/legacy/analysis_set_priority_files.dart';
 import 'package:analysis_server/src/handler/legacy/analysis_set_subscriptions.dart';
 import 'package:analysis_server/src/handler/legacy/unsupported_request.dart';
 import 'package:analysis_server/src/plugin/request_converter.dart';
@@ -63,16 +65,25 @@
             .handle();
         return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_GENERAL_SUBSCRIPTIONS) {
-        return setGeneralSubscriptions(request);
+        AnalysisSetGeneralSubscriptionsHandler(
+                server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_PRIORITY_FILES) {
-        return setPriorityFiles(request);
+        AnalysisSetPriorityFilesHandler(server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_SET_SUBSCRIPTIONS) {
         AnalysisSetSubscriptionsHandler(server, request, cancellationToken)
             .handle();
         return Response.DELAYED_RESPONSE;
       } else if (requestName == ANALYSIS_REQUEST_UPDATE_CONTENT) {
+        // TODO(brianwilkerson) Converting this to a handler currently causes a
+        //  test to timeout.
         return updateContent(request);
       } else if (requestName == ANALYSIS_REQUEST_UPDATE_OPTIONS) {
+        // TODO(brianwilkerson) Converting this to a handler currently causes a
+        //  test to timeout.
         return updateOptions(request);
       }
     } on RequestFailure catch (exception) {
@@ -81,36 +92,6 @@
     return null;
   }
 
-  /// Implement the 'analysis.setGeneralSubscriptions' request.
-  Response setGeneralSubscriptions(Request request) {
-    var params = AnalysisSetGeneralSubscriptionsParams.fromRequest(request);
-    server.setGeneralAnalysisSubscriptions(params.subscriptions);
-    return AnalysisSetGeneralSubscriptionsResult().toResponse(request.id);
-  }
-
-  /// Implement the 'analysis.setPriorityFiles' request.
-  Response setPriorityFiles(Request request) {
-    var params = AnalysisSetPriorityFilesParams.fromRequest(request);
-
-    for (var file in params.files) {
-      if (!server.isAbsoluteAndNormalized(file)) {
-        return Response.invalidFilePathFormat(request, file);
-      }
-    }
-
-    server.setPriorityFiles(request.id, params.files);
-    //
-    // Forward the request to the plugins.
-    //
-    var converter = RequestConverter();
-    server.pluginManager.setAnalysisSetPriorityFilesParams(
-        converter.convertAnalysisSetPriorityFilesParams(params));
-    //
-    // Send the response.
-    //
-    return AnalysisSetPriorityFilesResult().toResponse(request.id);
-  }
-
   /// Implement the 'analysis.updateContent' request.
   Response updateContent(Request request) {
     var params = AnalysisUpdateContentParams.fromRequest(request);
diff --git a/pkg/analysis_server/lib/src/domain_analytics.dart b/pkg/analysis_server/lib/src/domain_analytics.dart
index cec9fa8..1460410 100644
--- a/pkg/analysis_server/lib/src/domain_analytics.dart
+++ b/pkg/analysis_server/lib/src/domain_analytics.dart
@@ -4,10 +4,12 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_enable.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_is_enabled.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_send_event.dart';
+import 'package:analysis_server/src/handler/legacy/analytics_send_timing.dart';
 import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:telemetry/telemetry.dart';
 
 /// Instances of the class [AnalyticsDomainHandler] implement a [RequestHandler]
 /// that handles requests in the `analytics` domain.
@@ -16,61 +18,24 @@
 
   AnalyticsDomainHandler(this.server);
 
-  Analytics? get analytics => server.analytics;
-
-  String get _clientId => server.options.clientId ?? 'client';
-
-  Response handleEnable(Request request) {
-    var params = AnalyticsEnableParams.fromRequest(request);
-    final analytics = this.analytics;
-    if (analytics != null) {
-      analytics.enabled = params.value;
-    }
-    return AnalyticsEnableResult().toResponse(request.id);
-  }
-
-  Response handleIsEnabled(Request request) {
-    return AnalyticsIsEnabledResult(analytics?.enabled ?? false)
-        .toResponse(request.id);
-  }
-
   @override
   Response? handleRequest(
       Request request, CancellationToken cancellationToken) {
     var requestName = request.method;
 
     if (requestName == ANALYTICS_REQUEST_IS_ENABLED) {
-      return handleIsEnabled(request);
+      AnalyticsIsEnabledHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_ENABLE) {
-      return handleEnable(request);
+      AnalyticsEnableHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_SEND_EVENT) {
-      return handleSendEvent(request);
+      AnalyticsSendEventHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     } else if (requestName == ANALYTICS_REQUEST_SEND_TIMING) {
-      return handleSendTiming(request);
+      AnalyticsSendTimingHandler(server, request, cancellationToken).handle();
+      return Response.DELAYED_RESPONSE;
     }
-
     return null;
   }
-
-  Response handleSendEvent(Request request) {
-    final analytics = this.analytics;
-    if (analytics == null) {
-      return AnalyticsSendEventResult().toResponse(request.id);
-    }
-
-    var params = AnalyticsSendEventParams.fromRequest(request);
-    analytics.sendEvent(_clientId, params.action);
-    return AnalyticsSendEventResult().toResponse(request.id);
-  }
-
-  Response handleSendTiming(Request request) {
-    final analytics = this.analytics;
-    if (analytics == null) {
-      return AnalyticsSendTimingResult().toResponse(request.id);
-    }
-
-    var params = AnalyticsSendTimingParams.fromRequest(request);
-    analytics.sendTiming(params.event, params.millis, category: _clientId);
-    return AnalyticsSendTimingResult().toResponse(request.id);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 22cf45c..35a41d6 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -4,11 +4,10 @@
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/diagnostic_get_diagnostics.dart';
 import 'package:analysis_server/src/handler/legacy/diagnostic_get_server_port.dart';
 import 'package:analysis_server/src/utilities/progress.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 
 /// Instances of the class [DiagnosticDomainHandler] implement a
 /// [RequestHandler] that handles requests in the `diagnostic` domain.
@@ -20,27 +19,15 @@
   /// [server].
   DiagnosticDomainHandler(this.server);
 
-  /// Answer the `diagnostic.getDiagnostics` request.
-  Response computeDiagnostics(Request request) {
-    var contexts = server.driverMap.values.map(extractDataFromDriver).toList();
-    return DiagnosticGetDiagnosticsResult(contexts).toResponse(request.id);
-  }
-
-  /// Extract context data from the given [driver].
-  ContextData extractDataFromDriver(AnalysisDriver driver) {
-    var explicitFileCount = driver.addedFiles.length;
-    var knownFileCount = driver.knownFiles.length;
-    return ContextData(driver.name, explicitFileCount,
-        knownFileCount - explicitFileCount, driver.numberOfFilesToAnalyze, []);
-  }
-
   @override
   Response? handleRequest(
       Request request, CancellationToken cancellationToken) {
     try {
       var requestName = request.method;
       if (requestName == DIAGNOSTIC_REQUEST_GET_DIAGNOSTICS) {
-        return computeDiagnostics(request);
+        DiagnosticGetDiagnosticsHandler(server, request, cancellationToken)
+            .handle();
+        return Response.DELAYED_RESPONSE;
       } else if (requestName == DIAGNOSTIC_REQUEST_GET_SERVER_PORT) {
         DiagnosticGetServerPortHandler(server, request, cancellationToken)
             .handle();
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart
new file mode 100644
index 0000000..1d02f73
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_general_subscriptions.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analysis.setGeneralSubscriptions` request.
+class AnalysisSetGeneralSubscriptionsHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalysisSetGeneralSubscriptionsHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalysisSetGeneralSubscriptionsParams.fromRequest(request);
+    server.setGeneralAnalysisSubscriptions(params.subscriptions);
+    sendResult(AnalysisSetGeneralSubscriptionsResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart
new file mode 100644
index 0000000..9cbe6bd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analysis_set_priority_files.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/plugin/request_converter.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analysis.setPriorityFiles` request.
+class AnalysisSetPriorityFilesHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalysisSetPriorityFilesHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalysisSetPriorityFilesParams.fromRequest(request);
+
+    for (var file in params.files) {
+      if (!server.isAbsoluteAndNormalized(file)) {
+        sendResponse(Response.invalidFilePathFormat(request, file));
+      }
+    }
+
+    server.setPriorityFiles(request.id, params.files);
+    //
+    // Forward the request to the plugins.
+    //
+    var converter = RequestConverter();
+    server.pluginManager.setAnalysisSetPriorityFilesParams(
+        converter.convertAnalysisSetPriorityFilesParams(params));
+    //
+    // Send the response.
+    //
+    sendResult(AnalysisSetPriorityFilesResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
new file mode 100644
index 0000000..5b5a927
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_enable.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.enable` request.
+class AnalyticsEnableHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsEnableHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var params = AnalyticsEnableParams.fromRequest(request);
+    final analytics = server.analytics;
+    if (analytics != null) {
+      analytics.enabled = params.value;
+    }
+    sendResult(AnalyticsEnableResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
new file mode 100644
index 0000000..a4d3bfb
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_is_enabled.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.isEnabled` request.
+class AnalyticsIsEnabledHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsIsEnabledHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    sendResult(AnalyticsIsEnabledResult(server.analytics?.enabled ?? false));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
new file mode 100644
index 0000000..ea1aee4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_event.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.sendEvent` request.
+class AnalyticsSendEventHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsSendEventHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  String get _clientId => server.options.clientId ?? 'client';
+
+  @override
+  Future<void> handle() async {
+    final analytics = server.analytics;
+    if (analytics == null) {
+      sendResult(AnalyticsSendEventResult());
+      return;
+    }
+
+    var params = AnalyticsSendEventParams.fromRequest(request);
+    analytics.sendEvent(_clientId, params.action);
+    sendResult(AnalyticsSendEventResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
new file mode 100644
index 0000000..bb9961e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/analytics_send_timing.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+
+/// The handler for the `analytics.sendTiming` request.
+class AnalyticsSendTimingHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  AnalyticsSendTimingHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  String get _clientId => server.options.clientId ?? 'client';
+
+  @override
+  Future<void> handle() async {
+    final analytics = server.analytics;
+    if (analytics == null) {
+      sendResult(AnalyticsSendTimingResult());
+      return;
+    }
+
+    var params = AnalyticsSendTimingParams.fromRequest(request);
+    analytics.sendTiming(params.event, params.millis, category: _clientId);
+    sendResult(AnalyticsSendTimingResult());
+  }
+}
diff --git a/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
new file mode 100644
index 0000000..678db0f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/diagnostic_get_diagnostics.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
+import 'package:analysis_server/src/utilities/progress.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+
+/// The handler for the `diagnostic.getDiagnostics` request.
+class DiagnosticGetDiagnosticsHandler extends LegacyHandler {
+  /// Initialize a newly created handler to be able to service requests for the
+  /// [server].
+  DiagnosticGetDiagnosticsHandler(AnalysisServer server, Request request,
+      CancellationToken cancellationToken)
+      : super(server, request, cancellationToken);
+
+  @override
+  Future<void> handle() async {
+    var contexts = server.driverMap.values.map(_extractDataFromDriver).toList();
+    sendResult(DiagnosticGetDiagnosticsResult(contexts));
+  }
+
+  /// Extract context data from the given [driver].
+  ContextData _extractDataFromDriver(AnalysisDriver driver) {
+    var explicitFileCount = driver.addedFiles.length;
+    var knownFileCount = driver.knownFiles.length;
+    return ContextData(driver.name, explicitFileCount,
+        knownFileCount - explicitFileCount, driver.numberOfFilesToAnalyze, []);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
similarity index 86%
rename from pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart
rename to pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
index 4abb1bf..2da9100 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_for_loop.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_for_each_to_for_loop.dart
@@ -5,7 +5,9 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -60,6 +62,7 @@
           builder.write(') ');
         });
         builder.addDeletion(range.endEnd(body, statement));
+        body.visitChildren(_ReturnVisitor(builder));
       });
     } else if (body is ExpressionFunctionBody) {
       await builder.addDartFileEdit(file, (builder) {
@@ -80,6 +83,7 @@
           builder.write(prefix);
           builder.write('}');
         });
+        body.visitChildren(_ReturnVisitor(builder));
       });
     }
   }
@@ -87,3 +91,14 @@
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static ConvertForEachToForLoop newInstance() => ConvertForEachToForLoop();
 }
+
+class _ReturnVisitor extends RecursiveAstVisitor<void> {
+  final DartFileEditBuilder builder;
+
+  _ReturnVisitor(this.builder);
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    builder.addSimpleReplacement(range.node(node), 'continue;');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 7239a67..a4e4594a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -44,6 +44,7 @@
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_child.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_flutter_children.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_for_each_to_for_loop.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_into_block_body.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_into_is_not.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_map_from_iterable_to_for_literal.dart';
@@ -51,7 +52,6 @@
 import 'package:analysis_server/src/services/correction/dart/convert_to_cascade.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_expression_function_body.dart';
-import 'package:analysis_server/src/services/correction/dart/convert_to_for_loop.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_initializing_formal.dart';
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index e19b27d..13b5829 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/domain_diagnostic.dart';
-import 'package:analysis_server/src/utilities/progress.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -34,7 +33,7 @@
     await server.onAnalysisComplete;
 
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request, NotCancelableToken())!;
+    var response = await waitResponse(request);
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
 
     expect(result.contexts, hasLength(1));
@@ -50,7 +49,7 @@
 
   Future<void> test_getDiagnostics_noRoot() async {
     var request = DiagnosticGetDiagnosticsParams().toRequest('0');
-    var response = handler.handleRequest(request, NotCancelableToken())!;
+    var response = await waitResponse(request);
     var result = DiagnosticGetDiagnosticsResult.fromResponse(response);
     expect(result.contexts, isEmpty);
   }
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index ba507ba..a2658e5 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -141,7 +141,7 @@
 print(1)
 }
 ''';
-    _addOverlay(testFile, testCode);
+    await _addOverlay(testFile, testCode);
     // ask for fixes
     await waitForTasksFinished();
     var errorFixes = await _getFixesAt('print(1)');
@@ -177,7 +177,7 @@
     // Configure the test file.
     testFile = convertPath('/aaa/main.dart');
     testCode = 'main() { new Foo(); }';
-    _addOverlay(testFile, testCode);
+    await _addOverlay(testFile, testCode);
 
     await waitForTasksFinished();
     doAllDeclarationsTrackerWork();
@@ -196,11 +196,11 @@
         isFalse);
   }
 
-  void _addOverlay(String name, String contents) {
+  Future<void> _addOverlay(String name, String contents) async {
     var request =
         AnalysisUpdateContentParams({name: AddContentOverlay(contents)})
             .toRequest('0');
-    handleSuccessfulRequest(request, handler: analysisHandler);
+    await waitResponse(request);
   }
 
   Future<List<AnalysisErrorFixes>> _getFixes(int offset) async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
index 88ac31a..75125cc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_for_each_to_for_loop_test.dart
@@ -143,4 +143,25 @@
 }
 ''');
   }
+
+  Future<void> test_return() async {
+    await resolveTestCode('''
+void f(List<String> list) {
+  list.forEach((e) {
+    if (e == 'whatever') {
+      return;
+    }
+  });
+}
+''');
+    await assertHasFix('''
+void f(List<String> list) {
+  for (var e in list) {
+    if (e == 'whatever') {
+      continue;
+    }
+  }
+}
+''');
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 8d8f03d..73aebd1 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -185,6 +185,10 @@
         return FieldFormalParameterMember(
             _typeProvider, p, _substitution, isLegacy);
       }
+      if (p is SuperFormalParameterElement) {
+        return SuperFormalParameterMember(
+            _typeProvider, p, _substitution, isLegacy);
+      }
       return ParameterMember(_typeProvider, p, _substitution, isLegacy);
     }).toList();
   }
@@ -998,6 +1002,64 @@
   }
 }
 
+class SuperFormalParameterMember extends ParameterMember
+    implements SuperFormalParameterElement {
+  factory SuperFormalParameterMember(
+    TypeProviderImpl typeProvider,
+    SuperFormalParameterElement declaration,
+    MapSubstitution substitution,
+    bool isLegacy,
+  ) {
+    var freshTypeParameters = _SubstitutedTypeParameters(
+      declaration.typeParameters,
+      substitution,
+    );
+    return SuperFormalParameterMember._(
+      typeProvider,
+      declaration,
+      freshTypeParameters.substitution,
+      isLegacy,
+      freshTypeParameters.elements,
+    );
+  }
+
+  SuperFormalParameterMember._(
+    TypeProviderImpl typeProvider,
+    SuperFormalParameterElement declaration,
+    MapSubstitution substitution,
+    bool isLegacy,
+    List<TypeParameterElement> typeParameters,
+  ) : super._(
+          typeProvider,
+          declaration,
+          substitution,
+          isLegacy,
+          typeParameters,
+        );
+
+  @override
+  bool get hasDefaultValue => declaration.hasDefaultValue;
+
+  @override
+  bool get isCovariant => declaration.isCovariant;
+
+  @override
+  ParameterElement? get superConstructorParameter {
+    var superConstructorParameter =
+        (declaration as SuperFormalParameterElement).superConstructorParameter;
+    if (superConstructorParameter == null) {
+      return null;
+    }
+
+    return ParameterMember(
+        _typeProvider, superConstructorParameter, _substitution, isLegacy);
+  }
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) =>
+      visitor.visitSuperFormalParameterElement(this);
+}
+
 class TopLevelVariableMember extends VariableMember
     implements TopLevelVariableElement {
   TopLevelVariableMember(
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index 34833f5..e4a67c3 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -647,6 +647,30 @@
 ''');
   }
 
+  test_superFormalParameter_explicitSuper_requiredNamed_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A({required this.a});
+}
+
+class B<T> extends A {
+  final int b;
+  const B(this.b, {required super.a}) : super();
+}
+
+const x = B<int>(2, a: 1);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_explicitSuper_requiredPositional() async {
     await assertNoErrorsInCode('''
 class A {
@@ -671,6 +695,30 @@
 ''');
   }
 
+  test_superFormalParameter_explicitSuper_requiredPositional_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A(this.a);
+}
+
+class B<T> extends A {
+  final int b;
+  const B(super.a, this.b) : super();
+}
+
+const x = B<int>(1, 2);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_implicitSuper_requiredNamed() async {
     await assertNoErrorsInCode('''
 class A {
@@ -695,6 +743,30 @@
 ''');
   }
 
+  test_superFormalParameter_implicitSuper_requiredNamed_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A({required this.a});
+}
+
+class B<T> extends A {
+  final int b;
+  const B(this.b, {required super.a});
+}
+
+const x = B<int>(2, a: 1);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   test_superFormalParameter_implicitSuper_requiredPositional() async {
     await assertNoErrorsInCode('''
 class A {
@@ -719,6 +791,30 @@
 ''');
   }
 
+  test_superFormalParameter_implicitSuper_requiredPositional_generic() async {
+    await assertNoErrorsInCode('''
+class A {
+  final int a;
+  const A(this.a);
+}
+
+class B<T> extends A {
+  final int b;
+  const B(super.a, this.b);
+}
+
+const x = B<int>(1, 2);
+''');
+
+    var value = findElement.topVar('x').evaluationResult.value;
+    assertDartObjectText(value, r'''
+B<int>
+  (super): A
+    a: int 1
+  b: int 2
+''');
+  }
+
   void _assertTopVarConstValue(String name, String expected) {
     assertDartObjectText(_topVarConstResult(name).value, expected);
   }
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index b5bc665..fdca05f 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -1840,7 +1840,7 @@
             parameters
               requiredPositional final super.a @63
                 type: int
-                superConstructorParameter: ParameterMember
+                superConstructorParameter: SuperFormalParameterMember
                   base: a@103
                   substitution: {T: String}
             superConstructor: ConstructorMember
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 077f5e1..0f4ece3 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -3002,7 +3002,7 @@
     }
 
     if (type.nullability == Nullability.undetermined) {
-      throw UnsupportedError('Undetermined Nullability');
+      _undeterminedNullabilityError(type);
     }
 
     // Emit non-nullable version directly.
@@ -3037,7 +3037,7 @@
     typeRep ??= _emitFutureOrNameNoInterop();
 
     if (type.declaredNullability == Nullability.undetermined) {
-      throw UnsupportedError('Undetermined Nullability');
+      _undeterminedNullabilityError(type);
     }
 
     // Emit non-nullable version directly.
@@ -3051,6 +3051,11 @@
     return _typeTable.nameType(type, typeRep);
   }
 
+  void /* Never */ _undeterminedNullabilityError(DartType type) =>
+      throw UnsupportedError(
+          'Undetermined Nullability encounted while compiling '
+          '${currentLibrary.fileUri}, which contains the type: $type.');
+
   /// Wraps [typeRep] in the appropriate wrapper for the given [nullability].
   ///
   /// Non-nullable and undetermined nullability will not cause any wrappers to
diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
index 8672ea7..49448b4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
@@ -27,6 +27,7 @@
         messageDeclaredMemberConflictsWithInheritedMember,
         messageDeclaredMemberConflictsWithInheritedMemberCause,
         messageDeclaredMemberConflictsWithOverriddenMembersCause,
+        messageEnumAbstractMember,
         messageInheritedMembersConflict,
         messageInheritedMembersConflictCause1,
         messageInheritedMembersConflictCause2,
@@ -2351,14 +2352,19 @@
     Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
     for (ClassMember declaration in unfoldDeclarations(abstractMembers)) {
       if (isNameVisibleIn(declaration.name, classBuilder.libraryBuilder)) {
-        String name = declaration.fullNameForErrors;
-        String className = declaration.classBuilder.fullNameForErrors;
-        String displayName =
-            declaration.isSetter ? "$className.$name=" : "$className.$name";
-        contextMap[displayName] = templateMissingImplementationCause
-            .withArguments(displayName)
-            .withLocation(
-                declaration.fileUri, declaration.charOffset, name.length);
+        if (classBuilder.isEnum && declaration.classBuilder == classBuilder) {
+          classBuilder.addProblem(messageEnumAbstractMember,
+              declaration.charOffset, declaration.name.text.length);
+        } else {
+          String name = declaration.fullNameForErrors;
+          String className = declaration.classBuilder.fullNameForErrors;
+          String displayName =
+              declaration.isSetter ? "$className.$name=" : "$className.$name";
+          contextMap[displayName] = templateMissingImplementationCause
+              .withArguments(displayName)
+              .withLocation(
+                  declaration.fileUri, declaration.charOffset, name.length);
+        }
       }
     }
     if (contextMap.isEmpty) return;
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d7d8f6a1..078af67 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -214,6 +214,8 @@
 DuplicatedNamedArgument/example: Fail
 DuplicatedParameterName/example: Fail
 Encoding/analyzerCode: Fail
+EnumAbstractMember/analyzerCode: Fail
+EnumAbstractMember/example: Fail
 EnumConstantSameNameAsEnclosing/example: Fail
 EnumConstructorSuperInitializer/analyzerCode: Fail
 EnumConstructorSuperInitializer/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index dfd77a5..c2b37b6 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -5577,3 +5577,6 @@
 
 EnumImplementerContainsRestrictedInstanceDeclaration:
   problemMessage: "'#name' has 'Enum' as a superinterface and can't contain non-static members with name '#name2'."
+
+EnumAbstractMember:
+  problemMessage: "Enums can't declare abstract members."
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart
new file mode 100644
index 0000000..25589b4
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+enum E1 {
+  element;
+
+  void foo(); // Error.
+}
+
+enum E2 {
+  element;
+
+  int get foo; // Error.
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val); // Error.
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+enum E4 implements InterfaceMethod { // Error.
+  element
+}
+
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+enum E5 implements InterfaceGetter { // Error.
+  element
+}
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E6 implements InterfaceSetter { // Error.
+  element
+}
+
+mixin MethodImplementation {
+  void foo() {}
+}
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo(); // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect
new file mode 100644
index 0000000..01185de
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..7bc3967
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.strong.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation extends core::_Enum implements self::MethodImplementation /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  method foo() → void {}
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect
new file mode 100644
index 0000000..f15df76
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline.expect
@@ -0,0 +1,47 @@
+enum E1 {
+  element;
+
+  void foo();
+}
+
+enum E2 {
+  element;
+
+  int get foo;
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val);
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+enum E4 implements InterfaceMethod { element }
+
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+enum E5 implements InterfaceGetter { element }
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E6 implements InterfaceSetter { element }
+
+mixin MethodImplementation {
+  void foo() {}
+}
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7f0a7bd
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.textual_outline_modelled.expect
@@ -0,0 +1,46 @@
+abstract class InterfaceGetter {
+  int get foo;
+}
+
+abstract class InterfaceMethod {
+  void foo();
+}
+
+abstract class InterfaceSetter {
+  void set foo(int val);
+}
+
+enum E1 {
+  element;
+
+  void foo();
+}
+
+enum E2 {
+  element;
+
+  int get foo;
+}
+
+enum E3 {
+  element;
+
+  void set foo(int val);
+}
+
+enum E4 implements InterfaceMethod { element }
+
+enum E5 implements InterfaceGetter { element }
+
+enum E6 implements InterfaceSetter { element }
+
+enum E7 with MethodImplementation {
+  element;
+
+  void foo();
+}
+
+main() {}
+mixin MethodImplementation {
+  void foo() {}
+}
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect
new file mode 100644
index 0000000..6548f65
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect
new file mode 100644
index 0000000..6548f65
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.modular.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect
new file mode 100644
index 0000000..ea495c1
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.outline.expect
@@ -0,0 +1,173 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = const <self::E1>[self::E1::element];
+  static const field self::E1 element = const self::E1::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = const <self::E2>[self::E2::element];
+  static const field self::E2 element = const self::E2::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = const <self::E3>[self::E3::element];
+  static const field self::E3 element = const self::E3::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = const <self::E4>[self::E4::element];
+  static const field self::E4 element = const self::E4::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = const <self::E5>[self::E5::element];
+  static const field self::E5 element = const self::E5::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = const <self::E6>[self::E6::element];
+  static const field self::E6 element = const self::E6::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void
+    ;
+}
+abstract class _E7&_Enum&MethodImplementation = core::_Enum with self::MethodImplementation /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  mixin-super-stub method foo() → void
+    return super.{self::MethodImplementation::foo}();
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = const <self::E7>[self::E7::element];
+  static const field self::E7 element = const self::E7::•(0, "element");
+  const constructor •(core::int index, core::String name) → self::E7
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:5:6 -> ListConstant(const <E1*>[const E1{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:6:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:11:6 -> ListConstant(const <E2*>[const E2{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:12:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:17:6 -> ListConstant(const <E3*>[const E3{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:18:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:27:6 -> ListConstant(const <E4*>[const E4{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:28:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:35:6 -> ListConstant(const <E5*>[const E5{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:36:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:43:6 -> ListConstant(const <E6*>[const E6{_Enum.index: 0, _Enum._name: "element"}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:44:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "element"})
+Evaluated: ListLiteral @ org-dartlang-testcase:///abstract_members.dart:51:6 -> ListConstant(const <E7*>[const E7{}])
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///abstract_members.dart:52:3 -> InstanceConstant(const E7{})
+Extra constant evaluation: evaluated: 50, effectively constant: 14
diff --git a/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect
new file mode 100644
index 0000000..08739b0
--- /dev/null
+++ b/pkg/front_end/testcases/enhanced_enums/abstract_members.dart.weak.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:8:8: Error: Enums can't declare abstract members.
+//   void foo(); // Error.
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:14:11: Error: Enums can't declare abstract members.
+//   int get foo; // Error.
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:20:12: Error: Enums can't declare abstract members.
+//   void set foo(int val); // Error.
+//            ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:27:6: Error: The non-abstract class 'E4' is missing implementations for these members:
+//  - InterfaceMethod.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E4 implements InterfaceMethod { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:24:8: Context: 'InterfaceMethod.foo' is defined here.
+//   void foo();
+//        ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:35:6: Error: The non-abstract class 'E5' is missing implementations for these members:
+//  - InterfaceGetter.foo
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E5 implements InterfaceGetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:32:11: Context: 'InterfaceGetter.foo' is defined here.
+//   int get foo;
+//           ^^^
+//
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:43:6: Error: The non-abstract class 'E6' is missing implementations for these members:
+//  - InterfaceSetter.foo=
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// enum E6 implements InterfaceSetter { // Error.
+//      ^^
+// pkg/front_end/testcases/enhanced_enums/abstract_members.dart:40:12: Context: 'InterfaceSetter.foo=' is defined here.
+//   void set foo(int val);
+//            ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class E1 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E1> values = #C4;
+  static const field self::E1 element = #C3;
+  const constructor •(core::int index, core::String name) → self::E1
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E1.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+class E2 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E2> values = #C6;
+  static const field self::E2 element = #C5;
+  const constructor •(core::int index, core::String name) → self::E2
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E2.${this.{core::_Enum::_name}{core::String}}";
+  abstract get foo() → core::int;
+}
+class E3 extends core::_Enum /*isEnum*/  {
+  static const field core::List<self::E3> values = #C8;
+  static const field self::E3 element = #C7;
+  const constructor •(core::int index, core::String name) → self::E3
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E3.${this.{core::_Enum::_name}{core::String}}";
+  abstract set foo(core::int val) → void;
+}
+abstract class InterfaceMethod extends core::Object {
+  synthetic constructor •() → self::InterfaceMethod
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class E4 extends core::_Enum implements self::InterfaceMethod /*isEnum*/  {
+  static const field core::List<self::E4> values = #C10;
+  static const field self::E4 element = #C9;
+  const constructor •(core::int index, core::String name) → self::E4
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E4.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceGetter extends core::Object {
+  synthetic constructor •() → self::InterfaceGetter
+    : super core::Object::•()
+    ;
+  abstract get foo() → core::int;
+}
+class E5 extends core::_Enum implements self::InterfaceGetter /*isEnum*/  {
+  static const field core::List<self::E5> values = #C12;
+  static const field self::E5 element = #C11;
+  const constructor •(core::int index, core::String name) → self::E5
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E5.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class InterfaceSetter extends core::Object {
+  synthetic constructor •() → self::InterfaceSetter
+    : super core::Object::•()
+    ;
+  abstract set foo(core::int val) → void;
+}
+class E6 extends core::_Enum implements self::InterfaceSetter /*isEnum*/  {
+  static const field core::List<self::E6> values = #C14;
+  static const field self::E6 element = #C13;
+  const constructor •(core::int index, core::String name) → self::E6
+    : super core::_Enum::•(index, name)
+    ;
+  method toString() → core::String
+    return "E6.${this.{core::_Enum::_name}{core::String}}";
+}
+abstract class MethodImplementation extends core::Object /*isMixinDeclaration*/  {
+  method foo() → void {}
+}
+abstract class _E7&_Enum&MethodImplementation extends core::_Enum implements self::MethodImplementation /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
+  const synthetic constructor •(core::int index, core::String _name) → self::_E7&_Enum&MethodImplementation
+    : super core::_Enum::•(index, _name)
+    ;
+  method foo() → void {}
+}
+class E7 extends self::_E7&_Enum&MethodImplementation /*isEnum*/  {
+  static const field core::List<self::E7> values = #C16;
+  static const field self::E7 element = #C15;
+  const constructor •(core::int index, core::String name) → self::E7
+    : super self::_E7&_Enum&MethodImplementation::•(index, name)
+    ;
+  method toString() → core::String
+    return "E7.${this.{core::_Enum::_name}{core::String}}";
+  abstract method foo() → void;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "element"
+  #C3 = self::E1 {index:#C1, _name:#C2}
+  #C4 = <self::E1*>[#C3]
+  #C5 = self::E2 {index:#C1, _name:#C2}
+  #C6 = <self::E2*>[#C5]
+  #C7 = self::E3 {index:#C1, _name:#C2}
+  #C8 = <self::E3*>[#C7]
+  #C9 = self::E4 {index:#C1, _name:#C2}
+  #C10 = <self::E4*>[#C9]
+  #C11 = self::E5 {index:#C1, _name:#C2}
+  #C12 = <self::E5*>[#C11]
+  #C13 = self::E6 {index:#C1, _name:#C2}
+  #C14 = <self::E6*>[#C13]
+  #C15 = self::E7 {index:#C1, _name:#C2}
+  #C16 = <self::E7*>[#C15]
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///abstract_members.dart:
+- E1. (from org-dartlang-testcase:///abstract_members.dart:5:6)
+- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
+- E2. (from org-dartlang-testcase:///abstract_members.dart:11:6)
+- E3. (from org-dartlang-testcase:///abstract_members.dart:17:6)
+- E4. (from org-dartlang-testcase:///abstract_members.dart:27:6)
+- E5. (from org-dartlang-testcase:///abstract_members.dart:35:6)
+- E6. (from org-dartlang-testcase:///abstract_members.dart:43:6)
+- E7. (from org-dartlang-testcase:///abstract_members.dart:51:6)
+- _E7&_Enum&MethodImplementation. (from org-dartlang-testcase:///abstract_members.dart:51:6)
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index db4f022..34a00ff 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -105,8 +105,8 @@
 dart2js:              Compile to JavaScript using dart2js.
 dart2analyzer:        Perform static analysis on Dart code using the analyzer.
 compare_analyzer_cfe: Compare analyzer and common front end representations.
-dartdevc:             Compile to JavaScript using dart2js.
-dartdevk:             Compile to JavaScript using dartdevk.
+dartdevc:             Compile to JavaScript using dartdevc.
+dartdevk:             Compile to JavaScript using dartdevc (same as dartdevc).
 app_jitk:             Compile the Dart code into Kernel and then into an app
                       snapshot.
 dartk:                Compile the Dart code into Kernel before running test.
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 5f2e056..d73c065 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -680,6 +680,9 @@
   Dart_Handle type = GetDartType(kIOLibURL, "OSError");
   ASSERT(!Dart_IsError(type));
   Dart_Handle args[2];
+  if (os_error->code() == 0) {
+    FATAL("Fatal error OSError (code : 0)  DartUtils::NewDartOSError");
+  }
   args[0] = NewString(os_error->message());
   args[1] = Dart_NewInteger(os_error->code());
   return Dart_New(type, Dart_Null(), 2, args);
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 8bac5cf..69cbbf7 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -205,22 +205,37 @@
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return _lseeki64(handle_->fd(), 0, SEEK_CUR);
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  LARGE_INTEGER zero_offset;
+  zero_offset.QuadPart = 0;
+  LARGE_INTEGER position;
+  if (!SetFilePointerEx(handle, zero_offset, &position, FILE_CURRENT)) {
+    return -1L;
+  }
+  return position.QuadPart;
 }
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return _lseeki64(handle_->fd(), position, SEEK_SET) >= 0;
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  LARGE_INTEGER requested_position;
+  requested_position.QuadPart = position;
+  return SetFilePointerEx(handle, requested_position,
+                          /*lpNewFilePointer=*/nullptr, FILE_BEGIN);
 }
 
 bool File::Truncate(int64_t length) {
-  ASSERT(handle_->fd() >= 0);
-  return _chsize_s(handle_->fd(), length) == 0;
+  if (!SetPosition(length)) {
+    return false;
+  }
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  return SetEndOfFile(handle);
 }
 
 bool File::Flush() {
   ASSERT(handle_->fd());
-  return _commit(handle_->fd()) != -1;
+  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
+  return FlushFileBuffers(handle);
 }
 
 bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index 21bfadf..708bda4 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -914,7 +914,18 @@
       Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
   OSError os_error;
   SocketBase::GetError(socket->fd(), &os_error);
-  Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+  if (os_error.code() != 0) {
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+  } else {
+    Dart_SetReturnValue(args, Dart_Null());
+  }
+}
+
+void FUNCTION_NAME(Socket_Fatal)(Dart_NativeArguments args) {
+  Dart_Handle msg = Dart_GetNativeArgument(args, 0);
+  const char* msgStr =
+      (!Dart_IsNull(msg)) ? DartUtils::GetStringValue(msg) : nullptr;
+  FATAL("Fatal error in dart:io (socket): %s", msgStr);
 }
 
 void FUNCTION_NAME(Socket_GetFD)(Dart_NativeArguments args) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index e7778e6..795745a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -3421,6 +3421,10 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+
   EnterFrame(1 << FP, 0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index e42ac60..e2b39f7 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -1905,6 +1905,13 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+  COMPILE_ASSERT(IsCalleeSavedRegister(NULL_REG));
+  COMPILE_ASSERT(IsCalleeSavedRegister(HEAP_BITS));
+  COMPILE_ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG));
+
   Push(FP);
   mov(FP, SP);
   ReserveAlignedFrameSpace(frame_space);
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index de73c0f..05d3863 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -2738,6 +2738,9 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+
   EnterFrame(0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.cc b/runtime/vm/compiler/assembler/assembler_riscv.cc
index ff77b69..335f0ea 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.cc
+++ b/runtime/vm/compiler/assembler/assembler_riscv.cc
@@ -3478,10 +3478,13 @@
 }
 
 void Assembler::TransitionNativeToGenerated(Register state,
-                                            bool exit_safepoint) {
+                                            bool exit_safepoint,
+                                            bool ignore_unwind_in_progress) {
   if (exit_safepoint) {
-    ExitFullSafepoint(state);
+    ExitFullSafepoint(state, ignore_unwind_in_progress);
   } else {
+    // flag only makes sense if we are leaving safepoint
+    ASSERT(!ignore_unwind_in_progress);
 #if defined(DEBUG)
     // Ensure we've already left the safepoint.
     ASSERT(target::Thread::full_safepoint_state_acquired() != 0);
@@ -3540,7 +3543,8 @@
   Bind(&done);
 }
 
-void Assembler::ExitFullSafepoint(Register state) {
+void Assembler::ExitFullSafepoint(Register state,
+                                  bool ignore_unwind_in_progress) {
   // We generate the same number of instructions whether or not the slow-path is
   // forced, for consistency with EnterFullSafepoint.
   Register addr = RA;
@@ -3566,7 +3570,14 @@
   }
 
   Bind(&slow_path);
-  lx(addr, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  if (ignore_unwind_in_progress) {
+    lx(addr,
+       Address(THR,
+               target::Thread::
+                   exit_safepoint_ignore_unwind_in_progress_stub_offset()));
+  } else {
+    lx(addr, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  }
   lx(addr, FieldAddress(addr, target::Code::entry_point_offset()));
   jalr(addr);
 
@@ -3605,6 +3616,16 @@
   CheckCodePointer();
 }
 
+void Assembler::RestorePoolPointer() {
+  if (FLAG_precompiled_mode) {
+    lx(PP, Address(THR, target::Thread::global_object_pool_offset()));
+  } else {
+    lx(PP, Address(FP, target::frame_layout.code_from_fp * target::kWordSize));
+    lx(PP, FieldAddress(PP, target::Code::object_pool_offset()));
+  }
+  subi(PP, PP, kHeapObjectTag);  // Pool in PP is untagged!
+}
+
 // Restores the values of the registers that are blocked to cache some values
 // e.g. BARRIER_MASK and NULL_REG.
 void Assembler::RestorePinnedRegisters() {
@@ -3766,21 +3787,33 @@
 #undef __
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(NULL_REG));
+  COMPILE_ASSERT(IsCalleeSavedRegister(WRITE_BARRIER_MASK));
+  COMPILE_ASSERT(IsCalleeSavedRegister(DISPATCH_TABLE_REG));
+  // Need to save.
+  COMPILE_ASSERT(!IsCalleeSavedRegister(PP));
+
   // N.B. The ordering here is important. We must never read beyond SP or
   // it may have already been clobbered by a signal handler.
-  subi(SP, SP, frame_space + 2 * target::kWordSize);
-  sx(RA, Address(SP, frame_space + 1 * target::kWordSize));
-  sx(FP, Address(SP, frame_space + 0 * target::kWordSize));
-  addi(FP, SP, frame_space + 2 * target::kWordSize);
+  subi(SP, SP, frame_space + 3 * target::kWordSize);
+  sx(RA, Address(SP, frame_space + 2 * target::kWordSize));
+  sx(FP, Address(SP, frame_space + 1 * target::kWordSize));
+  sx(PP, Address(SP, frame_space + 0 * target::kWordSize));
+  addi(FP, SP, frame_space + 3 * target::kWordSize);
+  const intptr_t kAbiStackAlignment = 16;  // For both 32 and 64 bit.
+  andi(SP, SP, ~(kAbiStackAlignment - 1));
 }
 
 void Assembler::LeaveCFrame() {
   // N.B. The ordering here is important. We must never read beyond SP or
   // it may have already been clobbered by a signal handler.
-  subi(SP, FP, 2 * target::kWordSize);
-  lx(FP, Address(SP, 0 * target::kWordSize));
-  lx(RA, Address(SP, 1 * target::kWordSize));
-  addi(SP, SP, 2 * target::kWordSize);
+  subi(SP, FP, 3 * target::kWordSize);
+  lx(PP, Address(SP, 0 * target::kWordSize));
+  lx(FP, Address(SP, 1 * target::kWordSize));
+  lx(RA, Address(SP, 2 * target::kWordSize));
+  addi(SP, SP, 3 * target::kWordSize);
 }
 
 // A0: Receiver
diff --git a/runtime/vm/compiler/assembler/assembler_riscv.h b/runtime/vm/compiler/assembler/assembler_riscv.h
index 582a8ae..d24ea42 100644
--- a/runtime/vm/compiler/assembler/assembler_riscv.h
+++ b/runtime/vm/compiler/assembler/assembler_riscv.h
@@ -1214,12 +1214,15 @@
                                    Register new_exit_frame,
                                    Register new_exit_through_ffi,
                                    bool enter_safepoint);
-  void TransitionNativeToGenerated(Register scratch, bool exit_safepoint);
+  void TransitionNativeToGenerated(Register scratch,
+                                   bool exit_safepoint,
+                                   bool ignore_unwind_in_progress = false);
   void EnterFullSafepoint(Register scratch);
-  void ExitFullSafepoint(Register scratch);
+  void ExitFullSafepoint(Register scratch, bool ignore_unwind_in_progress);
 
   void CheckCodePointer();
   void RestoreCodePointer();
+  void RestorePoolPointer();
 
   // Restores the values of the registers that are blocked to cache some values
   // e.g. BARRIER_MASK and NULL_REG.
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index 14f4bad..bfc1a69 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -2087,6 +2087,10 @@
 }
 
 void Assembler::EnterCFrame(intptr_t frame_space) {
+  // Already saved.
+  COMPILE_ASSERT(IsCalleeSavedRegister(THR));
+  COMPILE_ASSERT(IsCalleeSavedRegister(PP));
+
   EnterFrame(0);
   ReserveAlignedFrameSpace(frame_space);
 }
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 3dab29a..c04289b 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1427,8 +1427,7 @@
   const Register temp1 = locs()->temp(2).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ mov(saved_fp_or_sp,
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 7ba8603..2467df7 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1253,9 +1253,8 @@
   const Register temp_csp = locs()->temp(3).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << temp_csp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
+  ASSERT(IsCalleeSavedRegister(temp_csp));
   // Other temps don't need to be preserved.
 
   __ mov(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index d608637..0d29e71 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1022,8 +1022,7 @@
   const Register saved_fp_or_sp = locs()->temp(1).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ movl(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
diff --git a/runtime/vm/compiler/backend/il_riscv.cc b/runtime/vm/compiler/backend/il_riscv.cc
index 9f576c9..5f31d92 100644
--- a/runtime/vm/compiler/backend/il_riscv.cc
+++ b/runtime/vm/compiler/backend/il_riscv.cc
@@ -1425,8 +1425,7 @@
   ASSERT(saved_fp_or_sp != target);
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters &
-          (1 << saved_fp_or_sp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_fp_or_sp));
   // Other temps don't need to be preserved.
 
   __ mv(saved_fp_or_sp, is_leaf_ ? SPREG : FPREG);
@@ -1459,6 +1458,9 @@
 
     EmitCall(compiler, target);
 
+    ASSERT(!IsCalleeSavedRegister(PP));
+    __ RestorePoolPointer();
+
 #if !defined(PRODUCT)
     __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
     __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 9a12a65..f461761 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1204,8 +1204,8 @@
   const Register saved_sp = locs()->temp(2).reg();
 
   // Ensure these are callee-saved register and are preserved across the call.
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << saved_sp)) != 0);
-  ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << saved_fp)) != 0);
+  ASSERT(IsCalleeSavedRegister(saved_sp));
+  ASSERT(IsCalleeSavedRegister(saved_fp));
   // Other temps don't need to be preserved.
 
   if (is_leaf_) {
@@ -5383,7 +5383,7 @@
   // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
   // double arguments and XMM0 to return the result.
   ASSERT(R13 != CALLEE_SAVED_TEMP);
-  ASSERT(((1 << R13) & CallingConventions::kCalleeSaveCpuRegisters) != 0);
+  ASSERT(IsCalleeSavedRegister(R13));
 
   if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
     ASSERT(InputCount() == 2);
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 754852e..2c59183 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -588,13 +588,15 @@
       if (reg == PC) continue;
 #elif defined(TARGET_ARCH_ARM64)
       if (reg == R31) continue;
+#elif defined(TARGET_ARCH_RISCV32) || defined(TARGET_ARCH_RISCV64)
+      if (reg == ZR || reg == TP || reg == GP) continue;
 #endif
       Add(Location::RegisterLocation(reg));
     }
 
-      for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
-        Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
-      }
+    for (intptr_t i = kNumberOfFpuRegisters - 1; i >= 0; --i) {
+      Add(Location::FpuRegisterLocation(static_cast<FpuRegister>(i)));
+    }
   }
 
   void AddAllArgumentRegisters() {
diff --git a/runtime/vm/compiler/stub_code_compiler_riscv.cc b/runtime/vm/compiler/stub_code_compiler_riscv.cc
index 20f878b..e63cc88 100644
--- a/runtime/vm/compiler/stub_code_compiler_riscv.cc
+++ b/runtime/vm/compiler/stub_code_compiler_riscv.cc
@@ -216,16 +216,16 @@
   RegisterSet all_registers;
   all_registers.AddAllGeneralRegisters();
 
-  __ EnterFrame(0);
   __ PushRegisters(all_registers);
+  __ EnterFrame(0);
 
   __ ReserveAlignedFrameSpace(0);
 
   __ lx(TMP, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
   __ jalr(TMP);
 
-  __ PopRegisters(all_registers);
   __ LeaveFrame();
+  __ PopRegisters(all_registers);
   __ ret();
 }
 
@@ -234,8 +234,8 @@
   RegisterSet all_registers;
   all_registers.AddAllGeneralRegisters();
 
-  __ EnterFrame(0);
   __ PushRegisters(all_registers);
+  __ EnterFrame(0);
 
   __ ReserveAlignedFrameSpace(0);
 
@@ -248,8 +248,8 @@
   __ lx(TMP, Address(THR, runtime_entry_offset));
   __ jalr(TMP);
 
-  __ PopRegisters(all_registers);
   __ LeaveFrame();
+  __ PopRegisters(all_registers);
   __ ret();
 }
 
@@ -3005,12 +3005,18 @@
 #error Unimplemented
 #endif
   Label exit_through_non_ffi;
-  // Check if we exited generated from FFI. If so do transition.
+  // Check if we exited generated from FFI. If so do transition - this is needed
+  // because normally runtime calls transition back to generated via destructor
+  // of TransititionGeneratedToVM/Native that is part of runtime boilerplate
+  // code (see DEFINE_RUNTIME_ENTRY_IMPL in runtime_entry.h). Ffi calls don't
+  // have this boilerplate, don't have this stack resource, have to transition
+  // explicitly.
   __ LoadFromOffset(TMP, THR,
                     compiler::target::Thread::exit_through_ffi_offset());
   __ LoadImmediate(TMP2, target::Thread::exit_through_ffi());
   __ bne(TMP, TMP2, &exit_through_non_ffi);
-  __ Stop("Unimplemented");
+  __ TransitionNativeToGenerated(TMP, /*leave_safepoint=*/true,
+                                 /*ignore_unwind_in_progress=*/true);
   __ Bind(&exit_through_non_ffi);
 
   // Refresh pinned registers values (inc. write barrier mask and null object).
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index f1113d3..1552a72 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -23,6 +23,7 @@
 #include "vm/stub_code.h"
 #include "vm/timeline.h"
 #include "vm/type_testing_stubs.h"
+#include "vm/zone_text_buffer.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #include "vm/compiler/backend/code_statistics.h"
@@ -1056,48 +1057,81 @@
   }
 }
 
-static void EnsureAssemblerIdentifier(char* label) {
+static void AddAssemblerIdentifier(ZoneTextBuffer* printer, const char* label) {
+  ASSERT(label[0] != '.');
   for (char c = *label; c != '\0'; c = *++label) {
+#define OP(dart_name, asm_name)                                                \
+  if (strncmp(label, dart_name, strlen(dart_name)) == 0) {                     \
+    printer->AddString(asm_name);                                              \
+    label += (strlen(dart_name) - 1);                                          \
+    continue;                                                                  \
+  }
+
+    OP("+", "operator_add")
+    OP("-", "operator_sub")
+    OP("*", "operator_mul")
+    OP("/", "operator_div")
+    OP("~/", "operator_truncdiv")
+    OP("%", "operator_mod")
+    OP("~", "operator_not")
+    OP("&", "operator_and")
+    OP("|", "operator_or")
+    OP("^", "operator_xor")
+    OP("<<", "operator_sll")
+    OP(">>>", "operator_srl")
+    OP(">>", "operator_sra")
+    OP("[]=", "operator_set")
+    OP("[]", "operator_get")
+    OP("unary-", "operator_neg")
+    OP("==", "operator_eq")
+    OP("<anonymous closure>", "anonymous_closure")
+    OP("<=", "operator_le")
+    OP("<", "operator_lt")
+    OP(">=", "operator_ge")
+    OP(">", "operator_gt")
+#undef OP
+
     if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
-        ((c >= '0') && (c <= '9'))) {
+        ((c >= '0') && (c <= '9')) || (c == '.')) {
+      printer->AddChar(c);
       continue;
     }
-    *label = '_';
+    printer->AddChar('_');
   }
 }
 
 const char* SnapshotTextObjectNamer::SnapshotNameFor(intptr_t code_index,
                                                      const Code& code) {
   ASSERT(!code.IsNull());
-  const char* prefix = FLAG_precompiled_mode ? "Precompiled_" : "";
   owner_ = code.owner();
   if (owner_.IsNull()) {
     insns_ = code.instructions();
     const char* name = StubCode::NameOfStub(insns_.EntryPoint());
     ASSERT(name != nullptr);
-    return OS::SCreate(zone_, "%sStub_%s", prefix, name);
+    return OS::SCreate(zone_, "Stub_%s", name);
   }
   // The weak reference to the Code's owner should never have been removed via
   // an intermediate serialization, since WSRs are only introduced during
   // precompilation.
   owner_ = WeakSerializationReference::Unwrap(owner_);
   ASSERT(!owner_.IsNull());
+  ZoneTextBuffer printer(zone_);
   if (owner_.IsClass()) {
-    string_ = Class::Cast(owner_).Name();
-    const char* name = string_.ToCString();
-    EnsureAssemblerIdentifier(const_cast<char*>(name));
-    return OS::SCreate(zone_, "%sAllocationStub_%s_%" Pd, prefix, name,
-                       code_index);
+    const char* name = Class::Cast(owner_).ScrubbedNameCString();
+    printer.AddString("AllocationStub_");
+    AddAssemblerIdentifier(&printer, name);
   } else if (owner_.IsAbstractType()) {
     const char* name = namer_.StubNameForType(AbstractType::Cast(owner_));
-    return OS::SCreate(zone_, "%s%s_%" Pd, prefix, name, code_index);
+    printer.AddString(name);
   } else if (owner_.IsFunction()) {
-    const char* name = Function::Cast(owner_).ToQualifiedCString();
-    EnsureAssemblerIdentifier(const_cast<char*>(name));
-    return OS::SCreate(zone_, "%s%s_%" Pd, prefix, name, code_index);
+    const char* name = Function::Cast(owner_).QualifiedScrubbedNameCString();
+    AddAssemblerIdentifier(&printer, name);
   } else {
     UNREACHABLE();
   }
+
+  printer.Printf("_%" Pd, code_index);
+  return printer.buffer();
 }
 
 const char* SnapshotTextObjectNamer::SnapshotNameFor(
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index db1c8a1..2a287b9 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9761,6 +9761,13 @@
   return Symbols::New(thread, printer.buffer());
 }
 
+const char* Function::QualifiedScrubbedNameCString() const {
+  Thread* thread = Thread::Current();
+  ZoneTextBuffer printer(thread->zone());
+  PrintName(NameFormattingParams(kScrubbedName), &printer);
+  return printer.buffer();
+}
+
 StringPtr Function::QualifiedUserVisibleName() const {
   Thread* thread = Thread::Current();
   ZoneTextBuffer printer(thread->zone());
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ac28ae3..cb2be7d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2663,6 +2663,7 @@
   void PrintName(const NameFormattingParams& params,
                  BaseTextBuffer* printer) const;
   StringPtr QualifiedScrubbedName() const;
+  const char* QualifiedScrubbedNameCString() const;
   StringPtr QualifiedUserVisibleName() const;
   const char* QualifiedUserVisibleNameCString() const;
 
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 7c9925a..d0bddf8 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -877,8 +877,8 @@
         // the SO_ERROR option at level SOL_SOCKET to determine whether
         // connect() completed successfully (SO_ERROR is zero) or
         // unsuccessfully.
-        final OSError osError = socket.nativeGetError();
-        if (osError.errorCode != 0) {
+        final osError = socket.nativeGetError();
+        if (osError != null) {
           socket.close();
           error ??= osError;
           connectNext();
@@ -1404,8 +1404,12 @@
 
         if (i == errorEvent) {
           if (!isClosing) {
-            final err = nativeGetError();
-            reportError(err, null, err.message);
+            final osError = nativeGetError();
+            if (osError == null) {
+              _nativeFatal("Reporting error with OSError code of 0");
+            } else {
+              reportError(osError, null, osError.message);
+            }
           }
         } else if (!isClosed) {
           // If the connection is closed right after it's accepted, there's a
@@ -1688,7 +1692,7 @@
   @pragma("vm:external-name", "Socket_GetFD")
   external int get fd;
   @pragma("vm:external-name", "Socket_GetError")
-  external OSError nativeGetError();
+  external OSError? nativeGetError();
   @pragma("vm:external-name", "Socket_GetOption")
   external nativeGetOption(int option, int protocol);
   @pragma("vm:external-name", "Socket_GetRawOption")
@@ -1703,6 +1707,8 @@
   @pragma("vm:external-name", "Socket_LeaveMulticast")
   external void nativeLeaveMulticast(
       Uint8List addr, Uint8List? interfaceAddr, int interfaceIndex);
+  @pragma("vm:external-name", "Socket_Fatal")
+  external static void _nativeFatal(msg);
 }
 
 class _RawServerSocket extends Stream<RawSocket> implements RawServerSocket {
diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart
index d78e512..95ad2e4 100644
--- a/tests/standalone/io/file_test.dart
+++ b/tests/standalone/io/file_test.dart
@@ -756,6 +756,7 @@
     try {
       openedFile.truncateSync(-5);
     } on FileSystemException catch (ex) {
+      Expect.notEquals(ex.osError!.errorCode, 0);
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
diff --git a/tests/standalone_2/io/file_test.dart b/tests/standalone_2/io/file_test.dart
index a3a4823..851d2c3 100644
--- a/tests/standalone_2/io/file_test.dart
+++ b/tests/standalone_2/io/file_test.dart
@@ -760,6 +760,7 @@
     try {
       openedFile.truncateSync(-5);
     } on FileSystemException catch (ex) {
+      Expect.notEquals(ex.osError.errorCode, 0);
       exceptionCaught = true;
     } on Exception catch (ex) {
       wrongExceptionCaught = true;
diff --git a/tools/VERSION b/tools/VERSION
index 41c7365..d9a3698 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 262
+PRERELEASE 263
 PRERELEASE_PATCH 0
\ No newline at end of file
