diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 18686f8..12e1c33 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-09-18T09:56:27.880444",
+  "generated": "2020-08-18T15:38:52.410101",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -184,7 +184,7 @@
       "name": "dart2js_info",
       "rootUri": "../third_party/pkg/dart2js_info",
       "packageUri": "lib/",
-      "languageVersion": "2.3"
+      "languageVersion": "2.0"
     },
     {
       "name": "dart2js_tools",
@@ -207,7 +207,8 @@
     {
       "name": "dart_style",
       "rootUri": "../third_party/pkg_tested/dart_style",
-      "packageUri": "lib/"
+      "packageUri": "lib/",
+      "languageVersion": "2.7"
     },
     {
       "name": "dartdev",
@@ -347,7 +348,8 @@
     {
       "name": "js_runtime",
       "rootUri": "../sdk/lib/_internal/js_runtime",
-      "packageUri": "lib/"
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
     },
     {
       "name": "json_rpc_2",
@@ -482,7 +484,8 @@
     {
       "name": "pub",
       "rootUri": "../third_party/pkg/pub",
-      "packageUri": "lib/"
+      "packageUri": "lib/",
+      "languageVersion": "2.3"
     },
     {
       "name": "pub_semver",
@@ -505,7 +508,8 @@
     {
       "name": "sdk_library_metadata",
       "rootUri": "../sdk/lib/_internal/sdk_library_metadata",
-      "packageUri": "lib/"
+      "packageUri": "lib/",
+      "languageVersion": "2.10"
     },
     {
       "name": "shelf",
@@ -748,4 +752,4 @@
       "languageVersion": "2.4"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/DEPS b/DEPS
index 881deca..c6af26a 100644
--- a/DEPS
+++ b/DEPS
@@ -66,7 +66,7 @@
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.6.0",
-  "async_rev": "128c461a97dbdbd9336ba000ba5a5c02e79b8651",
+  "async_rev": "3fedad22c6940650526a86adebbf2872b81c2805",
   "bazel_worker_rev": "26680d5e249b249c7216ab2fed0ac8ed4ee285c5",
   "benchmark_harness_rev": "ec6b646f5443faa871e126ac1ba248c94ca06257",
   "boolean_selector_rev": "665e6921ab246569420376f827bff4585dff0b14",
@@ -76,7 +76,7 @@
   "charcode_rev": "4a685faba42d86ebd9d661eadd1e79d0a1c34c43",
   "chrome_rev" : "19997",
   "cli_util_tag" : "0.2.0",
-  "collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
+  "collection_rev": "65d3e58ee5289528ec280d361a67a631d65b3d7f",
   "convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
   "crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
   "csslib_rev": "681a6603f86bbbe64e8af42d722aef63b028d241",
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
index 885f1f1..50ef9fe 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter.dart
@@ -39,9 +39,9 @@
   @override
   void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
     if (data is _TypeArgumentData) {
-      _applyToTypeArguments(builder, data);
+      _applyToTypeArguments(builder, fix, data);
     } else if (data is _TypeParameterData) {
-      _applyToTypeParameters(builder, data);
+      _applyToTypeParameters(builder, fix, data);
     } else {
       throw StateError('Unsupported class of data: ${data.runtimeType}');
     }
@@ -50,23 +50,23 @@
   @override
   _Data validate(DataDrivenFix fix) {
     var node = fix.node;
+    var context = TemplateContext(node, fix.utils);
     if (node is NamedType) {
       // wrong_number_of_type_arguments
       // wrong_number_of_type_arguments_constructor
-      var argument = argumentValue.generate(node, fix.utils);
-      if (argument == null) {
+      if (!argumentValue.validate(context)) {
         return null;
       }
       var typeArguments = node.typeArguments;
       if (_isInvalidIndex(typeArguments?.arguments)) {
         return null;
       }
-      return _TypeArgumentData(typeArguments, argument, node.name.end);
+      return _TypeArgumentData(typeArguments, node.name.end);
     }
     var parent = node.parent;
     if (parent is InvocationExpression) {
       // wrong_number_of_type_arguments_method
-      var argument = argumentValue.generate(parent, fix.utils);
+      var argument = argumentValue.validate(context);
       if (argument == null) {
         return null;
       }
@@ -74,60 +74,58 @@
       if (_isInvalidIndex(typeArguments?.arguments)) {
         return null;
       }
-      return _TypeArgumentData(
-          typeArguments, argument, parent.argumentList.offset);
+      return _TypeArgumentData(typeArguments, parent.argumentList.offset);
     } else if (parent is MethodDeclaration) {
       // invalid_override
-      String bound;
-      if (extendedType != null) {
-        bound = extendedType.generate(node, fix.utils);
-        if (bound == null) {
-          return null;
-        }
+      if (extendedType != null && !extendedType.validate(context)) {
+        return null;
       }
       var typeParameters = parent.typeParameters;
       if (_isInvalidIndex(typeParameters?.typeParameters)) {
         return null;
       }
-      return _TypeParameterData(typeParameters, bound, parent.name.end);
+      return _TypeParameterData(typeParameters, parent.name.end);
     } else if (node is TypeArgumentList && parent is ExtensionOverride) {
       // wrong_number_of_type_arguments_extension
-      var argument = argumentValue.generate(node, fix.utils);
+      var argument = argumentValue.validate(context);
       if (argument == null) {
         return null;
       }
       if (_isInvalidIndex(node?.arguments)) {
         return null;
       }
-      return _TypeArgumentData(node, argument, parent.extensionName.end);
+      return _TypeArgumentData(node, parent.extensionName.end);
     }
     return null;
   }
 
   void _applyToTypeArguments(
-      DartFileEditBuilder builder, _TypeArgumentData data) {
+      DartFileEditBuilder builder, DataDrivenFix fix, _TypeArgumentData data) {
     var typeArguments = data.typeArguments;
-    var argumentValue = data.argumentValue;
+    var argumentValueText = argumentValue.generate(fix.node, fix.utils);
     if (typeArguments == null) {
       // Adding the first type argument.
-      builder.addSimpleInsertion(data.newListOffset, '<$argumentValue>');
+      builder.addSimpleInsertion(data.newListOffset, '<$argumentValueText>');
     } else {
       if (index == 0) {
         // Inserting the type argument at the beginning of the list.
         builder.addSimpleInsertion(
-            typeArguments.leftBracket.end, '$argumentValue, ');
+            typeArguments.leftBracket.end, '$argumentValueText, ');
       } else {
         // Inserting the type argument after an existing type argument.
         var previous = typeArguments.arguments[index - 1];
-        builder.addSimpleInsertion(previous.end, ', $argumentValue');
+        builder.addSimpleInsertion(previous.end, ', $argumentValueText');
       }
     }
   }
 
   void _applyToTypeParameters(
-      DartFileEditBuilder builder, _TypeParameterData data) {
-    var argumentValue =
-        data.bound == null ? name : '$name extends ${data.bound}';
+      DartFileEditBuilder builder, DataDrivenFix fix, _TypeParameterData data) {
+    var extendsClause = '';
+    if (extendedType != null) {
+      extendsClause = ' extends ${extendedType.generate(fix.node, fix.utils)}';
+    }
+    var argumentValue = '$name$extendsClause';
     var typeParameters = data.typeParameters;
     if (typeParameters == null) {
       // Adding the first type argument.
@@ -160,15 +158,12 @@
   /// `null` if the first type argument is being added.
   final TypeArgumentList typeArguments;
 
-  /// The value of the type argument being added.
-  final String argumentValue;
-
   /// The offset at which the type argument list should be inserted if
   /// [typeArguments] is `null`.
   final int newListOffset;
 
   /// Initialize newly created data.
-  _TypeArgumentData(this.typeArguments, this.argumentValue, this.newListOffset);
+  _TypeArgumentData(this.typeArguments, this.newListOffset);
 }
 
 /// The data returned when updating a type parameter list.
@@ -177,14 +172,10 @@
   /// or `null` if the first type parameter is being added.
   final TypeParameterList typeParameters;
 
-  /// The bound of the type parameter being added, or `null` if there is no
-  /// bound.
-  final String bound;
-
   /// The offset at which the type parameter list should be inserted if
   /// [typeParameters] is `null`.
   final int newListOffset;
 
   /// Initialize newly created data.
-  _TypeParameterData(this.typeParameters, this.bound, this.newListOffset);
+  _TypeParameterData(this.typeParameters, this.newListOffset);
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
index 9729bfd..941d9be 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
@@ -2,7 +2,7 @@
 // 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 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 
@@ -26,6 +26,17 @@
     }
     return buffer.toString();
   }
+
+  /// Use the [context] to validate that this template will be able to generate
+  /// a value.
+  bool validate(TemplateContext context) {
+    for (var component in components) {
+      if (!component.validate(context)) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
 
 /// The kinds of code that can be generated by a template.
@@ -40,6 +51,10 @@
   /// the [context] to access needed information that isn't already known to
   /// this component.
   void appendTo(StringSink sink, TemplateContext context);
+
+  /// Use the [context] to validate that this component will be able to generate
+  /// a value.
+  bool validate(TemplateContext context);
 }
 
 /// The context in which a template is being evaluated.
@@ -59,9 +74,9 @@
   TemplateContext(this.node, this.utils);
 
   /// Return the value of the variable with the given [name].
-  String valueOf(ValueGenerator extractor) {
-    return _variableValues.putIfAbsent(extractor, () {
-      return extractor.from(this);
+  String valueOf(ValueGenerator generator) {
+    return _variableValues.putIfAbsent(generator, () {
+      return generator.from(this);
     });
   }
 }
@@ -78,18 +93,28 @@
   void appendTo(StringSink sink, TemplateContext context) {
     sink.write(text);
   }
+
+  @override
+  bool validate(TemplateContext context) {
+    return true;
+  }
 }
 
 /// A reference to a variable within a template.
 class TemplateVariable extends TemplateComponent {
-  /// The extractor used to compute the value of the variable.
-  final ValueGenerator extractor;
+  /// The generator used to compute the value of the variable.
+  final ValueGenerator generator;
 
-  /// Initialize a newly created template variable with the given [name].
-  TemplateVariable(this.extractor);
+  /// Initialize a newly created template variable with the given [generator].
+  TemplateVariable(this.generator);
 
   @override
   void appendTo(StringSink sink, TemplateContext context) {
-    sink.write(context.valueOf(extractor));
+    sink.write(context.valueOf(generator));
+  }
+
+  @override
+  bool validate(TemplateContext context) {
+    return generator.validate(context);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
index 0f48e1c..1521f7c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart
@@ -12,7 +12,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 import 'package:analysis_server/src/utilities/extensions/yaml.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:meta/meta.dart';
@@ -127,9 +127,9 @@
   }
 
   /// Convert the given [template] into a list of components. Variable
-  /// references in the template are looked up in the map of [extractors].
+  /// references in the template are looked up in the map of [generators].
   List<TemplateComponent> _extractTemplateComponents(String template,
-      Map<String, ValueGenerator> extractors, int templateOffset) {
+      Map<String, ValueGenerator> generators, int templateOffset) {
     var components = <TemplateComponent>[];
     var textStart = 0;
     var variableStart = template.indexOf(_openComponent);
@@ -148,7 +148,7 @@
         return null;
       } else {
         var name = template.substring(variableStart + 2, endIndex).trim();
-        var extractor = extractors[name];
+        var extractor = generators[name];
         if (extractor == null) {
           errorReporter.reportErrorForOffset(
               TransformSetErrorCode.undefinedVariable,
@@ -662,18 +662,18 @@
   Map<String, ValueGenerator> _translateTemplateVariables(
       YamlNode node, ErrorContext context) {
     if (node is YamlMap) {
-      var extractors = <String, ValueGenerator>{};
+      var generators = <String, ValueGenerator>{};
       for (var entry in node.nodes.entries) {
         var name = _translateKey(entry.key);
         if (name != null) {
           var value = _translateValueExtractor(
               entry.value, ErrorContext(key: name, parentNode: node));
           if (value != null) {
-            extractors[name] = value;
+            generators[name] = value;
           }
         }
       }
-      return extractors;
+      return generators;
     } else if (node == null) {
       return const {};
     } else {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
similarity index 74%
rename from pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
rename to pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
index 26239d9..43d83fc 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_generator.dart
@@ -30,6 +30,19 @@
     return null;
   }
 
+  @override
+  bool validate(TemplateContext context) {
+    var argumentList = _getArgumentList(context.node);
+    if (argumentList == null) {
+      return false;
+    }
+    var expression = parameter.argumentFrom(argumentList);
+    if (expression != null) {
+      return false;
+    }
+    return true;
+  }
+
   /// Return the argument list associated with the given [node].
   ArgumentList _getArgumentList(AstNode node) {
     if (node is ArgumentList) {
@@ -38,6 +51,13 @@
       return node.argumentList;
     } else if (node is InstanceCreationExpression) {
       return node.argumentList;
+    } else if (node is TypeArgumentList) {
+      var parent = node.parent;
+      if (parent is InvocationExpression) {
+        return parent.argumentList;
+      } else if (parent is ExtensionOverride) {
+        return parent.argumentList;
+      }
     }
     return null;
   }
@@ -59,6 +79,12 @@
     // TODO(brianwilkerson) Figure out how to add the import when necessary.
     return name;
   }
+
+  @override
+  bool validate(TemplateContext context) {
+    // TODO(brianwilkerson) Validate that the import can be added.
+    return true;
+  }
 }
 
 /// An object used to generate the value of a template variable.
@@ -66,4 +92,8 @@
   /// Use the [context] to generate the value of a template variable and return
   /// the generated value.
   String from(TemplateContext context);
+
+  /// Use the [context] to validate that this generator will be able to generate
+  /// a value.
+  bool validate(TemplateContext context);
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
index 46f405c..5713fb6 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_template_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:analysis_server/src/services/correction/fix/data_driven/code_template.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
index 857d315..9e8c38a 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart
@@ -8,7 +8,7 @@
 import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set_error_code.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_generator.dart';
 import 'package:matcher/matcher.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -60,7 +60,7 @@
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
     var value =
-        (components[0] as TemplateVariable).extractor as ArgumentExpression;
+        (components[0] as TemplateVariable).generator as ArgumentExpression;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -132,7 +132,7 @@
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
     var value =
-        (components[0] as TemplateVariable).extractor as ArgumentExpression;
+        (components[0] as TemplateVariable).generator as ArgumentExpression;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -174,7 +174,7 @@
     var components = modification.argumentValue.components;
     expect(components, hasLength(1));
     var value =
-        (components[0] as TemplateVariable).extractor as ArgumentExpression;
+        (components[0] as TemplateVariable).generator as ArgumentExpression;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 1);
   }
@@ -219,12 +219,12 @@
     var components = modification.argumentValue.components;
     expect(components, hasLength(4));
     var extractorA =
-        (components[0] as TemplateVariable).extractor as ArgumentExpression;
+        (components[0] as TemplateVariable).generator as ArgumentExpression;
     var parameterA = extractorA.parameter as PositionalParameterReference;
     expect(parameterA.index, 1);
     expect((components[1] as TemplateText).text, '(');
     var extractorB =
-        (components[2] as TemplateVariable).extractor as ArgumentExpression;
+        (components[2] as TemplateVariable).generator as ArgumentExpression;
     var parameterB = extractorB.parameter as PositionalParameterReference;
     expect(parameterB.index, 2);
     expect((components[3] as TemplateText).text, ')');
@@ -262,7 +262,7 @@
     expect(change.name, 'T');
     var components = change.argumentValue.components;
     expect(components, hasLength(1));
-    var value = (components[0] as TemplateVariable).extractor as ImportedName;
+    var value = (components[0] as TemplateVariable).generator as ImportedName;
     expect(value.uris, ['dart:core']);
     expect(value.name, 'String');
   }
@@ -301,7 +301,7 @@
     var components = change.argumentValue.components;
     expect(components, hasLength(1));
     var value =
-        (components[0] as TemplateVariable).extractor as ArgumentExpression;
+        (components[0] as TemplateVariable).generator as ArgumentExpression;
     var parameter = value.parameter as NamedParameterReference;
     expect(parameter.name, 'p');
   }
@@ -344,7 +344,7 @@
 
     var argumentComponents = change.argumentValue.components;
     expect(argumentComponents, hasLength(1));
-    var value = (argumentComponents[0] as TemplateVariable).extractor
+    var value = (argumentComponents[0] as TemplateVariable).generator
         as ArgumentExpression;
     var parameter = value.parameter as PositionalParameterReference;
     expect(parameter.index, 2);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
index 6d4e023..93bea41 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -11,6 +12,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(RemoveDeadCodeTest);
+    defineReflectiveTests(RemoveDeadCodeWithNullSafetyTest);
   });
 }
 
@@ -136,3 +138,48 @@
 ''');
   }
 }
+
+@reflectiveTest
+class RemoveDeadCodeWithNullSafetyTest extends FixProcessorTest {
+  @override
+  List<String> get experiments => [EnableString.non_nullable];
+
+  @override
+  FixKind get kind => DartFixKind.REMOVE_DEAD_CODE;
+
+  @failingTest
+  Future<void> test_do_returnInBody() async {
+    // https://github.com/dart-lang/sdk/issues/43511
+    await resolveTestUnit('''
+void f(bool c) {
+  do {
+    print(c);
+    return;
+  } while (c);
+}
+''');
+    await assertHasFix('''
+void f(bool c) {
+  print(c);
+}
+''');
+  }
+
+  @failingTest
+  Future<void> test_for_returnInBody() async {
+    // https://github.com/dart-lang/sdk/issues/43511
+    await resolveTestUnit('''
+void f() {
+  for (int i = 0; i < 2; i++) {
+    print(i);
+    return;
+  }
+}
+''');
+    await assertHasFix('''
+void f() {
+  print(0);
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index ee6204e..74f160b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -8,7 +8,7 @@
 
 /// The current version of the Dart language (or, for non-stable releases, the
 /// version of the language currently in the process of being developed).
-const _currentVersion = '2.11.0';
+const _currentVersion = '2.10.0';
 
 /// A map containing information about all known experimental flags.
 final _knownFeatures = <String, ExperimentalFeature>{
@@ -68,7 +68,7 @@
     isExpired: IsExpired.constant_update_2018,
     documentation: 'Enhanced constant expressions',
     experimentalReleaseVersion: null,
-    releaseVersion: Version.parse('2.4.1'),
+    releaseVersion: Version.parse('2.0.0'),
   );
 
   static final control_flow_collections = ExperimentalFeature(
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 7b83ca3..0190caa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -59,6 +59,11 @@
     var left = node.leftHandSide;
     var right = node.rightHandSide;
 
+    if (left is IndexExpression) {
+      _resolve_IndexExpression(node, left);
+      return;
+    }
+
     if (left is PrefixedIdentifier) {
       _resolve_PrefixedIdentifier(node, left);
       return;
@@ -241,13 +246,46 @@
     }
   }
 
+  void _resolve_IndexExpression(
+    AssignmentExpressionImpl node,
+    IndexExpression left,
+  ) {
+    left.target?.accept(_resolver);
+    _resolver.startNullAwareIndexExpression(left);
+
+    var operator = node.operator.type;
+    var hasRead = operator != TokenType.EQ;
+
+    var resolver = PropertyElementResolver(_resolver);
+    var result = resolver.resolveIndexExpression(
+      node: left,
+      hasRead: hasRead,
+      hasWrite: true,
+    );
+
+    var readElement = result.readElement;
+    var writeElement = result.writeElement;
+
+    InferenceContext.setType(left.index, result.indexContextType);
+    left.index.accept(_resolver);
+
+    if (hasRead) {
+      _resolver.setReadElement(left, readElement);
+    }
+    _resolver.setWriteElement(left, writeElement);
+
+    _setBackwardCompatibility(node);
+
+    var right = node.rightHandSide;
+    _resolve3(node, left, operator, right);
+  }
+
   void _resolve_PrefixedIdentifier(
     AssignmentExpressionImpl node,
     PrefixedIdentifier left,
   ) {
     left.prefix?.accept(_resolver);
 
-    var propertyName = left.identifier;
     var operator = node.operator.type;
     var hasRead = operator != TokenType.EQ;
 
@@ -266,7 +304,7 @@
     }
     _resolver.setWriteElement(left, writeElement);
 
-    _setBackwardCompatibility(node, propertyName);
+    _setBackwardCompatibility(node);
 
     var right = node.rightHandSide;
     _resolve3(node, left, operator, right);
@@ -278,7 +316,6 @@
   ) {
     left.target?.accept(_resolver);
 
-    var propertyName = left.propertyName;
     var operator = node.operator.type;
     var hasRead = operator != TokenType.EQ;
 
@@ -299,7 +336,7 @@
     }
     _resolver.setWriteElement(left, writeElement);
 
-    _setBackwardCompatibility(node, propertyName);
+    _setBackwardCompatibility(node);
 
     var right = node.rightHandSide;
     _resolve3(node, left, operator, right);
@@ -329,7 +366,7 @@
       receiverTypeObject: null,
     );
 
-    _setBackwardCompatibility(node, left);
+    _setBackwardCompatibility(node);
 
     if (operator != TokenType.EQ) {
       // TODO(scheglov) Change this method to work with elements.
@@ -391,32 +428,51 @@
 
   /// TODO(scheglov) This is mostly necessary for backward compatibility.
   /// Although we also use `staticElement` for `getType(left)` below.
-  void _setBackwardCompatibility(
-    AssignmentExpressionImpl node,
-    SimpleIdentifier left,
-  ) {
+  void _setBackwardCompatibility(AssignmentExpressionImpl node) {
     var operator = node.operator.type;
 
-    if (operator != TokenType.EQ) {
+    var left = node.leftHandSide;
+    var hasRead = operator != TokenType.EQ;
+
+    if (left is IndexExpression) {
+      if (hasRead) {
+        left.staticElement = node.writeElement;
+        left.auxiliaryElements = AuxiliaryElements(node.readElement);
+        _resolver.setReadElement(node, node.readElement);
+        _resolver.setWriteElement(node, node.writeElement);
+      } else {
+        left.staticElement = node.writeElement;
+        _resolver.setWriteElement(node, node.writeElement);
+      }
+      _recordStaticType(left, node.writeType);
+      return;
+    }
+
+    SimpleIdentifier leftIdentifier;
+    if (left is PrefixedIdentifier) {
+      leftIdentifier = left.identifier;
+      _recordStaticType(left, node.writeType);
+    } else if (left is PropertyAccess) {
+      leftIdentifier = left.propertyName;
+      _recordStaticType(left, node.writeType);
+    } else if (left is SimpleIdentifier) {
+      leftIdentifier = left;
+    }
+
+    if (hasRead) {
       var readElement = node.readElement;
       if (readElement is PropertyAccessorElement) {
-        left.auxiliaryElements = AuxiliaryElements(readElement);
+        leftIdentifier.auxiliaryElements = AuxiliaryElements(readElement);
       }
     }
 
-    left.staticElement = node.writeElement;
+    leftIdentifier.staticElement = node.writeElement;
     if (node.readElement is VariableElement) {
-      var leftType = _resolver.localVariableTypeProvider.getType(left);
-      _recordStaticType(left, leftType);
+      var leftType =
+          _resolver.localVariableTypeProvider.getType(leftIdentifier);
+      _recordStaticType(leftIdentifier, leftType);
     } else {
-      _recordStaticType(left, node.writeType);
-    }
-
-    var parent = left.parent;
-    if (parent is PrefixedIdentifier && parent.identifier == left) {
-      _recordStaticType(parent, node.writeType);
-    } else if (parent is PropertyAccess && parent.propertyName == left) {
-      _recordStaticType(parent, node.writeType);
+      _recordStaticType(leftIdentifier, node.writeType);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 4d3fffb..b3ed076 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -5,11 +5,14 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
+import 'package:analyzer/src/dart/resolver/resolution_result.dart';
 import 'package:analyzer/src/error/assignment_verifier.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -27,6 +30,97 @@
 
   ExtensionMemberResolver get _extensionResolver => _resolver.extensionResolver;
 
+  TypeSystemImpl get _typeSystem => _resolver.typeSystem;
+
+  PropertyElementResolverResult resolveIndexExpression({
+    @required IndexExpression node,
+    @required bool hasRead,
+    @required bool hasWrite,
+  }) {
+    var target = node.realTarget;
+    var targetType = target.staticType;
+    targetType = _resolveTypeParameter(targetType);
+
+    if (target is ExtensionOverride) {
+      var result = _extensionResolver.getOverrideMember(target, '[]');
+
+      // TODO(scheglov) Change ExtensionResolver to set `needsGetterError`.
+      if (hasRead && result.getter == null && !result.isAmbiguous) {
+        _reportUnresolvedIndex(
+          node,
+          CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
+          ['[]', target.staticElement.name],
+        );
+      }
+
+      if (hasWrite && result.setter == null && !result.isAmbiguous) {
+        _reportUnresolvedIndex(
+          node,
+          CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
+          ['[]=', target.staticElement.name],
+        );
+      }
+
+      return _toIndexResult(result);
+    }
+
+    if (targetType.isVoid) {
+      // TODO(scheglov) Report directly in TypePropertyResolver?
+      _reportUnresolvedIndex(
+        node,
+        CompileTimeErrorCode.USE_OF_VOID_RESULT,
+      );
+      return PropertyElementResolverResult();
+    }
+
+    if (identical(targetType, NeverTypeImpl.instance)) {
+      // TODO(scheglov) Report directly in TypePropertyResolver?
+      _errorReporter.reportErrorForNode(
+        HintCode.RECEIVER_OF_TYPE_NEVER,
+        target,
+      );
+      return PropertyElementResolverResult();
+    }
+
+    if (node.isNullAware) {
+      if (target is ExtensionOverride) {
+        // https://github.com/dart-lang/language/pull/953
+      } else {
+        targetType = _typeSystem.promoteToNonNull(targetType);
+      }
+    }
+
+    var result = _resolver.typePropertyResolver.resolve(
+      receiver: target,
+      receiverType: targetType,
+      name: '[]',
+      receiverErrorNode: target,
+      nameErrorEntity: target,
+    );
+
+    if (hasRead && result.needsGetterError) {
+      _reportUnresolvedIndex(
+        node,
+        target is SuperExpression
+            ? CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR
+            : CompileTimeErrorCode.UNDEFINED_OPERATOR,
+        ['[]', targetType],
+      );
+    }
+
+    if (hasWrite && result.needsSetterError) {
+      _reportUnresolvedIndex(
+        node,
+        target is SuperExpression
+            ? CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR
+            : CompileTimeErrorCode.UNDEFINED_OPERATOR,
+        ['[]=', targetType],
+      );
+    }
+
+    return _toIndexResult(result);
+  }
+
   PropertyElementResolverResult resolvePrefixedIdentifier({
     @required PrefixedIdentifier node,
     @required bool hasRead,
@@ -130,10 +224,37 @@
     );
   }
 
+  DartType _computeIndexContextType({
+    @required ExecutableElement readElement,
+    @required ExecutableElement writeElement,
+  }) {
+    var method = writeElement ?? readElement;
+    var parameters = method is MethodElement ? method.parameters : null;
+
+    if (parameters != null && parameters.isNotEmpty) {
+      return parameters[0].type;
+    }
+
+    return null;
+  }
+
   bool _isAccessible(ExecutableElement element) {
     return element.isAccessibleIn(_definingLibrary);
   }
 
+  void _reportUnresolvedIndex(
+    IndexExpression node,
+    ErrorCode errorCode, [
+    List<Object> arguments = const [],
+  ]) {
+    var leftBracket = node.leftBracket;
+    var rightBracket = node.rightBracket;
+    var offset = leftBracket.offset;
+    var length = rightBracket.end - offset;
+
+    _errorReporter.reportErrorForOffset(errorCode, offset, length, arguments);
+  }
+
   PropertyElementResolverResult _resolve({
     @required Expression target,
     @required bool isCascaded,
@@ -192,7 +313,7 @@
     }
 
     if (isNullAware) {
-      targetType = _resolver.typeSystem.promoteToNonNull(targetType);
+      targetType = _typeSystem.promoteToNonNull(targetType);
     }
 
     var result = _resolver.typePropertyResolver.resolve(
@@ -310,7 +431,7 @@
       readElement ??= extension.getMethod(memberName);
 
       if (readElement == null) {
-        _resolver.errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
           propertyName,
           [memberName, extension.name],
@@ -326,7 +447,7 @@
       writeElement = extension.getSetter(memberName);
 
       if (writeElement == null) {
-        _resolver.errorReporter.reportErrorForNode(
+        _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER,
           propertyName,
           [memberName, extension.name],
@@ -492,6 +613,20 @@
     }
     return type;
   }
+
+  PropertyElementResolverResult _toIndexResult(ResolutionResult result) {
+    var readElement = result.getter;
+    var writeElement = result.setter;
+
+    return PropertyElementResolverResult(
+      readElementRequested: readElement,
+      writeElementRequested: writeElement,
+      indexContextType: _computeIndexContextType(
+        readElement: readElement,
+        writeElement: writeElement,
+      ),
+    );
+  }
 }
 
 class PropertyElementResolverResult {
@@ -500,11 +635,16 @@
   final Element writeElementRequested;
   final Element writeElementRecovery;
 
+  /// If [IndexExpression] is resolved, the context type of the index.
+  /// Might be `null` if `[]` or `[]=` are not resolved or invalid.
+  final DartType indexContextType;
+
   PropertyElementResolverResult({
     this.readElementRequested,
     this.readElementRecovery,
     this.writeElementRequested,
     this.writeElementRecovery,
+    this.indexContextType,
   });
 
   Element get readElement {
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 5faf315..d80064f 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -9,20 +9,15 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
 import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
 import 'package:analyzer/src/dart/resolver/property_element_resolver.dart';
-import 'package:analyzer/src/dart/resolver/resolution_result.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/dart/resolver/type_property_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/migratable_ast_info_provider.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/super_context.dart';
-import 'package:analyzer/src/task/strong/checker.dart';
 
 /// An object used by instances of [ResolverVisitor] to resolve references
 /// within the AST structure to the elements being referenced. The requirements
@@ -94,9 +89,6 @@
   @Deprecated('This field is no longer used')
   final bool reportConstEvaluationErrors;
 
-  /// Helper for extension method resolution.
-  final ExtensionMemberResolver _extensionResolver;
-
   /// Helper for resolving properties on types.
   final TypePropertyResolver _typePropertyResolver;
 
@@ -109,7 +101,6 @@
       MigratableAstInfoProvider migratableAstInfoProvider =
           const MigratableAstInfoProvider()})
       : _definingLibrary = _resolver.definingLibrary,
-        _extensionResolver = _resolver.extensionResolver,
         _typePropertyResolver = _resolver.typePropertyResolver {
     _dynamicType = _typeProvider.dynamicType;
     _methodInvocationResolver = MethodInvocationResolver(
@@ -133,8 +124,6 @@
 
   TypeProviderImpl get _typeProvider => _resolver.typeProvider;
 
-  TypeSystemImpl get _typeSystem => _resolver.typeSystem;
-
   @override
   void visitBreakStatement(BreakStatement node) {
     node.target = _lookupBreakOrContinueTarget(node, node.label, false);
@@ -387,64 +376,30 @@
 
   @override
   void visitIndexExpression(IndexExpression node) {
-    Expression target = node.realTarget;
-    DartType targetType = _getStaticType(target);
+    var hasRead = node.inGetterContext();
+    var hasWrite = node.inSetterContext();
 
-    if (identical(targetType, NeverTypeImpl.instance)) {
-      _resolver.errorReporter.reportErrorForNode(
-        HintCode.RECEIVER_OF_TYPE_NEVER,
-        target,
-      );
-      return;
+    var resolver = PropertyElementResolver(_resolver);
+    var result = resolver.resolveIndexExpression(
+      node: node,
+      hasRead: hasRead,
+      hasWrite: hasWrite,
+    );
+
+    if (hasRead && hasWrite) {
+      node.staticElement = result.writeElement;
+      node.auxiliaryElements = AuxiliaryElements(result.readElement);
+      _resolver.setReadElement(node, result.readElement);
+      _resolver.setWriteElement(node, result.writeElement);
+    } else if (hasRead) {
+      node.staticElement = result.readElement;
+      _resolver.setReadElement(node, result.readElement);
+    } else if (hasWrite) {
+      node.staticElement = result.writeElement;
+      _resolver.setWriteElement(node, result.writeElement);
     }
 
-    if (node.isNullAware) {
-      if (target is ExtensionOverride) {
-        // https://github.com/dart-lang/language/pull/953
-      } else {
-        targetType = _typeSystem.promoteToNonNull(targetType);
-      }
-    }
-
-    String getterMethodName = TokenType.INDEX.lexeme;
-    String setterMethodName = TokenType.INDEX_EQ.lexeme;
-
-    ResolutionResult result;
-    if (target is ExtensionOverride) {
-      result = _extensionResolver.getOverrideMember(target, getterMethodName);
-    } else {
-      result = _typePropertyResolver.resolve(
-        receiver: target,
-        receiverType: targetType,
-        name: getterMethodName,
-        receiverErrorNode: target,
-        nameErrorEntity: target,
-      );
-    }
-
-    bool isInGetterContext = node.inGetterContext();
-    bool isInSetterContext = node.inSetterContext();
-    if (isInGetterContext && isInSetterContext) {
-      node.staticElement = result.setter;
-      node.auxiliaryElements = AuxiliaryElements(result.getter);
-      _resolver.setReadElement(node, result.getter);
-      _resolver.setWriteElement(node, result.setter);
-    } else if (isInGetterContext) {
-      node.staticElement = result.getter;
-      _resolver.setReadElement(node, result.getter);
-    } else if (isInSetterContext) {
-      node.staticElement = result.setter;
-      _resolver.setWriteElement(node, result.setter);
-    }
-
-    if (isInGetterContext) {
-      _checkForUndefinedIndexOperator(node, target, getterMethodName, result,
-          result.getter, result.needsGetterError, targetType);
-    }
-    if (isInSetterContext) {
-      _checkForUndefinedIndexOperator(node, target, setterMethodName, result,
-          result.setter, result.needsSetterError, targetType);
-    }
+    InferenceContext.setType(node.index, result.indexContextType);
   }
 
   @override
@@ -869,69 +824,6 @@
     _resolveAnnotations(node.metadata);
   }
 
-  /// Check that the given index [expression] was resolved, otherwise a
-  /// [CompileTimeErrorCode.UNDEFINED_OPERATOR] is generated. The [target] is
-  /// the target of the expression. The [methodName] is the name of the operator
-  /// associated with the context of using of the given index expression.
-  void _checkForUndefinedIndexOperator(
-      IndexExpression expression,
-      Expression target,
-      String methodName,
-      ResolutionResult result,
-      ExecutableElement element,
-      bool needsError,
-      DartType staticType) {
-    if (result.isAmbiguous) {
-      return;
-    }
-    if (element != null) {
-      return;
-    }
-    if (target is! ExtensionOverride) {
-      if (staticType == null || staticType.isDynamic) {
-        return;
-      }
-    }
-
-    var leftBracket = expression.leftBracket;
-    var rightBracket = expression.rightBracket;
-    var offset = leftBracket.offset;
-    var length = rightBracket.end - offset;
-    if (target is ExtensionOverride) {
-      _errorReporter.reportErrorForOffset(
-        CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
-        offset,
-        length,
-        [methodName, target.staticElement.name],
-      );
-    } else if (target is SuperExpression) {
-      _errorReporter.reportErrorForOffset(
-        CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
-        offset,
-        length,
-        [methodName, staticType],
-      );
-    } else if (staticType.isVoid) {
-      _errorReporter.reportErrorForOffset(
-        CompileTimeErrorCode.USE_OF_VOID_RESULT,
-        offset,
-        length,
-      );
-    } else if (identical(staticType, NeverTypeImpl.instance)) {
-      _resolver.errorReporter.reportErrorForNode(
-        HintCode.RECEIVER_OF_TYPE_NEVER,
-        target,
-      );
-    } else if (needsError) {
-      _errorReporter.reportErrorForOffset(
-        CompileTimeErrorCode.UNDEFINED_OPERATOR,
-        offset,
-        length,
-        [methodName, staticType],
-      );
-    }
-  }
-
   /// Assuming that the given [identifier] is a prefix for a deferred import,
   /// return the library that is being imported.
   LibraryElement _getImportedLibrary(SimpleIdentifier identifier) {
@@ -941,16 +833,6 @@
     return imports[0].importedLibrary;
   }
 
-  /// Return the static type of the given [expression] that is to be used for
-  /// type analysis.
-  DartType _getStaticType(Expression expression, {bool read = false}) {
-    if (expression is NullLiteral) {
-      return _typeProvider.nullType;
-    }
-    DartType type = read ? getReadType(expression) : expression.staticType;
-    return _resolveTypeParameter(type);
-  }
-
   InterfaceType _instantiateAnnotationClass(ClassElement element) {
     return element.instantiate(
       typeArguments: List.filled(
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 43d1494..07ea52c 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -664,6 +664,15 @@
     }
   }
 
+  void startNullAwareIndexExpression(IndexExpression node) {
+    if (_migratableAstInfoProvider.isIndexExpressionNullAware(node) &&
+        _isNonNullableByDefault) {
+      _flowAnalysis.flow.nullAwareAccess_rightBegin(
+          node.target, node.realTarget.staticType ?? typeProvider.dynamicType);
+      _unfinishedNullShorts.add(node.nullShortingTermination);
+    }
+  }
+
   void startNullAwarePropertyAccess(
     PropertyAccess node,
   ) {
@@ -1462,21 +1471,8 @@
   @override
   void visitIndexExpression(IndexExpression node) {
     node.target?.accept(this);
-    if (_migratableAstInfoProvider.isIndexExpressionNullAware(node) &&
-        _isNonNullableByDefault) {
-      _flowAnalysis.flow.nullAwareAccess_rightBegin(
-          node.target, node.realTarget.staticType ?? typeProvider.dynamicType);
-      _unfinishedNullShorts.add(node.nullShortingTermination);
-    }
+    startNullAwareIndexExpression(node);
     node.accept(elementResolver);
-    var method = node.staticElement;
-    if (method != null) {
-      var parameters = method.parameters;
-      if (parameters.isNotEmpty) {
-        var indexParam = parameters[0];
-        InferenceContext.setType(node.index, indexParam.type);
-      }
-    }
     node.index?.accept(this);
     node.accept(typeAnalyzer);
   }
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index a2d7705..23be73a 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -10,7 +10,6 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ConstEvalThrowsExceptionTest_language24);
     defineReflectiveTests(ConstEvalThrowsExceptionTest);
     defineReflectiveTests(ConstEvalThrowsExceptionWithNullSafetyTest);
   });
@@ -19,9 +18,6 @@
 @reflectiveTest
 class ConstEvalThrowsExceptionTest extends PubPackageResolutionTest
     with ConstEvalThrowsExceptionTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-
   test_binaryMinus_null() async {
     await assertErrorsInCode('''
 const dynamic D = null;
@@ -78,26 +74,7 @@
 }
 
 @reflectiveTest
-class ConstEvalThrowsExceptionTest_language24 extends PubPackageResolutionTest
-    with ConstEvalThrowsExceptionTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
-
-@reflectiveTest
 mixin ConstEvalThrowsExceptionTestCases on PubPackageResolutionTest {
-  /// The expected state of this feature in the test.
-  bool get _constant_update_2018;
-
   test_assertInitializerThrows() async {
     await assertErrorsInCode(r'''
 class A {
@@ -278,77 +255,44 @@
   }
 
   test_ifElement_false_thenNotEvaluated() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic nil = null;
 const c = [if (1 < 0) nil + 1];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 18),
-              ]);
+''');
   }
 
   test_ifElement_nonBoolCondition_list() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic nonBool = 3;
 const c = const [if (nonBool) 'a'];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 48, 7),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 44, 16),
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 48, 7),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 48, 7),
+    ]);
   }
 
   test_ifElement_nonBoolCondition_map() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic nonBool = null;
 const c = const {if (nonBool) 'a' : 1};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 51, 7),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 20),
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 51, 7),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 51, 7),
+    ]);
   }
 
   test_ifElement_nonBoolCondition_set() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic nonBool = 'a';
 const c = const {if (nonBool) 3};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 50, 7),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 46, 14),
-                error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 50, 7),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 50, 7),
+    ]);
   }
 
   test_ifElement_true_elseNotEvaluated() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic nil = null;
 const c = [if (0 < 1) 3 else nil + 1];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 37, 25),
-              ]);
+''');
   }
 
   test_invalid_constructorFieldInitializer_fromSeparateLibrary() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
index 054355c..817d86c 100644
--- a/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_set_element_type_implements_equals_test.dart
@@ -9,38 +9,15 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest_language24);
     defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest);
   });
 }
 
 @reflectiveTest
 class ConstSetElementTypeImplementsEqualsTest extends PubPackageResolutionTest
-    with ConstSetElementTypeImplementsEqualsTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class ConstSetElementTypeImplementsEqualsTest_language24
-    extends PubPackageResolutionTest
-    with ConstSetElementTypeImplementsEqualsTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with ConstSetElementTypeImplementsEqualsTestCases {}
 
 mixin ConstSetElementTypeImplementsEqualsTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_constField() async {
     await assertErrorsInCode(r'''
 class A {
@@ -135,8 +112,7 @@
   }
 
   test_spread_list() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -145,23 +121,14 @@
 main() {
   const {...[A()]};
 }
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
-                    75,
-                    8),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 75, 8),
-              ]);
+''', [
+      error(
+          CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS, 75, 8),
+    ]);
   }
 
   test_spread_set() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 class A {
   const A();
   operator ==(other) => false;
@@ -170,23 +137,10 @@
 main() {
   const {...{A()}};
 }
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
-                    79,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 75, 8),
-                error(
-                    CompileTimeErrorCode
-                        .CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
-                    79,
-                    3),
-              ]);
+''', [
+      error(
+          CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS, 79, 3),
+    ]);
   }
 
   test_super() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
index d2470d0..0b71d6d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_list_or_set_test.dart
@@ -10,209 +10,108 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedListOrSetTest);
-    defineReflectiveTests(ConstSpreadExpectedListOrSetTest_language24);
   });
 }
 
 @reflectiveTest
 class ConstSpreadExpectedListOrSetTest extends PubPackageResolutionTest
-    with ConstSpreadExpectedListOrSetTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class ConstSpreadExpectedListOrSetTest_language24
-    extends PubPackageResolutionTest
-    with ConstSpreadExpectedListOrSetTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with ConstSpreadExpectedListOrSetTestCases {}
 
 mixin ConstSpreadExpectedListOrSetTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_listInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 5;
 var b = const <int>[...a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    44, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 41, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 44, 1),
+    ]);
   }
 
   test_const_listList() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = [5];
 var b = const <int>[...a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 4),
-              ]);
+''');
   }
 
   test_const_listMap() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = <int, int>{0: 1};
 var b = const <int>[...a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 56, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 59, 1),
