Version 2.19.0-20.0.dev

Merge commit '8b3e9a84e7db2fa4a5f5ee5dffadc118bb823a16' into 'dev'
diff --git a/pkg/compiler/test/serialization/data/unordered_indices.dart b/pkg/compiler/test/serialization/data/unordered_indices.dart
new file mode 100644
index 0000000..09c3234
--- /dev/null
+++ b/pkg/compiler/test/serialization/data/unordered_indices.dart
@@ -0,0 +1,19 @@
+// @dart=2.7
+// @doCodegen
+
+// Introduce a named parameter with a given string name.
+typedef Bar = String Function({String someString});
+
+class Foo {
+  Bar _bar;
+  Foo(this._bar);
+}
+
+void main() {
+  // Create a String constant that matches the name of the above named param.
+  print("someString");
+
+  // Include an expression whose static type involves the named param above. But
+  // importantly do not create an instance of the type.
+  final x = Foo(null)._bar;
+}
diff --git a/pkg/compiler/test/serialization/serialization_test.dart b/pkg/compiler/test/serialization/serialization_test.dart
index 3b052f5..3ce5512 100644
--- a/pkg/compiler/test/serialization/serialization_test.dart
+++ b/pkg/compiler/test/serialization/serialization_test.dart
@@ -64,6 +64,7 @@
         Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
     String mainCode = await new File.fromUri(entity.uri).readAsString();
     Map<String, String> memorySourceFiles = {entryPoint.path: mainCode};
+    final doCodegen = mainCode.contains('@doCodegen');
 
     if (libDirectory != null) {
       print('Supporting libraries:');
@@ -84,7 +85,8 @@
         entryPoint: entryPoint,
         memorySourceFiles: memorySourceFiles,
         options: testOptions,
-        strategy: strategy);
+        strategy: strategy,
+        doCodegen: doCodegen);
   }
   Expect.isFalse(hasFailures, 'Errors found.');
   Expect.isTrue(testCount > 0, "No files were tested.");
diff --git a/pkg/compiler/test/serialization/serialization_test_helper.dart b/pkg/compiler/test/serialization/serialization_test_helper.dart
index aa3474c..ace4373 100644
--- a/pkg/compiler/test/serialization/serialization_test_helper.dart
+++ b/pkg/compiler/test/serialization/serialization_test_helper.dart
@@ -107,7 +107,8 @@
     Uri librariesSpecificationUri,
     List<String> options,
     SerializationStrategy strategy: const BytesInMemorySerializationStrategy(),
-    bool useDataKinds: false}) async {
+    bool useDataKinds: false,
+    bool doCodegen: false}) async {
   var commonOptions = options + ['--out=out.js'];
   OutputCollector collector = new OutputCollector();
   CompilationResult result = await runCompiler(
@@ -157,10 +158,11 @@
 
   Directory dir =
       await Directory.systemTemp.createTemp('serialization_test_helper');
-  var dillFileUri = dir.uri.resolve('out.dill');
-  var closedWorldFileUri = dir.uri.resolve('world.data');
-  var dillBytes = collector3a.binaryOutputMap[dillUri].list;
-  var closedWorldBytes = collector3a.binaryOutputMap[closedWorldUri].list;
+  final dillFileUri = dir.uri.resolve('out.dill');
+  final closedWorldFileUri = dir.uri.resolve('world.data');
+  final globalDataUri = Uri.parse('global.data');
+  final dillBytes = collector3a.binaryOutputMap[dillUri].list;
+  final closedWorldBytes = collector3a.binaryOutputMap[closedWorldUri].list;
   File(dillFileUri.path).writeAsBytesSync(dillBytes);
   File(closedWorldFileUri.path).writeAsBytesSync(closedWorldBytes);
   OutputCollector collector3b = new OutputCollector();
@@ -173,7 +175,7 @@
           [
             '${Flags.inputDill}=$dillFileUri',
             '${Flags.readClosedWorld}=$closedWorldFileUri',
-            '${Flags.writeData}=global.data'
+            '${Flags.writeData}=$globalDataUri'
           ],
       outputProvider: collector3b,
       beforeRun: (Compiler compiler) {
@@ -182,12 +184,45 @@
       });
   Expect.isTrue(result3b.isSuccess);
 
+  final globalDataFileUri = dir.uri.resolve('global.data');
+
+  // We must write the global data bytes before calling
+  // `finishCompileAndCompare` below as that clears the collector.
+  if (doCodegen) {
+    Expect.isTrue(collector3b.binaryOutputMap.containsKey(globalDataUri));
+
+    final globalDataBytes = collector3b.binaryOutputMap[globalDataUri].list;
+    File(globalDataFileUri.path).writeAsBytesSync(globalDataBytes);
+  }
+
   await finishCompileAndCompare(
       expectedOutput, collector2, result2.compiler, strategy,
       stoppedAfterClosedWorld: true);
   await finishCompileAndCompare(
       expectedOutput, collector3b, result3b.compiler, strategy,
       stoppedAfterTypeInference: true);
+
+  if (doCodegen) {
+    OutputCollector collector4 = new OutputCollector();
+    CompilationResult result4 = await runCompiler(
+        entryPoint: entryPoint,
+        memorySourceFiles: memorySourceFiles,
+        packageConfig: packageConfig,
+        librariesSpecificationUri: librariesSpecificationUri,
+        options: commonOptions +
+            [
+              '${Flags.inputDill}=$dillFileUri',
+              '${Flags.readClosedWorld}=$closedWorldFileUri',
+              '${Flags.readData}=$globalDataFileUri',
+              '--out=out.js'
+            ],
+        outputProvider: collector4,
+        beforeRun: (Compiler compiler) {
+          compiler.forceSerializationForTesting = true;
+        });
+    Expect.isTrue(result4.isSuccess);
+  }
+
   await dir.delete(recursive: true);
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index cf62a55..10b1d6e 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 19
+PRERELEASE 20
 PRERELEASE_PATCH 0
\ No newline at end of file