diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7bf5a3a..dbc15dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,14 +27,8 @@
 
 #### Linter
 
-Updated the Linter to `1.4.0`, which includes:
+Updated the Linter to `1.3.0`, which includes:
 
-- `directives_ordering` now checks ordering of `package:` imports in code
-  outside pub packages.
-- simple reachability analysis added to `use_build_context_synchronously` to
-  short-circuit await-discovery in terminating blocks.
-- `use_build_context_synchronously` updated to recognize nullable types when
-  accessed from legacy libraries.
 - updated `non_constant_identifier_names` to check local variables, for-loop
   initializers and catch clauses.
 - updated error range of `lines_longer_than_80_chars` to start at 80 to make
diff --git a/DEPS b/DEPS
index 146ab90..dab41b0 100644
--- a/DEPS
+++ b/DEPS
@@ -124,7 +124,7 @@
   "intl_tag": "0.17.0-nullsafety",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_rev": "b8dfe403fd8528fd14399dee3a6527b55802dd4d",
-  "linter_tag": "1.4.0",
+  "linter_tag": "1.3.0",
   "logging_rev": "e2f633b543ef89c54688554b15ca3d7e425b86a2",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_rev": "9c4beaac96d8f008078e00b027915f81b665d2de",
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index a9154dd..23ba26d 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -270,18 +270,23 @@
   /// Verbosity level used for filtering emitted messages.
   Verbosity verbosity = Verbosity.all;
 
-  bool isExperimentEnabledByDefault(ExperimentalFlag flag) {
-    return flags.isExperimentEnabled(flag,
-        defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
-  }
-
-  /// Returns
+  /// Returns `true` if the experiment with the given [flag] is enabled, either
+  /// explicitly or implicitly.
+  ///
+  /// Note that libraries can still opt out of the experiment by having a lower
+  /// language version than required for the experiment.
   bool isExperimentEnabled(ExperimentalFlag flag) {
     return flags.isExperimentEnabled(flag,
         explicitExperimentalFlags: explicitExperimentalFlags,
         defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting);
   }
 
+  /// Returns `true` if the experiment with the given [flag] is enabled either
+  /// explicitly or implicitly for the library with the given [importUri].
+  ///
+  /// Note that the library can still opt out of the experiment by having a
+  /// lower language version than required for the experiment. See
+  /// [getExperimentEnabledVersionInLibrary].
   bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri importUri) {
     return flags.isExperimentEnabledInLibrary(flag, importUri,
         defaultExperimentFlagsForTesting: defaultExperimentFlagsForTesting,
@@ -289,6 +294,11 @@
         allowedExperimentalFlags: allowedExperimentalFlagsForTesting);
   }
 
+  /// Returns the minimum language version needed for a library with the given
+  /// [importUri] to opt in to the experiment with the given [flag].
+  ///
+  /// Note that the experiment might not be enabled at all for the library, as
+  /// computed by [isExperimentEnabledInLibrary].
   Version getExperimentEnabledVersionInLibrary(
       ExperimentalFlag flag, Uri importUri) {
     return flags.getExperimentEnabledVersionInLibrary(
@@ -300,6 +310,8 @@
             experimentReleasedVersionForTesting);
   }
 