+    ]);
   }
 
   test_const_listNull() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = null;
 var b = const <int>[...a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 44, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 47, 1),
+    ]);
   }
 
   test_const_listNull_nullable() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = null;
 var b = const <int>[...?a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 44, 5),
-              ]);
+''');
   }
 
   test_const_listSet() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = <int>{5};
 var b = const <int>[...a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 48, 4),
-              ]);
+''');
   }
 
   test_const_setInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 5;
 var b = const <int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    44, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 44, 1),
+    ]);
   }
 
   test_const_setList() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = <int>[5];
 var b = const <int>{...a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
-              ]);
+''');
   }
 
   test_const_setMap() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = <int, int>{1: 2};
 var b = const <int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 56, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 59, 1),
+    ]);
   }
 
   test_const_setNull() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = null;
 var b = const <int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET,
-                    47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 44, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_LIST_OR_SET, 47, 1),
+    ]);
   }
 
   test_const_setNull_nullable() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = null;
 var b = const <int>{...?a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 44, 5),
-              ]);
+''');
   }
 
   test_const_setSet() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = <int>{5};
 var b = const <int>{...a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 48, 4),
-              ]);
+''');
   }
 
   test_nonConst_listInt() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
index 937a847..841c131 100644
--- a/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_spread_expected_map_test.dart
@@ -10,64 +10,30 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstSpreadExpectedMapTest);
-    defineReflectiveTests(ConstSpreadExpectedMapTest_language24);
   });
 }
 
 @reflectiveTest
 class ConstSpreadExpectedMapTest extends PubPackageResolutionTest
-    with ConstSpreadExpectedMapTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class ConstSpreadExpectedMapTest_language24 extends PubPackageResolutionTest
-    with ConstSpreadExpectedMapTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with ConstSpreadExpectedMapTestCases {}
 
 mixin ConstSpreadExpectedMapTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_mapInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 5;
 var b = const <int, int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 49, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 49, 1),
+    ]);
   }
 
   test_const_mapList() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = <int>[5];
 var b = const <int, int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 53, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
+    ]);
   }
 
   test_const_mapMap() async {
@@ -78,18 +44,12 @@
   }
 
   test_const_mapNull() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = null;
 var b = const <int, int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 52, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 52, 1),
+    ]);
   }
 
   test_const_mapNull_nullable() async {
@@ -100,18 +60,12 @@
   }
 
   test_const_mapSet() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = <int>{5};
 var b = const <int, int>{...a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 53, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.CONST_SPREAD_EXPECTED_MAP, 56, 1),
+    ]);
   }
 
   test_nonConst_mapInt() async {
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 726859c..381dc33 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -10,36 +10,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualElementsInConstSetTest);
-    defineReflectiveTests(EqualElementsInConstSetTest_language24);
   });
 }
 
 @reflectiveTest
 class EqualElementsInConstSetTest extends PubPackageResolutionTest
-    with EqualElementsInConstSetTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class EqualElementsInConstSetTest_language24 extends PubPackageResolutionTest
-    with EqualElementsInConstSetTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with EqualElementsInConstSetTestCases {}
 
 mixin EqualElementsInConstSetTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_entry() async {
     await assertErrorsInCode('''
 var c = const {1, 2, 1};
