Version 2.13.0-158.0.dev

Merge commit '86e296f3ce7a728a9cad5f73263755efef4d6bae' into 'dev'
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index 49a8a88..507ea06 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -209,23 +209,15 @@
 }
 
 extension on CommentToken {
-  /// The error codes currently do not contain digits or dollar signs, so we
-  /// can be a bit more restrictive in this test.
-  static final _identifierRegExp = RegExp(r'^[a-zA-Z][_a-zA-Z]*$');
-
   /// Return the diagnostic names contained in this comment, assuming that it is
   /// a correctly formatted ignore comment.
   Iterable<DiagnosticName> get diagnosticNames sync* {
-    bool isValidIdentifier(String text) {
-      return text.contains(_identifierRegExp);
-    }
-
     int offset = lexeme.indexOf(':') + 1;
     var names = lexeme.substring(offset).split(',');
     offset += this.offset;
     for (var name in names) {
       var trimmedName = name.trim();
-      if (trimmedName.isNotEmpty && isValidIdentifier(trimmedName)) {
+      if (trimmedName.isNotEmpty) {
         var innerOffset = name.indexOf(trimmedName);
         yield DiagnosticName(trimmedName.toLowerCase(), offset + innerOffset);
       }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 8702311..e4b76d3 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -237,6 +237,11 @@
 const String overwriteCurrentSdkVersion = '--overwrite-current-sdk-version=';
 const String noVerifyCmd = '--no-verify';
 
+final ExpectationSet staticExpectationSet =
+    new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
+final Expectation semiFuzzFailure = staticExpectationSet["SemiFuzzFailure"];
+final Expectation semiFuzzCrash = staticExpectationSet["SemiFuzzCrash"];
+
 /// Options used for all tests within a given folder.
 ///
 /// This is used for instance for defining target, mode, and experiment specific
@@ -332,8 +337,7 @@
   bool get canBeFixWithUpdateExpectations => true;
 
   @override
-  final ExpectationSet expectationSet =
-      new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
+  final ExpectationSet expectationSet = staticExpectationSet;
 
   Map<Uri, Component> _platforms = {};
 
@@ -404,11 +408,17 @@
       steps.add(const EnsureNoErrors());
       if (!skipVm) {
         steps.add(const WriteDill());
-        steps.add(const Run());
       }
       if (semiFuzz) {
         steps.add(const FuzzCompiles());
       }
+
+      // Notice: The below steps will run async, i.e. the next test will run
+      // intertwined with this/these step(s). That for instance means that they
+      // should not touch any ASTs!
+      if (!skipVm) {
+        steps.add(const Run());
+      }
     }
   }
 
@@ -716,6 +726,11 @@
       Set<Expectation> outcomes, TestDescription description) {
     if (skipVm && outcomes.length == 1 && outcomes.single == runtimeError) {
       return new Set<Expectation>.from([Expectation.Pass]);
+    } else if (!semiFuzz &&
+        outcomes.length == 1 &&
+        (outcomes.single == semiFuzzFailure ||
+            outcomes.single == semiFuzzCrash)) {
+      return new Set<Expectation>.from([Expectation.Pass]);
     } else {
       return outcomes;
     }
@@ -795,10 +810,9 @@
 
   String get name => "run";
 
+  /// WARNING: Every subsequent step in this test will run async as well!
   bool get isAsync => true;
 
-  bool get isRuntime => true;
-
   Future<Result<ComponentResult>> run(
       ComponentResult result, FastaContext context) async {
     FolderOptions folderOptions =
@@ -1188,7 +1202,7 @@
         userLibraries.length != result.userLibraries.length) {
       return new Result<ComponentResult>(
           result,
-          context.expectationSet["SemiFuzzFailure"],
+          semiFuzzFailure,
           "Got a different amount of user libraries on first compile "
           "compared to 'original' compilation:\n\n"
           "This compile:\n"
@@ -1213,7 +1227,7 @@
               originalErrors.map((error) => error.join('\n')).join('\n\n');
           return new Result<ComponentResult>(
               result,
-              context.expectationSet["SemiFuzzFailure"],
+              semiFuzzFailure,
               "Expected these errors:\n${errorsString}\n\n"
               "but didn't get any after invalidating $importUri");
         } else {
@@ -1222,7 +1236,7 @@
               .join('\n\n');
           return new Result<ComponentResult>(
               result,
-              context.expectationSet["SemiFuzzFailure"],
+              semiFuzzFailure,
               "Unexpected errors:\n${errorsString}\n\n"
               "after invalidating $importUri");
         }
@@ -1234,7 +1248,7 @@
           newUserLibraries.length != userLibraries.length) {
         return new Result<ComponentResult>(
             result,
-            context.expectationSet["SemiFuzzFailure"],
+            semiFuzzFailure,
             "Got a different amount of user libraries on recompile "
             "compared to 'original' compilation after having invalidated "
             "$importUri.\n\n"
@@ -1303,8 +1317,18 @@
         continue;
       }
       Uint8List orgData = fs.data[uri];
-      FuzzAstVisitorSorter fuzzAstVisitorSorter =
-          new FuzzAstVisitorSorter(orgData, builder.isNonNullableByDefault);
+      FuzzAstVisitorSorter fuzzAstVisitorSorter;
+      try {
+        fuzzAstVisitorSorter =
+            new FuzzAstVisitorSorter(orgData, builder.isNonNullableByDefault);
+      } on FormatException catch (e, st) {
+        // UTF-16-LE formatted test crashes `utf8.decode(bytes)` --- catch that
+        return new Result<ComponentResult>(
+            result,
+            semiFuzzCrash,
+            "$e\n\n"
+            "$st");
+      }
 
       // Sort ascending and then compile. Then sort descending and try again.
       for (void Function() sorter in [
@@ -1325,7 +1349,7 @@
         } catch (e, st) {
           return new Result<ComponentResult>(
               result,
-              context.expectationSet["SemiFuzzCrash"],
+              semiFuzzCrash,
               "Crashed with '$e' after reordering '$uri' to\n\n"
               "$sb\n\n"
               "$st");
@@ -1345,7 +1369,7 @@
                 originalErrors.map((error) => error.join('\n')).join('\n\n');
             return new Result<ComponentResult>(
                 result,
-                context.expectationSet["SemiFuzzFailure"],
+                semiFuzzFailure,
                 "Expected these errors:\n${errorsString}\n\n"
                 "but didn't get any after reordering $uri "
                 "to have this content:\n\n"
@@ -1353,7 +1377,7 @@
           } else {
             return new Result<ComponentResult>(
                 result,
-                context.expectationSet["SemiFuzzFailure"],
+                semiFuzzFailure,
                 "Unexpected errors:\n${errorsString}\n\n"
                 "after reordering $uri to have this content:\n\n"
                 "$sb");
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index b3ade10..253e22b 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -738,6 +738,7 @@
 timings
 tinv
 told
+touch
 tpt
 transitively
 translators
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 58f937f..9c4e2cc 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -4,11 +4,11 @@
 
 # Status file for the weak_suite.dart test suite.
 
-# general/platform_invalid_uris/main: SemiFuzzFailure # semi fuzz fails but isn't currently enabled by default.
-# general/error_recovery/issue_39058.crash: SemiFuzzFailure # semi fuzz fails but isn't currently enabled by default.
-# general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure # semi fuzz fails but isn't currently enabled by default.
-# general/error_recovery/issue_39202.crash: SemiFuzzCrash # semi fuzz fails but isn't currently enabled by default.
-# regress/utf_16_le_content.crash: Crash # semi fuzz fails but isn't currently enabled by default.
+general/platform_invalid_uris/main: SemiFuzzFailure
+general/error_recovery/issue_39058_prime.crash: SemiFuzzFailure
+general/error_recovery/issue_39202.crash: SemiFuzzCrash
+general/error_recovery/issue_39058.crash: SemiFuzzFailure
+regress/utf_16_le_content.crash: SemiFuzzCrash
 
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple_getter_resolution: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/testing/lib/src/chain.dart b/pkg/testing/lib/src/chain.dart
index 1f7fc84..c56fc21 100644
--- a/pkg/testing/lib/src/chain.dart
+++ b/pkg/testing/lib/src/chain.dart
@@ -322,12 +322,29 @@
 
   String get name;
 
+  /// Sets this (*and effectively subsequent*) test step(s) as async.
+  ///
+  /// TL;DR: Either set to false, or only set to true when this and all
+  /// subsequent steps can run intertwined with another test.
+  ///
+  /// Details:
+  ///
+  /// A single test (TestDescription) can have several steps (Step).
+  /// When running a test the first step is executed, and when that step is done
+  /// the next step is executed by the now-ending step.
+  ///
+  /// When isAsync is false each step returns a future which is awaited,
+  /// effectivly meaning that only a single test is run at a time.
+  ///
+  /// When isAsync is true that step doesn't return a future (but adds it's
+  /// future to a list which is awaited before sending an 'entire suite done'
+  /// message), meaning that the next test can start before the step is
+  /// finished. As the next step in the test only starts after the current
+  /// step finishes, that also means that the next test can start - and run
+  /// intertwined with - a subsequent step even if such a subsequent step has
+  /// isAsync set to false.
   bool get isAsync => false;
 
-  bool get isCompiler => false;
-
-  bool get isRuntime => false;
-
   Future<Result<O>> run(I input, C context);
 
   Result<O> unhandledError(error, StackTrace trace) {
diff --git a/tools/VERSION b/tools/VERSION
index 91d40c7..654aa33 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 157
+PRERELEASE 158
 PRERELEASE_PATCH 0
\ No newline at end of file