+  /// Return `true` if the experiment with the given [flag] is enabled for the
+  /// library with the given [importUri] and language [version].
   bool isExperimentEnabledInLibraryByVersion(
       ExperimentalFlag flag, Uri importUri, Version version) {
     return flags.isExperimentEnabledInLibraryByVersion(flag, importUri, version,
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index bd9a076..9220790 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 import 'package:kernel/kernel.dart' show Version;
 
 part 'experimental_flags_generated.dart';
@@ -33,7 +31,7 @@
 
   /// Return the set of enabled experiments for the package with the [name],
   /// e.g. "path", possibly `null`.
-  Set<ExperimentalFlag> forPackage(String name) {
+  Set<ExperimentalFlag>? forPackage(String name) {
     return packageExperiments[name];
   }
 
@@ -53,16 +51,16 @@
 /// If [flag] is marked as expired in [expiredExperimentalFlags], the value from
 /// [defaultExperimentalFlags] is always returned.
 bool isExperimentEnabled(ExperimentalFlag flag,
-    {Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting}) {
+    {Map<ExperimentalFlag, bool>? explicitExperimentalFlags,
+    Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
-  bool enabled;
+  bool? enabled;
   if (explicitExperimentalFlags != null) {
     enabled = explicitExperimentalFlags[flag];
   }
@@ -70,7 +68,7 @@
     enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
-  return enabled;
+  return enabled!;
 }
 
 /// Returns `true` if [flag] is enabled in the library with the [canonicalUri]
@@ -90,17 +88,17 @@
 /// defines the identity of a library, for instance `dart:core`, `package:foo`,
 /// or `file:///path/dir/file.dart`.
 bool isExperimentEnabledInLibrary(ExperimentalFlag flag, Uri canonicalUri,
-    {Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    AllowedExperimentalFlags allowedExperimentalFlags}) {
+    {Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, bool>? explicitExperimentalFlags,
+    AllowedExperimentalFlags? allowedExperimentalFlags}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
-  bool enabled;
+  bool? enabled;
   if (explicitExperimentalFlags != null) {
     enabled = explicitExperimentalFlags[flag];
   }
@@ -108,9 +106,9 @@
     enabled ??= defaultExperimentFlagsForTesting[flag];
   }
   enabled ??= defaultExperimentalFlags[flag];
-  if (!enabled) {
+  if (!enabled!) {
     allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
-    Set<ExperimentalFlag> allowedFlags;
+    Set<ExperimentalFlag>? allowedFlags;
     if (canonicalUri.scheme == 'dart') {
       allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
     } else if (canonicalUri.scheme == 'package') {
@@ -134,13 +132,13 @@
 /// [canonicalUri].
 Version getExperimentEnabledVersionInLibrary(ExperimentalFlag flag,
     Uri canonicalUri, Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    {AllowedExperimentalFlags allowedExperimentalFlags,
-    Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting,
-    Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
+    {AllowedExperimentalFlags? allowedExperimentalFlags,
+    Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting,
+    Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting}) {
   allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
 
-  Set<ExperimentalFlag> allowedFlags;
+  Set<ExperimentalFlag>? allowedFlags;
   if (canonicalUri.scheme == 'dart') {
     allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
   } else if (canonicalUri.scheme == 'package') {
@@ -153,8 +151,8 @@
     }
     allowedFlags = allowedExperimentalFlags.forPackage(packageName);
   }
-  Version version;
-  bool enabledByDefault;
+  Version? version;
+  bool? enabledByDefault;
   if (defaultExperimentFlagsForTesting != null) {
     enabledByDefault = defaultExperimentFlagsForTesting[flag];
   }
@@ -162,7 +160,7 @@
 
   bool enabledExplicitly = explicitExperimentalFlags[flag] ?? false;
 
-  if (!enabledByDefault ||
+  if (!enabledByDefault! ||
       enabledExplicitly ||
       (allowedFlags != null && allowedFlags.contains(flag))) {
     // If the feature is not enabled by default or is enabled by the allowed
@@ -180,25 +178,25 @@
     version ??= experimentEnabledVersion[flag];
   }
   assert(version != null, "No version for enabling $flag in $canonicalUri.");
-  return version;
+  return version!;
 }
 
 bool isExperimentEnabledInLibraryByVersion(
     ExperimentalFlag flag, Uri canonicalUri, Version version,
-    {Map<ExperimentalFlag, bool> defaultExperimentFlagsForTesting,
-    Map<ExperimentalFlag, bool> explicitExperimentalFlags,
-    AllowedExperimentalFlags allowedExperimentalFlags,
-    Map<ExperimentalFlag, Version> experimentEnabledVersionForTesting,
-    Map<ExperimentalFlag, Version> experimentReleasedVersionForTesting}) {
+    {Map<ExperimentalFlag, bool>? defaultExperimentFlagsForTesting,
+    required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
+    AllowedExperimentalFlags? allowedExperimentalFlags,
+    Map<ExperimentalFlag, Version>? experimentEnabledVersionForTesting,
+    Map<ExperimentalFlag, Version>? experimentReleasedVersionForTesting}) {
   assert(defaultExperimentalFlags.containsKey(flag),
       "No default value for $flag.");
   assert(expiredExperimentalFlags.containsKey(flag),
       "No expired value for $flag.");
-  if (expiredExperimentalFlags[flag]) {
-    return defaultExperimentalFlags[flag];
+  if (expiredExperimentalFlags[flag]!) {
+    return defaultExperimentalFlags[flag]!;
   }
 
-  bool enabledByDefault;
+  bool? enabledByDefault;
   if (defaultExperimentFlagsForTesting != null) {
     enabledByDefault = defaultExperimentFlagsForTesting[flag];
   }
@@ -208,7 +206,7 @@
 
   allowedExperimentalFlags ??= defaultAllowedExperimentalFlags;
 
-  Set<ExperimentalFlag> allowedFlags;
+  Set<ExperimentalFlag>? allowedFlags;
   bool enabledByAllowed = false;
   if (canonicalUri.scheme == 'dart') {
     allowedFlags = allowedExperimentalFlags.forSdkLibrary(canonicalUri.path);
@@ -226,14 +224,14 @@
     enabledByAllowed = allowedFlags.contains(flag);
   }
 
-  if (enabledByDefault || enabledExplicitly || enabledByAllowed) {
+  if (enabledByDefault! || enabledExplicitly || enabledByAllowed) {
     // The feature is enabled depending on the library language version.
-    Version enabledVersion;
+    Version? enabledVersion;
     if (!enabledByDefault || enabledExplicitly || enabledByAllowed) {
       // If the feature is not enabled by default or is enabled by the allowed
       // list, use the experiment release version.
       if (experimentReleasedVersionForTesting != null) {
-        enabledVersion = experimentReleasedVersionForTesting[flag];
+        enabledVersion = experimentReleasedVersionForTesting[flag]!;
       }
       enabledVersion ??= experimentReleasedVersion[flag];
     } else {
@@ -244,7 +242,7 @@
       }
       enabledVersion ??= experimentEnabledVersion[flag];
     }
-    return version >= enabledVersion;
+    return version >= enabledVersion!;
   } else {
     // The feature is not enabled, regardless of library language version.
     return false;
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 af04e106..42d985f 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
@@ -2,8 +2,6 @@
 // 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.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
@@ -44,7 +42,7 @@
 const Version enableValueClassVersion = const Version(2, 14);
 const Version enableVarianceVersion = const Version(2, 14);
 
-ExperimentalFlag parseExperimentalFlag(String flag) {
+ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
     case "alternative-invalidation-strategy":
       return ExperimentalFlag.alternativeInvalidationStrategy;
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 04951b8..60c4162 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -362,11 +362,7 @@
   Target get target =>
       _target ??= _raw.target ?? new NoneTarget(new TargetFlags());
 
-  /// Returns `true` if the [flag] is enabled globally.
-  ///
-  /// This is `true` either if the [flag] is passed through an explicit
-  /// `--enable-experiment` option or if the [flag] is expired and on by
-  /// default.
+  /// Returns `true` if the [flag] is enabled globally by default.
   bool isExperimentEnabledByDefault(flags.ExperimentalFlag flag) {
     return flags.isExperimentEnabled(flag,
         defaultExperimentFlagsForTesting:
@@ -385,22 +381,29 @@
             _raw.defaultExperimentFlagsForTesting);
   }
 
-  /// Returns `true` if the [flag] is enabled in the library with the given
-  /// [importUri].
+  /// Returns `true` if the experiment with the given [flag] is enabled either
+  /// explicitly or implicitly for the library with the given [importUri].
   ///
-  /// This is `true` either if the [flag] is enabled globally as defined
-  /// by [isExperimentEnabledGlobally] or is explicitly enabled through
-  /// the 'allowed_experiments.json' file for this library.
+  /// Note that the library can still opt out of the experiment by having a
+  /// lower language version than required for the experiment. See
+  /// [getExperimentEnabledVersionInLibrary].
   bool isExperimentEnabledInLibrary(
       flags.ExperimentalFlag flag, Uri importUri) {
     return _raw.isExperimentEnabledInLibrary(flag, importUri);
   }
 
+  /// Returns the minimum language version needed for a library with the given
+  /// [importUri] to opt in to the experiment with the given [flag].
+  ///
+  /// Note that the experiment might not be enabled at all for the library, as
+  /// computed by [isExperimentEnabledInLibrary].
   Version getExperimentEnabledVersionInLibrary(
       flags.ExperimentalFlag flag, Uri importUri) {
     return _raw.getExperimentEnabledVersionInLibrary(flag, importUri);
   }
 
+  /// Return `true` if the experiment with the given [flag] is enabled for the
+  /// library with the given [importUri] and language [version].
   bool isExperimentEnabledInLibraryByVersion(
       flags.ExperimentalFlag flag, Uri importUri, Version version) {
     return _raw.isExperimentEnabledInLibraryByVersion(flag, importUri, version);
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 6b31ffd..8ccfba3 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -34,6 +34,10 @@
 class Sub extends Super;
 class FBound<T extends FBound<T>>;
 class MixinApplication extends Object with FBound<MixinApplication>;
+class ExtendedClass;
+class ExtendedGenericClass<X>;
+extension Extension on ExtendedClass;
+extension GenericExtension<Y> on ExtendedGenericClass<Y>;
 """;
 
 const String expectedSdk = """
@@ -81,6 +85,14 @@
 }
 class MixinApplication = self::Object with self::FBound<self::MixinApplication> {
 }
+class ExtendedClass extends self::Object {
+}
+class ExtendedGenericClass<X extends self::Object? = dynamic> extends self::Object {
+}
+extension Extension on self::ExtendedClass {
+}
+extension GenericExtension<Y extends self::Object? = dynamic> on self::ExtendedGenericClass<Y%> {
+}
 """;
 
 Component parseSdk(Uri uri, TypeParserEnvironment environment) {
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index c3ec736..cd96105 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -97,8 +97,6 @@
 // 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.
 
-// @dart = 2.9
-
 // NOTE: THIS FILE IS GENERATED. DO NOT EDIT.
 //
 // Instead modify 'tools/experimental_features.yaml' and run
@@ -154,7 +152,7 @@
 
   sb.write('''
 
-ExperimentalFlag parseExperimentalFlag(String flag) {
+ExperimentalFlag? parseExperimentalFlag(String flag) {
   switch (flag) {
 ''');
   for (String key in keys) {
diff --git a/pkg/kernel/lib/testing/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
index 4b935b4e..45ffeab 100644
--- a/pkg/kernel/lib/testing/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -123,6 +123,32 @@
   }
 }
 
+class ParsedExtension extends ParsedDeclaration {
+  final List<ParsedTypeVariable> typeVariables;
+  final ParsedInterfaceType onType;
+
+  ParsedExtension(String name, this.typeVariables, this.onType) : super(name);
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("extension ");
+    sb.write(name);
+    if (typeVariables.isNotEmpty) {
+      sb.write("<");
+      sb.writeAll(typeVariables, ", ");
+      sb.write(">");
+    }
+    sb.write(" on ");
+    sb.write(onType);
+    sb.write(";");
+    return "$sb";
+  }
+
+  R accept<R, A>(Visitor<R, A> visitor, [A a]) {
+    return visitor.visitExtension(this, a);
+  }
+}
+
 class ParsedTypedef extends ParsedDeclaration {
   final List<ParsedTypeVariable> typeVariables;
 
@@ -347,6 +373,7 @@
   ParsedType parseType() {
     if (optional("class")) return parseClass();
     if (optional("typedef")) return parseTypedef();
+    if (optional("extension")) return parseExtension();
     List<ParsedType> results = <ParsedType>[];
     do {
       ParsedType type;
@@ -494,6 +521,16 @@
         name, typeVariables, supertype, mixedInType, interfaces, callableType);
   }
 
+  ParsedExtension parseExtension() {
+    expect("extension");
+    String name = parseName();
+    List<ParsedTypeVariable> typeVariables = parseTypeVariablesOpt();
+    expect("on");
+    ParsedType onType = parseType();
+    expect(";");
+    return new ParsedExtension(name, typeVariables, onType);
+  }
+
   /// This parses a general typedef on this form:
   ///
   ///     typedef <name> <type-variables-opt> <type> ;
@@ -628,6 +665,10 @@
     return DefaultAction.perform<R, A>(this, node, a);
   }
 
+  R visitExtension(ParsedExtension node, A a) {
+    return DefaultAction.perform<R, A>(this, node, a);
+  }
+
   R visitTypedef(ParsedTypedef node, A a) {
     return DefaultAction.perform<R, A>(this, node, a);
   }
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index fcc984c..262ae20 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -4,30 +4,7 @@
 
 // @dart = 2.9
 
-import "package:kernel/ast.dart"
-    show
-        Class,
-        Component,
-        DartType,
-        DynamicType,
-        FunctionType,
-        FutureOrType,
-        InterfaceType,
-        InvalidType,
-        Library,
-        NamedType,
-        NeverType,
-        Node,
-        NullType,
-        Nullability,
-        Supertype,
-        TreeNode,
-        TypeParameter,
-        TypeParameterType,
-        Typedef,
-        TypedefType,
-        VoidType,
-        setParents;
+import "package:kernel/ast.dart" hide Visitor;
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
@@ -78,6 +55,13 @@
           new Class(fileUri: fileUri, name: name)
             ..typeParameters.addAll(new List<TypeParameter>.filled(
                 type.typeVariables.length, null)));
+    } else if (type is ParsedExtension) {
+      String name = type.name;
+      environment._registerDeclaration(
+          name,
+          new Extension(fileUri: fileUri, name: name)
+            ..typeParameters.addAll(new List<TypeParameter>.filled(
+                type.typeVariables.length, null)));
     }
   }
   for (ParsedType type in types) {
@@ -86,6 +70,8 @@
       library.addClass(node);
     } else if (node is Typedef) {
       library.addTypedef(node);
+    } else if (node is Extension) {
+      library.addExtension(node);
     } else {
       throw "Unsupported: $node";
     }
@@ -381,6 +367,26 @@
     return cls;
   }
 
+  Extension visitExtension(
+      ParsedExtension node, TypeParserEnvironment environment) {
+    String name = node.name;
+    Extension ext = environment.lookupDeclaration(name);
+    ParameterEnvironment parameterEnvironment =
+        computeTypeParameterEnvironment(node.typeVariables, environment);
+    List<TypeParameter> parameters = parameterEnvironment.parameters;
+    setParents(parameters, ext);
+    ext.typeParameters
+      ..clear()
+      ..addAll(parameters);
+    {
+      TypeParserEnvironment environment = parameterEnvironment.environment;
+      InterfaceType onType =
+          node.onType?.accept<Node, TypeParserEnvironment>(this, environment);
+      ext.onType = onType;
+    }
+    return ext;
+  }
+
   Typedef visitTypedef(ParsedTypedef node, TypeParserEnvironment environment) {
     String name = node.name;
     Typedef def = environment._registerDeclaration(
diff --git a/tests/standalone/io/process_non_ascii_test.dart b/tests/standalone/io/process_non_ascii_test.dart
index fd08f06..8944eda 100644
--- a/tests/standalone/io/process_non_ascii_test.dart
+++ b/tests/standalone/io/process_non_ascii_test.dart
@@ -35,6 +35,11 @@
         ..add(script),
       workingDirectory: nonAsciiDir.path,
       environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
+    if (result.exitCode != 0) {
+      print('exitCode:\n${result.exitCode}');
+      print('stdout:\n${result.stdout}');
+      print('stderr:\n${result.stderr}');
+    }
     Expect.equals(0, result.exitCode);
     tempDir.deleteSync(recursive: true);
     asyncEnd();
diff --git a/tests/standalone_2/io/process_non_ascii_test.dart b/tests/standalone_2/io/process_non_ascii_test.dart
index fd08f06..8944eda 100644
--- a/tests/standalone_2/io/process_non_ascii_test.dart
+++ b/tests/standalone_2/io/process_non_ascii_test.dart
@@ -35,6 +35,11 @@
         ..add(script),
       workingDirectory: nonAsciiDir.path,
       environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
+    if (result.exitCode != 0) {
+      print('exitCode:\n${result.exitCode}');
+      print('stdout:\n${result.stdout}');
+      print('stderr:\n${result.stderr}');
+    }
     Expect.equals(0, result.exitCode);
     tempDir.deleteSync(recursive: true);
     asyncEnd();
diff --git a/tools/VERSION b/tools/VERSION
index 7713491..d059f6c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 34
+PRERELEASE 35
 PRERELEASE_PATCH 0
\ No newline at end of file