@@ -50,85 +28,45 @@
   }
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1, if (1 < 0) 2 else 1};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {if (0 < 1) 1 else 1};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseTrue() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {1, if (0 < 1) 2 else 1};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 19),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {if (0 < 1) 1 else 1};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 15, 19),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {2, if (1 < 0) 2};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1, if (0 < 1) 1};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
@@ -156,32 +94,18 @@
   }
 
   test_const_spread__noDuplicate() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {1, ...{2}};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 6),
-              ]);
+''');
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1, ...{1}};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 6),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_nonConst_entry() async {
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index 2cc1a89..24da1be 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -10,36 +10,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(EqualKeysInConstMapTest);
-    defineReflectiveTests(EqualKeysInConstMapTest_language24);
   });
 }
 
 @reflectiveTest
 class EqualKeysInConstMapTest extends PubPackageResolutionTest
-    with EqualKeysInConstMapTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class EqualKeysInConstMapTest_language24 extends PubPackageResolutionTest
-    with EqualKeysInConstMapTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with EqualKeysInConstMapTestCases {}
 
 mixin EqualKeysInConstMapTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_entry() async {
     await assertErrorsInCode('''
 var c = const {1: null, 2: null, 1: null};
@@ -50,85 +28,45 @@
   }
 
   test_const_ifElement_thenElseFalse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1: null, if (1 < 0) 2: null else 1: null};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 31),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_onlyElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {if (0 < 1) 1: null else 1: null};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseTrue() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {1: null, if (0 < 1) 2: null else 1: null};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 31),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseTrue_onlyThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {if (0 < 1) 1: null else 1: null};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 15, 31),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {2: null, if (1 < 0) 2: 2};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 15),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1: null, if (0 < 1) 1: null};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 18),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_const_instanceCreation_equalTypeArgs() async {
@@ -156,32 +94,18 @@
   }
 
   test_const_spread__noDuplicate() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var c = const {1: null, ...{2: null}};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 12),
-              ]);
+''');
   }
 
   test_const_spread_hasDuplicate() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var c = const {1: null, ...{1: null}};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9,
-                    contextMessages: [
-                      message('$testPackageLibPath/test.dart', 15, 1)
-                    ]),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9,
+          contextMessages: [message('$testPackageLibPath/test.dart', 15, 1)]),
+    ]);
   }
 
   test_nonConst_entry() async {
diff --git a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
index 3d332b9..aca2e3d 100644
--- a/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/if_element_condition_from_deferred_library_test.dart
@@ -10,58 +10,26 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(IfElementConditionFromDeferredLibraryTest);
-    defineReflectiveTests(IfElementConditionFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class IfElementConditionFromDeferredLibraryTest extends PubPackageResolutionTest
-    with IfElementConditionFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class IfElementConditionFromDeferredLibraryTest_language24
-    extends PubPackageResolutionTest
-    with IfElementConditionFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with IfElementConditionFromDeferredLibraryTestCases {}
 
 mixin IfElementConditionFromDeferredLibraryTestCases
     on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_inList_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const [if(a.c) 0];
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 56, 9),
-              ]);
+}''', [
+      error(CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY, 59,
+          3),
+    ]);
   }
 
   test_inList_nonConst() async {
@@ -77,39 +45,24 @@
   test_inList_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const [if(a.c) 0];
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 9),
-              ]);
+}''');
   }
 
   test_inMap_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {if(a.c) 0 : 0};
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 13),
-              ]);
+}''', [
+      error(CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY, 59,
+          3),
+    ]);
   }
 
   test_inMap_notConst() async {
@@ -125,39 +78,24 @@
   test_inMap_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const {if(a.c) 0 : 0};
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 13),
-              ]);
+}''');
   }
 
   test_inSet_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {if(a.c) 0};
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 56, 9),
-              ]);
+}''', [
+      error(CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY, 59,
+          3),
+    ]);
   }
 
   test_inSet_notConst() async {
@@ -173,16 +111,10 @@
   test_inSet_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const bool c = true;''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const {if(a.c) 0};
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 9),
-              ]);
+}''');
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
index f2526bd..6c69432 100644
--- a/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/list_element_type_not_assignable_test.dart
@@ -10,137 +10,67 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ListElementTypeNotAssignableTest);
-    defineReflectiveTests(ListElementTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
 class ListElementTypeNotAssignableTest extends PubPackageResolutionTest
-    with ListElementTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class ListElementTypeNotAssignableTest_language24
-    extends PubPackageResolutionTest
-    with ListElementTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with ListElementTypeNotAssignableTestCases {}
 
 mixin ListElementTypeNotAssignableTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int>[if (1 < 0) a else b];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 62, 19),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseFalse_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int>[if (1 < 0) a else b];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
-                    1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 64, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 82, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var v = const <int>[if (1 < 0) 'a'];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 20, 14),
-                error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
-                    3),
-              ]);
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 31, 3),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int>[if (1 < 0) a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int>[if (true) a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 41, 11),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int>[if (true) a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
-                    1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 43, 11),
-              ]);
+''', [
+      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 53, 1),
+    ]);
   }
 
   test_const_spread_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var v = const <int>[...[0, 1]];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 20, 9),
-              ]);
+''');
   }
 
   test_const_stringInt() async {
diff --git a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
index 515fb56..55fcfd1 100644
--- a/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_key_type_not_assignable_test.dart
@@ -10,135 +10,70 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapKeyTypeNotAssignableTest);
-    defineReflectiveTests(MapKeyTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
 class MapKeyTypeNotAssignableTest extends PubPackageResolutionTest
-    with MapKeyTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class MapKeyTypeNotAssignableTest_language24 extends PubPackageResolutionTest
-    with MapKeyTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with MapKeyTypeNotAssignableTestCases {}
 
 mixin MapKeyTypeNotAssignableTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int, bool>{if (1 < 0) a: true else b: false};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 94, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 70, 32),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 94, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int, bool>{if (1 < 0) a: true};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var v = const <int, bool>{if (1 < 0) 'a': true};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 37, 3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 26, 20),
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 37, 3),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 37, 3),
+    ]);
   }
 
   test_const_ifElement_thenTrue_intInt_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int, bool>{if (true) a: true};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int, bool>{if (true) a: true};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 17),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 59, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_notConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final a = 0;
 var v = const <int, bool>{if (1 < 2) a: true};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 50, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 39, 18),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 50, 1),
+    ]);
   }
 
   test_const_intInt_dynamic() async {
@@ -166,31 +101,18 @@
   }
 
   test_const_spread_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var v = const <int, String>{...{1: 'a'}};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 28, 11),
-              ]);
+''');
   }
 
   test_const_spread_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int, String>{...{a: 'a'}};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 55, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 51, 11),
-                error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 55, 1),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE, 55, 1),
+    ]);
   }
 
   test_key_type_is_assignable() async {
diff --git a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
index fb15c1f..443ce2b 100644
--- a/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/map_value_type_not_assignable_test.dart
@@ -10,139 +10,70 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(MapValueTypeNotAssignableTest);
-    defineReflectiveTests(MapValueTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
 class MapValueTypeNotAssignableTest extends PubPackageResolutionTest
-    with MapValueTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class MapValueTypeNotAssignableTest_language24 extends PubPackageResolutionTest
-    with MapValueTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with MapValueTypeNotAssignableTestCases {}
 
 mixin MapValueTypeNotAssignableTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_intInt_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 68, 32),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <bool, int>{if (1 < 0) true: a else false: b};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 101, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 70, 32),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 101, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 'a';
 var v = const <bool, int>{if (1 < 0) true: a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 18),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_intString_value() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var v = const <bool, int>{if (1 < 0) true: 'a'};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 43, 3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 26, 20),
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 43, 3),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 43, 3),
+    ]);
   }
 
   test_const_ifElement_thenTrue_intInt_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <bool, int>{if (true) true: a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 17),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <bool, int>{if (true) true: a};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 65, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 17),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 65, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_notConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final a = 0;
 var v = const <bool, int>{if (1 < 2) true: a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 56, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 39, 18),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 56, 1),
+    ]);
   }
 
   test_const_intInt_dynamic() async {
@@ -170,33 +101,18 @@
   }
 
   test_const_spread_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var v = const <bool, int>{...{true: 1}};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 26, 12),
-              ]);
+''');
   }
 
   test_const_spread_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <bool, int>{...{true: a}};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 49, 12),
-                error(
-                    CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 59, 1),
-              ]);
+''', [
+      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 59, 1),
+    ]);
   }
 
   test_nonConst_ifElement_thenElseFalse_intInt_dynamic() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
index 28ae14c..a0fcf9a 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_from_deferred_library_test.dart
@@ -9,33 +9,17 @@
 
 main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(NonConstantListValueFromDeferredLibraryTest);
-    defineReflectiveTests(
-        NonConstantListElementFromDeferredLibraryTest_language24);
+    defineReflectiveTests(NonConstantListElementFromDeferredLibraryTest);
   });
 }
 
 @reflectiveTest
-class NonConstantListElementFromDeferredLibraryTest_language24
+class NonConstantListElementFromDeferredLibraryTest
     extends PubPackageResolutionTest
-    with NonConstantListElementFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantListElementFromDeferredLibraryTestCases {}
 
 mixin NonConstantListElementFromDeferredLibraryTestCases
     on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   @failingTest
   test_const_ifElement_thenTrue_deferredElse() async {
     // reports wrong error code (which is not crucial to fix)
@@ -56,23 +40,16 @@
   test_const_ifElement_thenTrue_deferredThen() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const [ if (cond) a.c ];
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY,
-                    79,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 69, 13),
-              ]);
+''', [
+      error(
+          CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY,
+          79,
+          3),
+    ]);
   }
 
   test_const_topLevel_deferred() async {
@@ -103,11 +80,3 @@
     ]);
   }
 }
-
-@reflectiveTest
-class NonConstantListValueFromDeferredLibraryTest
-    extends PubPackageResolutionTest
-    with NonConstantListElementFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
index f9038cd..5e51730 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_list_element_test.dart
@@ -10,36 +10,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantListElementTest);
-    defineReflectiveTests(NonConstantListElementTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantListElementTest extends PubPackageResolutionTest
-    with NonConstantListElementTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantListElementTest_language24 extends PubPackageResolutionTest
-    with NonConstantListElementTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantListElementTestCases {}
 
 mixin NonConstantListElementTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_forElement() async {
     await assertErrorsInCode(r'''
 const Set set = {};
@@ -50,119 +28,71 @@
   }
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) 0 else a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) a else 0];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) 0 else a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 54, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) a else 0];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const [if (1 < 0) a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 < 0) a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const [if (1 > 0) a];
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const [if (1 > 0) a];
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 36, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 1),
+    ]);
   }
 
   test_const_topVar() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
index 26828b8..f60e50d 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -10,40 +10,16 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapElementTest);
-    defineReflectiveTests(NonConstantMapElementTest_language24);
     defineReflectiveTests(NonConstantMapKeyTest);
-    defineReflectiveTests(NonConstantMapKeyTest_language24);
     defineReflectiveTests(NonConstantMapValueTest);
-    defineReflectiveTests(NonConstantMapValueTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapElementTest extends PubPackageResolutionTest
-    with NonConstantMapElementTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapElementTest_language24 extends PubPackageResolutionTest
-    with NonConstantMapElementTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapElementTestCases {}
 
 mixin NonConstantMapElementTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_forElement_cannotBeConst() async {
     await assertErrorsInCode('''
 void main() {
@@ -56,21 +32,14 @@
   }
 
   test_forElement_nested_cannotBeConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 void main() {
   const {1: null, if (true) for (final x in const []) null: null};
 }
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 42, 36),
-                error(HintCode.UNUSED_LOCAL_VARIABLE, 53, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 46),
-                error(HintCode.UNUSED_LOCAL_VARIABLE, 53, 1),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 42, 36),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 53, 1),
+    ]);
   }
 
   test_forElement_notConst_noError() async {
@@ -83,238 +52,133 @@
   }
 
   test_ifElement_mayBeConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 void main() {
   const {1: null, if (true) null: null};
 }
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 20),
-              ]);
+''');
   }
 
   test_ifElement_nested_mayBeConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 void main() {
   const {1: null, if (true) if (true) null: null};
 }
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 30),
-              ]);
+''');
   }
 
   test_ifElement_notConstCondition() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 void main() {
   bool notConst = true;
   const {1: null, if (notConst) null: null};
 }
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 60, 8),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 24),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 60, 8),
+    ]);
   }
 
   test_ifElementWithElse_mayBeConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 void main() {
   const isTrue = true;
   const {1: null, if (isTrue) null: null else null: null};
 }
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 38),
-              ]);
+''');
   }
 
   test_spreadElement_mayBeConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 void main() {
   const {1: null, ...{null: null}};
 }
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 32, 15),
-              ]);
+''');
   }
 
   test_spreadElement_notConst() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 void main() {
   var notConst = {};
   const {1: null, ...notConst};
 }
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 8),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 53, 11),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 8),
+    ]);
   }
 }
 
 @reflectiveTest
 class NonConstantMapKeyTest extends PubPackageResolutionTest
-    with NonConstantMapKeyTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
-    with NonConstantMapKeyTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapKeyTestCases {}
 
 @reflectiveTest
 mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else a: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0 else 0: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else a: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0 else 0: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) a: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) a: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
+    ]);
   }
 
   test_const_topVar() async {
@@ -336,144 +200,75 @@
 
 @reflectiveTest
 class NonConstantMapValueTest extends PubPackageResolutionTest
-    with NonConstantMapValueTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
-    with NonConstantMapValueTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapValueTestCases {}
 
 mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: 0 else 0: a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a else 0: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: 0 else 0: a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a else 0: 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 < 0) 0: a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int, int>{if (1 > 0) 0: a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
+    ]);
   }
 
   test_const_topVar() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
index f6526ff..1d8f643 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_from_deferred_library_test.dart
@@ -10,38 +10,15 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest);
-    defineReflectiveTests(NonConstantMapKeyFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapKeyFromDeferredLibraryTest extends PubPackageResolutionTest
-    with NonConstantMapKeyFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapKeyFromDeferredLibraryTest_language24
-    extends PubPackageResolutionTest
-    with NonConstantMapKeyFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapKeyFromDeferredLibraryTestCases {}
 
 mixin NonConstantMapKeyFromDeferredLibraryTestCases
     on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   @failingTest
   test_const_ifElement_thenTrue_deferredElse() async {
 // reports wrong error code
@@ -60,23 +37,14 @@
   test_const_ifElement_thenTrue_deferredThen() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) a.c : 0};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
-                    79,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 69, 17),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY, 79,
+          3),
+    ]);
   }
 
   test_const_topLevel_deferred() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
index f8b166b..8d42bf8 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_key_test.dart
@@ -10,66 +10,32 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapKeyTest);
-    defineReflectiveTests(NonConstantMapKeyTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapKeyTest extends PubPackageResolutionTest
-    with NonConstantMapKeyTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapKeyTest_language24 extends PubPackageResolutionTest
-    with NonConstantMapKeyTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapKeyTestCases {}
 
 mixin NonConstantMapKeyTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenTrue_elseFinal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 0: 1 else a : 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 75, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 25),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 75, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_thenFinal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) a : 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 65, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 15),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 65, 1),
+    ]);
   }
 
   test_const_topLevel() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
index ad0ec5b..f7b72d4 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_from_deferred_library_test.dart
@@ -10,40 +10,16 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueFromDeferredLibraryTest);
-    defineReflectiveTests(
-        NonConstantMapValueFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapValueFromDeferredLibraryTest
     extends PubPackageResolutionTest
-    with NonConstantMapValueFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapValueFromDeferredLibraryTest_language24
-    extends PubPackageResolutionTest
-    with NonConstantMapValueFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapValueFromDeferredLibraryTestCases {}
 
 mixin NonConstantMapValueFromDeferredLibraryTestCases
     on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   @failingTest
   test_const_ifElement_thenTrue_elseDeferred() async {
     // reports wrong error code
@@ -62,23 +38,14 @@
   test_const_ifElement_thenTrue_thenDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const { if (cond) 'a' : a.c};
-''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
-                    85,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 69, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
+          85, 3),
+    ]);
   }
 
   test_const_topLevel_deferred() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
index 74c3160..26a41df 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_value_test.dart
@@ -10,67 +10,32 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantMapValueTest);
-    defineReflectiveTests(NonConstantMapValueTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantMapValueTest extends PubPackageResolutionTest
-    with NonConstantMapValueTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantMapValueTest_language24 extends PubPackageResolutionTest
-    with NonConstantMapValueTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantMapValueTestCases {}
 
 mixin NonConstantMapValueTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifTrue_elseFinal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 'a': 'b', 'c' : a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 81, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 18),
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 81, 1),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 81, 1),
+    ]);
   }
 
   test_const_ifTrue_thenFinal() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 final dynamic a = 0;
 const cond = true;
 var v = const {if (cond) 'a' : a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 71, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 55, 17),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 71, 1),
+    ]);
   }
 
   test_const_topLevel() async {
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
index 8adf61f..5e28579 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_set_element_test.dart
@@ -10,36 +10,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonConstantSetElementTest);
-    defineReflectiveTests(NonConstantSetElementTest_language24);
   });
 }
 
 @reflectiveTest
 class NonConstantSetElementTest extends PubPackageResolutionTest
-    with NonConstantSetElementTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class NonConstantSetElementTest_language24 extends PubPackageResolutionTest
-    with NonConstantSetElementTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with NonConstantSetElementTestCases {}
 
 mixin NonConstantSetElementTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_forElement() async {
     await assertErrorsInCode(r'''
 const Set set = {};
@@ -50,119 +28,71 @@
   }
 
   test_const_ifElement_thenElseFalse_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) 0 else a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a else 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalElse() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) 0 else a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 59, 1),
+    ]);
   }
 
   test_const_ifElement_thenElseTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a else 0};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenFalse_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 < 0) a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
+    ]);
   }
 
   test_const_ifElement_thenTrue_constThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_finalThen() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 final dynamic a = 0;
 var v = const <int>{if (1 > 0) a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 12),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 52, 1),
+    ]);
   }
 
   test_const_parameter() async {
@@ -175,18 +105,12 @@
   }
 
   test_const_spread_final() async {
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 final Set x = null;
 var v = const {...x};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 38, 1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 35, 4),
-              ]);
+''', [
+      error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 38, 1),
+    ]);
   }
 
   test_const_topVar() async {
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 1ea665c..36645a4 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -157,7 +157,7 @@
       findNode.index('x[0]'),
       readElement: null,
       writeElement: null,
-      type: 'Never',
+      type: 'dynamic',
     );
 
     assertType(findNode.binary('1 + 2'), 'int');
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
index 1a89d0a..044914b 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_from_deferred_library_test.dart
@@ -10,37 +10,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementFromDeferredLibraryTest);
-    defineReflectiveTests(SetElementFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class SetElementFromDeferredLibraryTest extends PubPackageResolutionTest
-    with SetElementFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class SetElementFromDeferredLibraryTest_language24
-    extends PubPackageResolutionTest
-    with SetElementFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with SetElementFromDeferredLibraryTestCases {}
 
 mixin SetElementFromDeferredLibraryTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   @failingTest
   test_const_ifElement_thenTrue_elseDeferred() async {
     // reports wrong error code
@@ -58,20 +35,13 @@
   test_const_ifElement_thenTrue_thenDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const int c = 1;''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 const cond = true;
 var v = const {if (cond) a.c};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
-                    78, 3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 68, 13),
-              ]);
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY, 78, 3),
+    ]);
   }
 
   test_const_topLevel_deferred() async {
diff --git a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
index d7349b8..1d34872 100644
--- a/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/set_element_type_not_assignable_test.dart
@@ -10,136 +10,67 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SetElementTypeNotAssignableTest);
-    defineReflectiveTests(SetElementTypeNotAssignableTest_language24);
   });
 }
 
 @reflectiveTest
 class SetElementTypeNotAssignableTest extends PubPackageResolutionTest
-    with SetElementTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class SetElementTypeNotAssignableTest_language24
-    extends PubPackageResolutionTest with SetElementTypeNotAssignableTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with SetElementTypeNotAssignableTestCases {}
 
 mixin SetElementTypeNotAssignableTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_const_ifElement_thenElseFalse_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 0;
 var v = const <int>{if (1 < 0) a else b};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 62, 19),
-              ]);
+''');
   }
 
   test_const_ifElement_thenElseFalse_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 0;
 const dynamic b = 'b';
 var v = const <int>{if (1 < 0) a else b};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 82,
-                    1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 64, 19),
-              ]);
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 82, 1),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 var v = const <int>{if (1 < 0) 'a'};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 20, 14),
-                error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 31,
-                    3),
-              ]);
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 31, 3),
+    ]);
   }
 
   test_const_ifElement_thenFalse_intString_dynamic() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int>{if (1 < 0) a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 43, 12),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 const dynamic a = 0;
 var v = const <int>{if (true) a};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 41, 11),
-              ]);
+''');
   }
 
   test_const_ifElement_thenTrue_intString() async {
-    await assertErrorsInCode(
-        '''
+    await assertErrorsInCode('''
 const dynamic a = 'a';
 var v = const <int>{if (true) a};
-''',
-        _constant_update_2018
-            ? [
-                error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 53,
-                    1),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 43, 11),
-              ]);
+''', [
+      error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 53, 1),
+    ]);
   }
 
   test_const_spread_intInt() async {
-    await assertErrorsInCode(
-        '''
+    await assertNoErrorsInCode('''
 var v = const <int>{...[0, 1]};
-''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 20, 9),
-              ]);
+''');
   }
 
   test_explicitTypeArgs_const() async {
diff --git a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
index 3c9b2a3..c868a771 100644
--- a/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/spread_expression_from_deferred_library_test.dart
@@ -10,57 +10,25 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest);
-    defineReflectiveTests(SpreadExpressionFromDeferredLibraryTest_language24);
   });
 }
 
 @reflectiveTest
 class SpreadExpressionFromDeferredLibraryTest extends PubPackageResolutionTest
-    with SpreadExpressionFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => true;
-}
-
-@reflectiveTest
-class SpreadExpressionFromDeferredLibraryTest_language24
-    extends PubPackageResolutionTest
-    with SpreadExpressionFromDeferredLibraryTestCases {
-  @override
-  bool get _constant_update_2018 => false;
-
-  @override
-  void setUp() {
-    super.setUp();
-    writeTestPackageConfig(
-      PackageConfigFileBuilder(),
-      languageVersion: '2.4',
-    );
-  }
-}
+    with SpreadExpressionFromDeferredLibraryTestCases {}
 
 mixin SpreadExpressionFromDeferredLibraryTestCases on PubPackageResolutionTest {
-  bool get _constant_update_2018;
-
   test_inList_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const List c = [];''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const [...a.c];
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 56, 6),
-              ]);
+}''', [
+      error(
+          CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY, 59, 3),
+    ]);
   }
 
   test_inList_deferred_notConst() async {
@@ -76,39 +44,24 @@
   test_inList_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const List c = [];''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const [...a.c];
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT, 47, 6),
-              ]);
+}''');
   }
 
   test_inMap_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const Map c = <int, int>{};''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {...a.c};
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 56, 6),
-              ]);
+}''', [
+      error(
+          CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY, 59, 3),
+    ]);
   }
 
   test_inMap_notConst() async {
@@ -124,39 +77,24 @@
   test_inMap_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const Map c = <int, int>{};''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const {...a.c};
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 47, 6),
-              ]);
+}''');
   }
 
   test_inSet_deferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const Set c = <int>{};''');
-    await assertErrorsInCode(
-        r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' deferred as a;
 f() {
   return const {...a.c};
-}''',
-        _constant_update_2018
-            ? [
-                error(
-                    CompileTimeErrorCode
-                        .SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY,
-                    59,
-                    3),
-              ]
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 56, 6),
-              ]);
+}''', [
+      error(
+          CompileTimeErrorCode.SPREAD_EXPRESSION_FROM_DEFERRED_LIBRARY, 59, 3),
+    ]);
   }
 
   test_inSet_notConst() async {
@@ -172,16 +110,10 @@
   test_inSet_notDeferred() async {
     newFile(convertPath('$testPackageLibPath/lib1.dart'), content: r'''
 const Set c = <int>{};''');
-    await assertErrorsInCode(
-        r'''
+    await assertNoErrorsInCode(r'''
 import 'lib1.dart' as a;
 f() {
   return const {...a.c};
-}''',
-        _constant_update_2018
-            ? []
-            : [
-                error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 47, 6),
-              ]);
+}''');
   }
 }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index 01c5fd8..80a1d09 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -24,17 +24,17 @@
 }
 
 const Version enableAlternativeInvalidationStrategyVersion =
-    const Version(2, 11);
-const Version enableConstantUpdate2018Version = const Version(2, 4);
+    const Version(2, 10);
+const Version enableConstantUpdate2018Version = const Version(2, 0);
 const Version enableControlFlowCollectionsVersion = const Version(2, 0);
 const Version enableExtensionMethodsVersion = const Version(2, 6);
-const Version enableNonNullableVersion = const Version(2, 11);
-const Version enableNonfunctionTypeAliasesVersion = const Version(2, 11);
+const Version enableNonNullableVersion = const Version(2, 10);
+const Version enableNonfunctionTypeAliasesVersion = const Version(2, 10);
 const Version enableSetLiteralsVersion = const Version(2, 0);
 const Version enableSpreadCollectionsVersion = const Version(2, 0);
-const Version enableTripleShiftVersion = const Version(2, 11);
-const Version enableValueClassVersion = const Version(2, 11);
-const Version enableVarianceVersion = const Version(2, 11);
+const Version enableTripleShiftVersion = const Version(2, 10);
+const Version enableValueClassVersion = const Version(2, 10);
+const Version enableVarianceVersion = const Version(2, 10);
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
   switch (flag) {
@@ -93,31 +93,31 @@
 };
 
 const Map<ExperimentalFlag, Version> experimentEnabledVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 11),
-  ExperimentalFlag.constantUpdate2018: const Version(2, 4),
-  ExperimentalFlag.controlFlowCollections: const Version(2, 0),
-  ExperimentalFlag.extensionMethods: const Version(2, 6),
-  ExperimentalFlag.nonNullable: const Version(2, 11),
-  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 11),
-  ExperimentalFlag.setLiterals: const Version(2, 0),
-  ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.tripleShift: const Version(2, 11),
-  ExperimentalFlag.valueClass: const Version(2, 11),
-  ExperimentalFlag.variance: const Version(2, 11),
-};
-
-const Map<ExperimentalFlag, Version> experimentReleasedVersion = {
-  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 11),
-  ExperimentalFlag.constantUpdate2018: const Version(2, 4),
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 10),
+  ExperimentalFlag.constantUpdate2018: const Version(2, 0),
   ExperimentalFlag.controlFlowCollections: const Version(2, 0),
   ExperimentalFlag.extensionMethods: const Version(2, 6),
   ExperimentalFlag.nonNullable: const Version(2, 10),
-  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 11),
+  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 10),
   ExperimentalFlag.setLiterals: const Version(2, 0),
   ExperimentalFlag.spreadCollections: const Version(2, 0),
-  ExperimentalFlag.tripleShift: const Version(2, 11),
-  ExperimentalFlag.valueClass: const Version(2, 11),
-  ExperimentalFlag.variance: const Version(2, 11),
+  ExperimentalFlag.tripleShift: const Version(2, 10),
+  ExperimentalFlag.valueClass: const Version(2, 10),
+  ExperimentalFlag.variance: const Version(2, 10),
+};
+
+const Map<ExperimentalFlag, Version> experimentReleasedVersion = {
+  ExperimentalFlag.alternativeInvalidationStrategy: const Version(2, 10),
+  ExperimentalFlag.constantUpdate2018: const Version(2, 0),
+  ExperimentalFlag.controlFlowCollections: const Version(2, 0),
+  ExperimentalFlag.extensionMethods: const Version(2, 6),
+  ExperimentalFlag.nonNullable: const Version(2, 10),
+  ExperimentalFlag.nonfunctionTypeAliases: const Version(2, 10),
+  ExperimentalFlag.setLiterals: const Version(2, 0),
+  ExperimentalFlag.spreadCollections: const Version(2, 0),
+  ExperimentalFlag.tripleShift: const Version(2, 10),
+  ExperimentalFlag.valueClass: const Version(2, 10),
+  ExperimentalFlag.variance: const Version(2, 10),
 };
 
 const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index c16e23d..e533e56 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -14,32 +14,11 @@
 
 import 'package:kernel/ast.dart' as type;
 
-import '../builder/builder.dart' as type;
-import '../builder/builtin_type_declaration_builder.dart' as type;
-import '../builder/class_builder.dart' as type;
-import '../builder/constructor_reference_builder.dart' as type;
-import '../builder/dynamic_type_declaration_builder.dart' as type;
-import '../builder/enum_builder.dart' as type;
-import '../builder/field_builder.dart' as type;
 import '../builder/formal_parameter_builder.dart' as type;
-import '../builder/function_builder.dart' as type;
-import '../builder/function_type_builder.dart' as type;
-import '../builder/invalid_type_declaration_builder.dart' as type;
-import '../builder/library_builder.dart' as type;
-import '../builder/member_builder.dart' as type;
 import '../builder/metadata_builder.dart' as type;
-import '../builder/mixin_application_builder.dart' as type;
-import '../builder/modifier_builder.dart' as type;
-import '../builder/name_iterator.dart' as type;
-import '../builder/named_type_builder.dart' as type;
-import '../builder/nullability_builder.dart' as type;
-import '../builder/prefix_builder.dart' as type;
-import '../builder/type_alias_builder.dart' as type;
 import '../builder/type_builder.dart' as type;
-import '../builder/type_declaration_builder.dart' as type;
 import '../builder/type_variable_builder.dart' as type;
 import '../builder/unresolved_type.dart' as type;
-import '../builder/void_type_declaration_builder.dart' as type;
 
 import '../identifiers.dart' as type;
 
diff --git a/pkg/js/CHANGELOG.md b/pkg/js/CHANGELOG.md
index a996ef1..3728fa9 100644
--- a/pkg/js/CHANGELOG.md
+++ b/pkg/js/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.3-nullsafety.1
+
+* Allow 2.10 stable and 2.11.0 dev SDK versions.
+
 ## 0.6.3-nullsafety
 
 * Opt in to null safety.
diff --git a/pkg/js/pubspec.yaml b/pkg/js/pubspec.yaml
index 67165c3..b9d05c4 100644
--- a/pkg/js/pubspec.yaml
+++ b/pkg/js/pubspec.yaml
@@ -1,10 +1,10 @@
 name: js
-version: 0.6.3-nullsafety
+version: 0.6.3-nullsafety.1
 description: Annotations to create static Dart interfaces for JavaScript APIs.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/js
 
 environment:
-  sdk: '>=2.10.0-0 <2.10.0'
+  sdk: '>=2.10.0-0 <2.11.0'
 
 dev_dependencies:
   pedantic: ^1.9.0
diff --git a/pkg/kernel/lib/default_language_version.dart b/pkg/kernel/lib/default_language_version.dart
index eb90980..6b7b18c 100644
--- a/pkg/kernel/lib/default_language_version.dart
+++ b/pkg/kernel/lib/default_language_version.dart
@@ -9,4 +9,4 @@
 
 import "ast.dart";
 
-Version defaultLanguageVersion = const Version(2, 11);
+Version defaultLanguageVersion = const Version(2, 10);
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index f79fbff..9e27c00 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.3.0-nullsafety.3
+
+* Allow 2.10 stable and 2.11.0 dev SDK versions.
+
 ## 1.3.0-nullsafety.2
 
 * Update for the 2.10 dev sdk.
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index dfad765..be6237c 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: meta
-version: 1.3.0-nullsafety.2
+version: 1.3.0-nullsafety.3
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/meta
 description: >
  This library contains the declarations of annotations that developers can use
@@ -8,4 +8,4 @@
  to provide a better user experience.
 environment:
   # This must remain a tight constraint until nnbd is stable
-  sdk: '>=2.10.0-0 <2.10.0'
+  sdk: '>=2.10.0-0 <2.11.0'
diff --git a/runtime/bin/main_options.cc b/runtime/bin/main_options.cc
index 7c54268..1d2f619 100644
--- a/runtime/bin/main_options.cc
+++ b/runtime/bin/main_options.cc
@@ -487,7 +487,6 @@
 
   bool implicitly_use_dart_dev = false;
   bool run_script = false;
-  int script_or_cmd_index = -1;
 
   // Get the script name.
   if (i < argc) {
@@ -500,7 +499,6 @@
 #else
     bool is_potential_file_path = true;
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    script_or_cmd_index = i;
     if (Options::disable_dart_dev() ||
         (is_potential_file_path && !enable_vm_service_)) {
       *script_name = Utils::StrDup(argv[i]);
@@ -549,6 +547,9 @@
   else {  // NOLINT
     return -1;
   }
+  USE(enable_dartdev_analytics);
+  USE(disable_dartdev_analytics);
+
   const char** vm_argv = temp_vm_options.arguments();
   int vm_argc = temp_vm_options.count();
 
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 48553df..6f612fd 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -79,9 +79,9 @@
   kAppJIT,
 };
 
-static const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost";
-static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
-static const int INVALID_VM_SERVICE_SERVER_PORT = -1;
+static constexpr const char* DEFAULT_VM_SERVICE_SERVER_IP = "localhost";
+static constexpr int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
+static constexpr int INVALID_VM_SERVICE_SERVER_PORT = -1;
 
 class Options {
  public:
diff --git a/runtime/include/dart_api_dl.c b/runtime/include/dart_api_dl.c
index 7709a02..1a49c9c 100644
--- a/runtime/include/dart_api_dl.c
+++ b/runtime/include/dart_api_dl.c
@@ -16,7 +16,7 @@
 
 #undef DART_API_DL_DEFINITIONS
 
-typedef void (*DartApiEntry_function)();
+typedef void* DartApiEntry_function;
 
 DartApiEntry_function FindFunctionPointer(const DartApiEntry* entries,
                                           const char* name) {
diff --git a/runtime/tests/vm/dart/regress_42799_test.dart b/runtime/tests/vm/dart/regress_42799_test.dart
new file mode 100644
index 0000000..c091da7
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_42799_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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.
+
+// Verifies that AOT compiler doesn't crash when constant folding 'is'
+// test for a value which is a result of unreachable code
+// (result of inlined call of a method which doesn't return).
+// Regression test for https://github.com/dart-lang/sdk/issues/42799.
+
+import "package:expect/expect.dart";
+
+@pragma('vm:prefer-inline')
+dynamic foo0(int par1) {
+  if (par1 >= 39) {
+    return <String>[];
+  }
+  if (par1 >= 37) {
+    return <int>[];
+  }
+  throw 'hi';
+}
+
+main() {
+  Expect.throws(() {
+    if (foo0(0) is List<int>) {
+      print('not reachable');
+    }
+  }, (e) => e == 'hi');
+}
diff --git a/runtime/tests/vm/dart/send_instantiated_fun_test.dart b/runtime/tests/vm/dart/send_instantiated_fun_test.dart
index 751e8f8..ab58c88 100644
--- a/runtime/tests/vm/dart/send_instantiated_fun_test.dart
+++ b/runtime/tests/vm/dart/send_instantiated_fun_test.dart
@@ -16,7 +16,7 @@
 // Prevent obfuscation.
 @pragma('vm:entry-point')
 List<T> decodeFrom<T>(String s) {
-  return List();
+  return [];
 }
 
 // Prevent obfuscation.
diff --git a/runtime/tests/vm/dart_2/regress_42799_test.dart b/runtime/tests/vm/dart_2/regress_42799_test.dart
new file mode 100644
index 0000000..c091da7
--- /dev/null
+++ b/runtime/tests/vm/dart_2/regress_42799_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2020, 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.
+
+// Verifies that AOT compiler doesn't crash when constant folding 'is'
+// test for a value which is a result of unreachable code
+// (result of inlined call of a method which doesn't return).
+// Regression test for https://github.com/dart-lang/sdk/issues/42799.
+
+import "package:expect/expect.dart";
+
+@pragma('vm:prefer-inline')
+dynamic foo0(int par1) {
+  if (par1 >= 39) {
+    return <String>[];
+  }
+  if (par1 >= 37) {
+    return <int>[];
+  }
+  throw 'hi';
+}
+
+main() {
+  Expect.throws(() {
+    if (foo0(0) is List<int>) {
+      print('not reachable');
+    }
+  }, (e) => e == 'hi');
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 42a3df8..c228d58 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -174,6 +174,9 @@
 dart_2/data_uri_import_test/utf16: Crash
 dart_2/data_uri_import_test/wrongmime: Crash
 
+[ $builder_tag != bytecode_interpreter_nnbd && $builder_tag != bytecode_mixed_nnbd && $builder_tag != vm_nnbd ]
+dart/*: SkipByDesign # Migrated tests are not supposed to run on non-NNBD bots.
+
 [ $builder_tag == obfuscated && $compiler == dartkp ]
 dart/extension_names_test: SkipByDesign # No demangling (obfuscated).
 dart/extension_unnamed_names_test: SkipByDesign # No demangling (obfuscated).
@@ -382,9 +385,6 @@
 [ $builder_tag == bytecode_interpreter_nnbd || $builder_tag == bytecode_mixed_nnbd || $builder_tag == vm_nnbd ]
 dart_2/*: SkipByDesign # Legacy tests are not supposed to run on NNBD bots.
 
-[ $builder_tag != bytecode_interpreter_nnbd || $builder_tag != bytecode_mixed_nnbd || $builder_tag != vm_nnbd ]
-dart/*: SkipByDesign # Migrated tests are not supposed to run on non-NNBD bots.
-
 [ $builder_tag == crossword || $builder_tag == crossword_ast ]
 dart/bytecode_with_ast_in_aot_test: SkipByDesign # The test doesn't know location of cross-platform gen_snapshot
 dart/emit_aot_size_info_flag_test: SkipByDesign # The test itself cannot determine the location of gen_snapshot (only tools/test.py knows where it is).
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 72c1210..1918244 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -2206,14 +2206,14 @@
     s->WriteUnsigned(WrittenCount());
 
     // Set up references for those objects that will be written.
-    for (auto const ref : canonical_wsrs_) {
+    for (auto const& ref : canonical_wsrs_) {
       s->AssignRef(ref);
     }
 
     // In precompiled mode, set the object ID of each non-canonical WSR to
     // its canonical counterpart's object ID. This ensures that any reference to
     // it is serialized as a reference to the canonicalized one.
-    for (auto const ref : objects_) {
+    for (auto const& ref : objects_) {
       ASSERT(IsReachableReference(heap_->GetObjectId(ref)));
       if (ShouldDrop(ref)) {
         // For dropped references, reset their ID to be the unreachable
@@ -2238,7 +2238,7 @@
 
   void WriteFill(Serializer* s) {
     ASSERT(s->kind() == Snapshot::kFullAOT);
-    for (auto const ref : canonical_wsrs_) {
+    for (auto const& ref : canonical_wsrs_) {
       AutoTraceObject(ref);
 
       // In precompiled mode, we drop the reference to the target and only
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 20b25ca..5ed0188 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -438,29 +438,33 @@
 
   if (IsNonConstant(value) || IsNonConstant(dst_type)) {
     SetValue(instr, non_constant_);
-  } else if (IsConstant(value) && IsConstant(dst_type)) {
+    return;
+  } else if (IsUnknown(value) || IsUnknown(dst_type)) {
+    return;
+  }
+  ASSERT(IsConstant(value) && IsConstant(dst_type));
+  if (dst_type.IsAbstractType()) {
     // We are ignoring the instantiator and instantiator_type_arguments, but
     // still monotonic and safe.
     if (instr->value()->Type()->IsAssignableTo(AbstractType::Cast(dst_type))) {
       SetValue(instr, value);
-    } else {
-      SetValue(instr, non_constant_);
+      return;
     }
   }
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitAssertSubtype(AssertSubtypeInstr* instr) {}
 
 void ConstantPropagator::VisitAssertBoolean(AssertBooleanInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsBool()) {
+    SetValue(instr, value);
+  } else {
     SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    if (value.IsBool()) {
-      SetValue(instr, value);
-    } else {
-      SetValue(instr, non_constant_);
-    }
   }
 }
 
@@ -500,7 +504,7 @@
       // Otherwise evaluate string compare with propagated constants.
       const Object& o1 = instr->ArgumentAt(0)->constant_value();
       const Object& o2 = instr->ArgumentAt(1)->constant_value();
-      if (IsConstant(o1) && IsConstant(o2) && o1.IsString() && o2.IsString()) {
+      if (o1.IsString() && o2.IsString()) {
         SetValue(instr, Bool::Get(String::Cast(o1).Equals(String::Cast(o2))));
         return;
       }
@@ -511,7 +515,7 @@
       ASSERT(instr->FirstArgIndex() == 0);
       // Otherwise evaluate string length with propagated constants.
       const Object& o = instr->ArgumentAt(0)->constant_value();
-      if (IsConstant(o) && o.IsString()) {
+      if (o.IsString()) {
         const auto& str = String::Cast(o);
         if (kind == MethodRecognizer::kStringBaseLength) {
           SetValue(instr, Integer::ZoneHandle(Z, Integer::New(str.Length())));
@@ -551,14 +555,16 @@
 void ConstantPropagator::VisitIfThenElse(IfThenElseInstr* instr) {
   instr->comparison()->Accept(this);
   const Object& value = instr->comparison()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    ASSERT(!value.IsNull());
-    ASSERT(value.IsBool());
+  ASSERT(!value.IsNull());
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsBool()) {
     bool result = Bool::Cast(value).value();
     SetValue(instr, Smi::Handle(Z, Smi::New(result ? instr->if_true()
                                                    : instr->if_false())));
+  } else {
+    SetValue(instr, non_constant_);
   }
 }
 
@@ -649,17 +655,20 @@
   const Object& right = instr->right()->definition()->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
     SetValue(instr, non_constant_);
-  } else if (IsConstant(left) && IsConstant(right)) {
-    if (left.IsInteger() && right.IsInteger()) {
-      const bool result = CompareIntegers(
-          instr->kind(),
-          Integer::Handle(Z, Integer::Cast(left).BitOp(Token::kBIT_AND,
-                                                       Integer::Cast(right))),
-          Object::smi_zero());
-      SetValue(instr, result ? Bool::True() : Bool::False());
-    } else {
-      SetValue(instr, non_constant_);
-    }
+    return;
+  } else if (IsUnknown(left) || IsUnknown(right)) {
+    return;
+  }
+  ASSERT(IsConstant(left) && IsConstant(right));
+  if (left.IsInteger() && right.IsInteger()) {
+    const bool result = CompareIntegers(
+        instr->kind(),
+        Integer::Handle(Z, Integer::Cast(left).BitOp(Token::kBIT_AND,
+                                                     Integer::Cast(right))),
+        Object::smi_zero());
+    SetValue(instr, result ? Bool::True() : Bool::False());
+  } else {
+    SetValue(instr, non_constant_);
   }
 }
 
@@ -758,29 +767,33 @@
 void ConstantPropagator::VisitOneByteStringFromCharCode(
     OneByteStringFromCharCodeInstr* instr) {
   const Object& o = instr->char_code()->definition()->constant_value();
-  if (o.IsNull() || IsNonConstant(o)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(o)) {
+  if (IsUnknown(o)) {
+    return;
+  }
+  if (o.IsSmi()) {
     const intptr_t ch_code = Smi::Cast(o).Value();
     ASSERT(ch_code >= 0);
     if (ch_code < Symbols::kMaxOneCharCodeSymbol) {
       StringPtr* table = Symbols::PredefinedAddress();
       SetValue(instr, String::ZoneHandle(Z, table[ch_code]));
-    } else {
-      SetValue(instr, non_constant_);
+      return;
     }
   }
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitStringToCharCode(StringToCharCodeInstr* instr) {
   const Object& o = instr->str()->definition()->constant_value();
-  if (o.IsNull() || IsNonConstant(o)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(o)) {
+  if (IsUnknown(o)) {
+    return;
+  }
+  if (o.IsString()) {
     const String& str = String::Cast(o);
     const intptr_t result =
         (str.Length() == 1) ? static_cast<intptr_t>(str.CharAt(0)) : -1;
     SetValue(instr, Smi::ZoneHandle(Z, Smi::New(result)));
+  } else {
+    SetValue(instr, non_constant_);
   }
 }
 
@@ -858,11 +871,14 @@
 
 void ConstantPropagator::VisitBooleanNegate(BooleanNegateInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsBool()) {
     bool val = value.raw() != Bool::True().raw();
     SetValue(instr, Bool::Get(val));
+  } else {
+    SetValue(instr, non_constant_);
   }
 }
 
@@ -892,7 +908,7 @@
       SetValue(instr, non_constant_);
     }
   } else if (IsConstant(value)) {
-    if (value.IsInstance()) {
+    if (value.IsInstance() && (value.raw() != Object::sentinel().raw())) {
       const Instance& instance = Instance::Cast(value);
       if (instr->instantiator_type_arguments()->BindsToConstantNull() &&
           instr->function_type_arguments()->BindsToConstantNull()) {
@@ -1001,13 +1017,13 @@
     // Type refers to class type parameters.
     const Object& instantiator_type_args_obj =
         instr->instantiator_type_arguments()->definition()->constant_value();
-    if (IsNonConstant(instantiator_type_args_obj)) {
-      SetValue(instr, non_constant_);
+    if (IsUnknown(instantiator_type_args_obj)) {
       return;
     }
-    if (IsConstant(instantiator_type_args_obj)) {
+    if (instantiator_type_args_obj.IsTypeArguments()) {
       instantiator_type_args ^= instantiator_type_args_obj.raw();
     } else {
+      SetValue(instr, non_constant_);
       return;
     }
   }
@@ -1015,13 +1031,13 @@
     // Type refers to function type parameters.
     const Object& function_type_args_obj =
         instr->function_type_arguments()->definition()->constant_value();
-    if (IsNonConstant(function_type_args_obj)) {
-      SetValue(instr, non_constant_);
+    if (IsUnknown(function_type_args_obj)) {
       return;
     }
-    if (IsConstant(function_type_args_obj)) {
+    if (function_type_args_obj.IsTypeArguments()) {
       function_type_args ^= function_type_args_obj.raw();
     } else {
+      SetValue(instr, non_constant_);
       return;
     }
   }
@@ -1040,13 +1056,14 @@
     InstantiateTypeArgumentsInstr* instr) {
   const auto& type_arguments_obj =
       instr->type_arguments()->definition()->constant_value();
-  if (!IsConstant(type_arguments_obj)) {
-    if (IsNonConstant(type_arguments_obj)) {
-      SetValue(instr, non_constant_);
-    }
+  ASSERT(!type_arguments_obj.IsNull());
+  if (IsUnknown(type_arguments_obj)) {
     return;
   }
-  ASSERT(!type_arguments_obj.IsNull());
+  if (!type_arguments_obj.IsTypeArguments()) {
+    SetValue(instr, non_constant_);
+    return;
+  }
   const auto& type_arguments = TypeArguments::Cast(type_arguments_obj);
   if (type_arguments.IsInstantiated()) {
     ASSERT(type_arguments.IsCanonical());
@@ -1058,19 +1075,18 @@
     // Type arguments refer to class type parameters.
     const Object& instantiator_type_args_obj =
         instr->instantiator_type_arguments()->definition()->constant_value();
-    if (IsNonConstant(instantiator_type_args_obj)) {
+    if (IsUnknown(instantiator_type_args_obj)) {
+      return;
+    }
+    if (!instantiator_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
-    if (IsConstant(instantiator_type_args_obj)) {
-      instantiator_type_args ^= instantiator_type_args_obj.raw();
-      ASSERT(!instr->instantiator_class().IsNull());
-      if (type_arguments.CanShareInstantiatorTypeArguments(
-              instr->instantiator_class())) {
-        SetValue(instr, instantiator_type_args);
-        return;
-      }
-    } else {
+    instantiator_type_args ^= instantiator_type_args_obj.raw();
+    ASSERT(!instr->instantiator_class().IsNull());
+    if (type_arguments.CanShareInstantiatorTypeArguments(
+            instr->instantiator_class())) {
+      SetValue(instr, instantiator_type_args);
       return;
     }
   }
@@ -1079,18 +1095,17 @@
     // Type arguments refer to function type parameters.
     const Object& function_type_args_obj =
         instr->function_type_arguments()->definition()->constant_value();
-    if (IsNonConstant(function_type_args_obj)) {
+    if (IsUnknown(function_type_args_obj)) {
+      return;
+    }
+    if (!function_type_args_obj.IsTypeArguments()) {
       SetValue(instr, non_constant_);
       return;
     }
-    if (IsConstant(function_type_args_obj)) {
-      function_type_args ^= function_type_args_obj.raw();
-      ASSERT(!instr->function().IsNull());
-      if (type_arguments.CanShareFunctionTypeArguments(instr->function())) {
-        SetValue(instr, function_type_args);
-        return;
-      }
-    } else {
+    function_type_args ^= function_type_args_obj.raw();
+    ASSERT(!instr->function().IsNull());
+    if (type_arguments.CanShareFunctionTypeArguments(instr->function())) {
+      SetValue(instr, function_type_args);
       return;
     }
   }
@@ -1118,7 +1133,14 @@
 void ConstantPropagator::VisitBinaryIntegerOp(BinaryIntegerOpInstr* binary_op) {
   const Object& left = binary_op->left()->definition()->constant_value();
   const Object& right = binary_op->right()->definition()->constant_value();
-  if (IsConstant(left) && IsConstant(right)) {
+  if (IsNonConstant(left) || IsNonConstant(right)) {
+    SetValue(binary_op, non_constant_);
+    return;
+  } else if (IsUnknown(left) || IsUnknown(right)) {
+    return;
+  }
+  ASSERT(IsConstant(left) && IsConstant(right));
+  if (left.IsInteger() && right.IsInteger()) {
     const Integer& result = Integer::Handle(
         Z, Evaluator::BinaryIntegerEvaluate(left, right, binary_op->op_kind(),
                                             binary_op->is_truncating(),
@@ -1186,7 +1208,10 @@
 
 void ConstantPropagator::VisitUnaryIntegerOp(UnaryIntegerOpInstr* unary_op) {
   const Object& value = unary_op->value()->definition()->constant_value();
-  if (IsConstant(value)) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsInteger()) {
     const Integer& result = Integer::Handle(
         Z, Evaluator::UnaryIntegerEvaluate(value, unary_op->op_kind(),
                                            unary_op->representation(), T));
@@ -1195,7 +1220,6 @@
       return;
     }
   }
-
   SetValue(unary_op, non_constant_);
 }
 
@@ -1208,44 +1232,48 @@
 }
 
 void ConstantPropagator::VisitUnaryDoubleOp(UnaryDoubleOpInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle unary operations.
-    SetValue(instr, non_constant_);
-  }
+  // TODO(kmillikin): Handle unary operations.
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsConstant(value) && value.IsInteger()) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsInteger()) {
     SetValue(instr,
              Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
                                            Heap::kOld)));
-  } else if (!IsUnknown(value)) {
+  } else {
     SetValue(instr, non_constant_);
   }
 }
 
 void ConstantPropagator::VisitInt64ToDouble(Int64ToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsConstant(value) && value.IsInteger()) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsInteger()) {
     SetValue(instr,
              Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
                                            Heap::kOld)));
-  } else if (!IsUnknown(value)) {
+  } else {
     SetValue(instr, non_constant_);
   }
 }
 
 void ConstantPropagator::VisitInt32ToDouble(Int32ToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
-  if (IsConstant(value) && value.IsInteger()) {
+  if (IsUnknown(value)) {
+    return;
+  }
+  if (value.IsInteger()) {
     SetValue(instr,
              Double::Handle(Z, Double::New(Integer::Cast(value).AsDoubleValue(),
                                            Heap::kOld)));
-  } else if (!IsUnknown(value)) {
+  } else {
     SetValue(instr, non_constant_);
   }
 }
@@ -1320,23 +1348,30 @@
 void ConstantPropagator::VisitBinaryDoubleOp(BinaryDoubleOpInstr* instr) {
   const Object& left = instr->left()->definition()->constant_value();
   const Object& right = instr->right()->definition()->constant_value();
-  if (IsConstant(left) && IsConstant(right)) {
-    const bool both_are_integers = left.IsInteger() && right.IsInteger();
-    if (IsIntegerOrDouble(left) && IsIntegerOrDouble(right) &&
-        !both_are_integers) {
-      const double result_val = Evaluator::EvaluateDoubleOp(
-          ToDouble(left), ToDouble(right), instr->op_kind());
-      const Double& result =
-          Double::ZoneHandle(Double::NewCanonical(result_val));
-      SetValue(instr, result);
-      return;
-    }
+  if (IsNonConstant(left) || IsNonConstant(right)) {
+    SetValue(instr, non_constant_);
+    return;
+  } else if (IsUnknown(left) || IsUnknown(right)) {
+    return;
+  }
+  ASSERT(IsConstant(left) && IsConstant(right));
+  const bool both_are_integers = left.IsInteger() && right.IsInteger();
+  if (IsIntegerOrDouble(left) && IsIntegerOrDouble(right) &&
+      !both_are_integers) {
+    const double result_val = Evaluator::EvaluateDoubleOp(
+        ToDouble(left), ToDouble(right), instr->op_kind());
+    const Double& result = Double::ZoneHandle(Double::NewCanonical(result_val));
+    SetValue(instr, result);
+    return;
   }
   SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitDoubleTestOp(DoubleTestOpInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
+  if (IsUnknown(value)) {
+    return;
+  }
   const bool is_negated = instr->kind() != Token::kEQ;
   if (value.IsInteger()) {
     SetValue(instr, is_negated ? Bool::True() : Bool::False());
@@ -1365,24 +1400,13 @@
 }
 
 void ConstantPropagator::VisitMathUnary(MathUnaryInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle Math's unary operations (sqrt, cos, sin).
-    SetValue(instr, non_constant_);
-  }
+  // TODO(kmillikin): Handle Math's unary operations (sqrt, cos, sin).
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitMathMinMax(MathMinMaxInstr* instr) {
-  const Object& left = instr->left()->definition()->constant_value();
-  const Object& right = instr->right()->definition()->constant_value();
-  if (IsNonConstant(left) || IsNonConstant(right)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(left) && IsConstant(right)) {
-    // TODO(srdjan): Handle min and max.
-    SetValue(instr, non_constant_);
-  }
+  // TODO(srdjan): Handle min and max.
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitCaseInsensitiveCompare(
@@ -1391,23 +1415,13 @@
 }
 
 void ConstantPropagator::VisitUnbox(UnboxInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
+  // TODO(kmillikin): Handle conversion.
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitBox(BoxInstr* instr) {
-  const Object& value = instr->value()->definition()->constant_value();
-  if (IsNonConstant(value)) {
-    SetValue(instr, non_constant_);
-  } else if (IsConstant(value)) {
-    // TODO(kmillikin): Handle conversion.
-    SetValue(instr, non_constant_);
-  }
+  // TODO(kmillikin): Handle conversion.
+  SetValue(instr, non_constant_);
 }
 
 void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 3c2b977..da62873 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -1826,13 +1826,13 @@
   AlternativeReadingScopeWithNewData alt(&helper_->reader_,
                                          &H.metadata_payloads(), md_offset);
 
-  Thread* T = Thread::Current();
-  Zone* Z = T->zone();
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
   intptr_t unit_count = helper_->ReadUInt();
-  Array& loading_units = Array::Handle(Z, Array::New(unit_count + 1));
-  LoadingUnit& unit = LoadingUnit::Handle(Z);
-  LoadingUnit& parent = LoadingUnit::Handle(Z);
-  Library& lib = Library::Handle(Z);
+  Array& loading_units = Array::Handle(zone, Array::New(unit_count + 1));
+  LoadingUnit& unit = LoadingUnit::Handle(zone);
+  LoadingUnit& parent = LoadingUnit::Handle(zone);
+  Library& lib = Library::Handle(zone);
 
   for (int i = 0; i < unit_count; i++) {
     intptr_t id = helper_->ReadUInt();
@@ -1849,7 +1849,7 @@
     for (intptr_t j = 0; j < library_count; j++) {
       const String& uri =
           translation_helper_.DartSymbolPlain(helper_->ReadStringReference());
-      lib = Library::LookupLibrary(T, uri);
+      lib = Library::LookupLibrary(thread, uri);
       if (lib.IsNull()) {
         FATAL1("Missing library: %s\n", uri.ToCString());
       }
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index f28890b..bb55bba 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -148,8 +148,8 @@
           (parent.num_fixed_parameters() != target.num_fixed_parameters())) {
         needs_expr_temp_ = true;
       }
-      FALL_THROUGH;
     }
+      FALL_THROUGH;
     case FunctionLayout::kClosureFunction:
     case FunctionLayout::kRegularFunction:
     case FunctionLayout::kGetterFunction:
@@ -442,8 +442,8 @@
         FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(ADD_VAR);
 #undef ADD_VAR
       }
-      FALL_THROUGH;
     }
+      FALL_THROUGH;
     case FunctionLayout::kNoSuchMethodDispatcher: {
       for (intptr_t i = 0; i < function.NumParameters(); ++i) {
         LocalVariable* variable = MakeVariable(
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 4e81b70..369f95b 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -3121,6 +3121,7 @@
   __ pushl(AllocateTypedDataArrayABI::kLengthReg);
 
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, ECX, &call_runtime, false));
+  __ movl(EDI, AllocateTypedDataArrayABI::kLengthReg);
   /* Check that length is a positive Smi. */
   /* EDI: requested array length argument. */
   __ testl(EDI, Immediate(kSmiTagMask));
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 8c96d22..0046562 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -3528,14 +3528,12 @@
 }
 
 TEST_CASE(DartAPI_FinalizableHandleCallback) {
-  Dart_FinalizableHandle weak_ref = nullptr;
   int peer = 0;
   {
     Dart_EnterScope();
     Dart_Handle obj = NewString("new string");
     EXPECT_VALID(obj);
-    weak_ref = Dart_NewFinalizableHandle(obj, &peer, 0,
-                                         FinalizableHandlePeerFinalizer);
+    Dart_NewFinalizableHandle(obj, &peer, 0, FinalizableHandlePeerFinalizer);
     EXPECT(peer == 0);
     Dart_ExitScope();
   }
@@ -3676,26 +3674,22 @@
   Heap* heap = Isolate::Current()->heap();
   EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
   EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
-  Dart_FinalizableHandle weak1 = nullptr;
   static const intptr_t kWeak1ExternalSize = 1 * KB;
   {
     Dart_EnterScope();
     Dart_Handle obj = NewString("weakly referenced string");
     EXPECT_VALID(obj);
-    weak1 = Dart_NewFinalizableHandle(obj, nullptr, kWeak1ExternalSize,
-                                      NopCallback);
+    Dart_NewFinalizableHandle(obj, nullptr, kWeak1ExternalSize, NopCallback);
     Dart_ExitScope();
   }
   Dart_PersistentHandle strong_ref = nullptr;
-  Dart_FinalizableHandle weak2 = nullptr;
   static const intptr_t kWeak2ExternalSize = 2 * KB;
   {
     Dart_EnterScope();
     Dart_Handle obj = NewString("strongly referenced string");
     EXPECT_VALID(obj);
     strong_ref = Dart_NewPersistentHandle(obj);
-    weak2 = Dart_NewFinalizableHandle(obj, nullptr, kWeak2ExternalSize,
-                                      NopCallback);
+    Dart_NewFinalizableHandle(obj, nullptr, kWeak2ExternalSize, NopCallback);
     EXPECT_VALID(AsHandle(strong_ref));
     Dart_ExitScope();
   }
@@ -3810,7 +3804,6 @@
   Dart_Handle live = AllocateOldString("live");
   EXPECT_VALID(live);
   Dart_WeakPersistentHandle weak = NULL;
-  Dart_WeakPersistentHandle weak2 = NULL;
   {
     TransitionNativeToVM transition(thread);
     GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
@@ -3834,8 +3827,7 @@
   }
   // Large enough to trigger GC in old space. Not actually allocated.
   const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
-  weak2 =
-      Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
+  Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
   {
     TransitionNativeToVM transition(thread);
     GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
@@ -3852,7 +3844,6 @@
   Dart_EnterScope();
   Dart_Handle live = AllocateOldString("live");
   EXPECT_VALID(live);
-  Dart_FinalizableHandle weak = NULL;
   {
     TransitionNativeToVM transition(thread);
     GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
@@ -3863,8 +3854,7 @@
     Dart_EnterScope();
     Dart_Handle dead = AllocateOldString("dead");
     EXPECT_VALID(dead);
-    weak = Dart_NewFinalizableHandle(dead, nullptr, kSmallExternalSize,
-                                     NopCallback);
+    Dart_NewFinalizableHandle(dead, nullptr, kSmallExternalSize, NopCallback);
     Dart_ExitScope();
   }
   {
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index cfed7d7..41f1f99 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -50,7 +50,8 @@
 
 // If the forwarded bit and pointer tag bit are the same, we can avoid a few
 // conversions.
-COMPILE_ASSERT(kForwarded == kHeapObjectTag);
+COMPILE_ASSERT(static_cast<uword>(kForwarded) ==
+               static_cast<uword>(kHeapObjectTag));
 
 static inline bool IsForwarding(uword header) {
   uword bits = header & kForwardingMask;
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 7c8ba6a..3d52db5 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -259,7 +259,7 @@
   ASSERT(count != nullptr && size != nullptr);
   *count = 0;
   *size = 0;
-  for (auto const data : instructions_) {
+  for (auto const& data : instructions_) {
     if (data.trampoline_length != 0) {
       *count += 1;
       *size += data.trampoline_length;
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 8fdc9d0..d2cdbb5 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -1055,17 +1055,11 @@
                                      const char* original_working_directory) {
   // Start the kernel Isolate if it is not already running.
   if (!Start()) {
-    Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
-    result.error = Utils::StrDup("Error while starting Kernel isolate task");
     return false;
   }
   // Wait for Kernel isolate to finish initialization.
   Dart_Port kernel_port = WaitForKernelPort();
   if (kernel_port == ILLEGAL_PORT) {
-    Dart_KernelCompilationResult result = {};
-    result.status = Dart_KernelCompilationStatus_Unknown;
-    result.error = Utils::StrDup("Error while initializing Kernel isolate");
     return false;
   }
   KernelCompilationRequest request;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index b14b8e9..22e2810 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4923,8 +4923,8 @@
 
   intptr_t index() const { return raw_ptr()->index_; }
   void set_index(intptr_t value) const {
-    ASSERT(value == -1 ||
-           value >= 0 && value < std::numeric_limits<classid_t>::max());
+    ASSERT((value == -1) ||
+           ((value >= 0) && (value < std::numeric_limits<classid_t>::max())));
     StoreNonPointer(&raw_ptr()->index_, value);
   }
 
diff --git a/sdk/lib/_internal/js_runtime/pubspec.yaml b/sdk/lib/_internal/js_runtime/pubspec.yaml
index f42b2cd..96abf65 100644
--- a/sdk/lib/_internal/js_runtime/pubspec.yaml
+++ b/sdk/lib/_internal/js_runtime/pubspec.yaml
@@ -2,3 +2,5 @@
 # make it easier to develop on dart2js.
 name: js_runtime
 publish_to: none
+environment:
+  sdk: '>=2.10.0-0.0 <3.0.0'
diff --git a/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml b/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
index 79b69ee..8f46e53 100644
--- a/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
+++ b/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
@@ -2,3 +2,5 @@
 # make it easer to depend on libraries.dart from sdk packages like dart2js.
 name: sdk_library_metadata
 publish_to: none
+environment:
+  sdk: '>=2.10.0-0.0 <3.0.0'
diff --git a/tools/VERSION b/tools/VERSION
index e02ec4d..6b0416f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 2
-MINOR 11
+MINOR 10
 PATCH 0
-PRERELEASE 155
+PRERELEASE 156
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 8446bb3..b7276b8 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -93,7 +93,7 @@
 # default 'language' "category" with code generated for both CFE and Analyzer,
 # while other categories can be tailored more specifically.
 
-current-version: '2.11.0'
+current-version: '2.10.0'
 
 features:
   non-nullable:
@@ -126,7 +126,7 @@
 
   constant-update-2018:
     help: "Enhanced constant expressions"
-    enabledIn: '2.4.1'
+    enabledIn: '2.0.0'
     expired: true
 
   control-flow-collections:
