Version 2.14.0-83.0.dev

Merge commit 'cc1f9b9564144ca5d40bbe21b88acfcd461cf56a' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index b813027..e4dbd47 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -41,9 +41,11 @@
         LibraryDependency,
         LibraryPart,
         Name,
+        NamedNode,
         NonNullableByDefaultCompiledMode,
         Procedure,
         ProcedureKind,
+        Reference,
         ReturnStatement,
         Source,
         Supertype,
@@ -126,6 +128,8 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
+final Uri dartFfiUri = Uri.parse("dart:ffi");
+
 class IncrementalCompiler implements IncrementalKernelGenerator {
   final CompilerContext context;
 
@@ -998,6 +1002,20 @@
     }
   }
 
+  bool _importsFfi() {
+    if (userBuilders == null) return false;
+    final Uri dartFfiUri = Uri.parse("dart:ffi");
+    for (LibraryBuilder builder in userBuilders.values) {
+      Library lib = builder.library;
+      for (LibraryDependency dependency in lib.dependencies) {
+        if (dependency.targetLibrary.importUri == dartFfiUri) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   /// Figure out if we can (and was asked to) do experimental invalidation.
   /// Note that this returns (future or) [null] if we're not doing experimental
   /// invalidation.
@@ -1071,6 +1089,9 @@
       }
     }
 
+    // Special case mixins: Because the VM mixin transformation inlines
+    // procedures, if the changed file is used as a mixin anywhere else
+    // we can't only recompile the changed file.
     // TODO(jensj): Check for mixins in a smarter and faster way.
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
       if (missingSources.contains(builder.fileUri)) {
@@ -1094,6 +1115,37 @@
       }
     }
 
+    // Special case FFI: Because the VM ffi transformation inlines
+    // size and position, if the changed file contains ffi structs
+    // we can't only recompile the changed file.
+    // TODO(jensj): Come up with something smarter for this. E.g. we might
+    // check if the FFI-classes are used in other libraries, or as actual nested
+    // structures in other FFI-classes etc.
+    // Alternatively (https://github.com/dart-lang/sdk/issues/45899) we might
+    // do something else entirely that doesn't require special handling.
+    if (_importsFfi()) {
+      for (LibraryBuilder builder in rebuildBodies) {
+        Library lib = builder.library;
+        for (LibraryDependency dependency in lib.dependencies) {
+          Library importLibrary = dependency.targetLibrary;
+          if (importLibrary.importUri == dartFfiUri) {
+            // Explicitly imports dart:ffi.
+            return null;
+          }
+          for (Reference exportReference in importLibrary.additionalExports) {
+            NamedNode export = exportReference.node;
+            if (export is Class) {
+              Class c = export;
+              if (c.enclosingLibrary.importUri == dartFfiUri) {
+                // Implicitly imports a dart:ffi class.
+                return null;
+              }
+            }
+          }
+        }
+      }
+    }
+
     originalNotReusedLibraries = new Set<LibraryBuilder>();
     Set<Uri> seenUris = new Set<Uri>();
     for (LibraryBuilder builder in reusedResult.notReusedLibraries) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index a4ee9b7..42782a9 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -573,6 +573,7 @@
 init
 initializations
 initializer's
+inlines
 insertion
 inspect
 inspecting
@@ -962,6 +963,7 @@
 receivers
 recheck
 recognizing
+recompile
 recompiled
 recompiling
 recompute
@@ -1145,6 +1147,7 @@
 strict
 stringified
 stringify
+structs
 structures
 stub
 stubs
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
index 211fe88..e422ff5 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml
@@ -3,7 +3,8 @@
 # BSD-style license that can be found in the LICENSE.md file.
 
 # Compile an application, change a file, but don't change the outline.
-# Test FFI compilation.
+# Test FFI compilation. Because FFI is special we can't expect to only
+# compile the changed files.
 
 type: newworld
 worlds:
@@ -78,4 +79,4 @@
           }
         }
     expectedLibraryCount: 2
-    expectsRebuildBodiesOnly: true
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
new file mode 100644
index 0000000..03f9511a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml
@@ -0,0 +1,55 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    sources:
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 2
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_48_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
new file mode 100644
index 0000000..7f7cdad
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml
@@ -0,0 +1,64 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+# This test initializes from dill.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+    expectedLibraryCount: 2
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    expectInitializeFromDill: true
+    invalidate:
+      - lib.dart
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'dart:ffi';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 2
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..6563e60
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.1.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..8713870
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_49_ffi.yaml.world.2.expect
@@ -0,0 +1,101 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "dart:ffi";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
new file mode 100644
index 0000000..025fb00
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml
@@ -0,0 +1,59 @@
+# 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.md file.
+
+# The FFI transformation of nested structs has to update both position and size
+# of non-changed libraries, so the alternative invalidation has to be disabled.
+
+type: newworld
+worlds:
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    sources:
+      main.dart: |
+        import "dart:ffi";
+        import 'lib.dart';
+        class X extends Struct {
+          external Y x1;
+          external Y x2;
+          @Uint8()
+          external int x3;
+        }
+      lib.dart: |
+        import 'lib2.dart';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint8()
+          external int y2;
+          @Uint64()
+          external int y3;
+        }
+      lib2.dart: |
+        export 'lib3.dart';
+      lib3.dart: |
+        export 'dart:ffi';
+    expectedLibraryCount: 4
+
+  - entry: main.dart
+    experiments: alternative-invalidation-strategy,non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - lib.dart
+    sources:
+      lib.dart: |
+        import 'lib2.dart';
+        class Y extends Struct {
+          @Uint8()
+          external int y1;
+          @Uint64()
+          external int y3;
+          @Uint8()
+          external int y2;
+        }
+    expectedLibraryCount: 4
+    # The FFI transformation have to update the size and position of containers
+    # (i.e. other structs with this Struct inside), so rebuilding only the
+    # changed library doesn't work.
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
new file mode 100644
index 0000000..790b63b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.1.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C15).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C16
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C16
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 16
+  #C9 = 12
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = 1
+  #C15 = <dart.core::int*>[#C14, #C14, #C14]
+  #C16 = dart.ffi::Uint64 {}
+  #C17 = 8
+  #C18 = 4
+  #C19 = <dart.core::int*>[#C17, #C18, #C17]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 40
+  #C25 = 28
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 32
+  #C28 = 24
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
new file mode 100644
index 0000000..44136bf
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/no_outline_change_50_ffi.yaml.world.2.expect
@@ -0,0 +1,239 @@
+main = <No Member>;
+library from "org-dartlang-test:///lib.dart" as lib {
+
+  import "org-dartlang-test:///lib2.dart";
+
+  @#C7
+  class Y extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → lib::Y
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Y
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    @#C11
+    get y1() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y1(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C14
+    get y3() → dart.core::int
+      return dart.ffi::_loadUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C14
+    set y3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint64(this.{dart.ffi::_Compound::_typedDataBase}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+    @#C11
+    get y2() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set y2(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C19).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+library from "org-dartlang-test:///lib2.dart" as lib2 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "org-dartlang-test:///lib3.dart";
+
+}
+library from "org-dartlang-test:///lib3.dart" as lib3 {
+additionalExports = (ffi::nullptr,
+  ffi::unsized,
+  ffi::sizeOf,
+  ffi::Dart_NativeMessageHandler,
+  ffi::Allocator,
+  ffi::AllocatorAlloc,
+  ffi::Array,
+  ffi::ArrayArray,
+  ffi::DartRepresentationOf,
+  ffi::Dart_CObject,
+  ffi::Double,
+  ffi::DoubleArray,
+  ffi::DoublePointer,
+  ffi::DynamicLibrary,
+  ffi::DynamicLibraryExtension,
+  ffi::Float,
+  ffi::FloatArray,
+  ffi::FloatPointer,
+  ffi::Handle,
+  ffi::Int16,
+  ffi::Int16Array,
+  ffi::Int16Pointer,
+  ffi::Int32,
+  ffi::Int32Array,
+  ffi::Int32Pointer,
+  ffi::Int64,
+  ffi::Int64Array,
+  ffi::Int64Pointer,
+  ffi::Int8,
+  ffi::Int8Array,
+  ffi::Int8Pointer,
+  ffi::IntPtr,
+  ffi::IntPtrArray,
+  ffi::IntPtrPointer,
+  ffi::NativeApi,
+  ffi::NativeFunction,
+  ffi::NativeFunctionPointer,
+  ffi::NativePort,
+  ffi::NativeType,
+  ffi::Opaque,
+  ffi::Packed,
+  ffi::Pointer,
+  ffi::PointerArray,
+  ffi::PointerPointer,
+  ffi::Struct,
+  ffi::StructArray,
+  ffi::StructPointer,
+  ffi::Uint16,
+  ffi::Uint16Array,
+  ffi::Uint16Pointer,
+  ffi::Uint32,
+  ffi::Uint32Array,
+  ffi::Uint32Pointer,
+  ffi::Uint64,
+  ffi::Uint64Array,
+  ffi::Uint64Pointer,
+  ffi::Uint8,
+  ffi::Uint8Array,
+  ffi::Uint8Pointer,
+  ffi::Union,
+  ffi::UnionArray,
+  ffi::UnionPointer,
+  ffi::Unsized,
+  ffi::Void)
+
+  export "dart:ffi";
+
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+  import "dart:ffi";
+  import "org-dartlang-test:///lib.dart";
+
+  @#C23
+  class X extends dart.ffi::Struct {
+    static final field dart.core::int* #sizeOf = (#C26).{dart.core::List::[]}(dart.ffi::_abi())/*isLegacy*/;
+    synthetic constructor •() → main::X
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → main::X
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get x1() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C13).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x1(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C13).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    get x2() → lib::Y
+      return new lib::Y::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase};
+        dart.core::int #offset = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<lib::Y>(#typedDataBase.{dart.ffi::Pointer::address}.{dart.core::num::+}(#offset)) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}.{dart.core::num::+}(#offset), (#C10).{dart.core::List::[]}(dart.ffi::_abi())));
+    set x2(lib::Y #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}, (#C10).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}, #C12, (#C10).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    get x3() → dart.core::int
+      return dart.ffi::_loadUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()));
+    @#C11
+    set x3(dart.core::int #externalFieldValue) → void
+      return dart.ffi::_storeUint8(this.{dart.ffi::_Compound::_typedDataBase}, (#C29).{dart.core::List::[]}(dart.ffi::_abi()), #externalFieldValue);
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Uint8)
+  #C3 = TypeLiteralConstant(dart.ffi::Uint64)
+  #C4 = <dart.core::Type>[#C2, #C3, #C2]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 24
+  #C9 = 16
+  #C10 = <dart.core::int*>[#C8, #C9, #C8]
+  #C11 = dart.ffi::Uint8 {}
+  #C12 = 0
+  #C13 = <dart.core::int*>[#C12, #C12, #C12]
+  #C14 = dart.ffi::Uint64 {}
+  #C15 = 8
+  #C16 = 4
+  #C17 = <dart.core::int*>[#C15, #C16, #C15]
+  #C18 = 12
+  #C19 = <dart.core::int*>[#C9, #C18, #C9]
+  #C20 = TypeLiteralConstant(lib::Y)
+  #C21 = <dart.core::Type>[#C20, #C20, #C2]
+  #C22 = dart.ffi::_FfiStructLayout {fieldTypes:#C21, packing:#C5}
+  #C23 = dart.core::pragma {name:#C1, options:#C22}
+  #C24 = 56
+  #C25 = 36
+  #C26 = <dart.core::int*>[#C24, #C25, #C24]
+  #C27 = 48
+  #C28 = 32
+  #C29 = <dart.core::int*>[#C27, #C28, #C27]
+}
diff --git a/pkg/test_runner/lib/src/multitest.dart b/pkg/test_runner/lib/src/multitest.dart
index 7cd62eb..a194c73 100644
--- a/pkg/test_runner/lib/src/multitest.dart
+++ b/pkg/test_runner/lib/src/multitest.dart
@@ -83,10 +83,7 @@
   'syntax error',
   'compile-time error',
   'runtime error',
-  // TODO(rnystrom): Remove these after Dart 1.0 tests are removed.
-  'static type warning', // This is still a valid analyzer test
-  'dynamic type error', // This is now a no-op
-  'checked mode compile-time error' // This is now a no-op
+  'static type warning', // Used by some analyzer tests.
 };
 
 void _generateTestsFromMultitest(Path filePath, Map<String, String> tests,
diff --git a/tests/language/deferred/constraints_type_annotation_test.dart b/tests/language/deferred/constraints_type_annotation_test.dart
index 9d86ccb..8431093 100644
--- a/tests/language/deferred/constraints_type_annotation_test.dart
+++ b/tests/language/deferred/constraints_type_annotation_test.dart
@@ -22,11 +22,11 @@
   lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
   asyncStart();
   lib.loadLibrary().then((_) {
-    lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
-    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+    lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
     G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
     G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
-    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
     var a6 = new lib.C(); //# new: ok
     var g1 = new lib.G<F>(); //# new_generic1: ok
     // new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language/factory/factory1_test.dart b/tests/language/factory/factory1_test.dart
index d29187b..18302b0 100644
--- a/tests/language/factory/factory1_test.dart
+++ b/tests/language/factory/factory1_test.dart
@@ -6,7 +6,11 @@
 class A<T> {
   A() {}
   factory A.factory() {
-    return new A<String>(); // //# 00: compile-time error
+    return new A<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'A<String>' can't be returned from a function with return type 'A<T>'.
     return A<T>();
   }
 }
@@ -14,14 +18,18 @@
 class B<T> extends A<T> {
   B() {}
   factory B.factory() {
-    return new B<String>(); // //# 01: compile-time error
+    return new B<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'B<String>' can't be returned from a function with return type 'B<T>'.
     return B<T>();
   }
 }
 
 main() {
   new A<String>.factory();
-  new A<int>.factory(); // //# 00: dynamic type error
+  new A<int>.factory();
   new B<String>.factory();
-  new B<int>.factory(); // //# 01: dynamic type error
+  new B<int>.factory();
 }
diff --git a/tests/language_2/deferred/constraints_type_annotation_test.dart b/tests/language_2/deferred/constraints_type_annotation_test.dart
index d155d14..bb620b8 100644
--- a/tests/language_2/deferred/constraints_type_annotation_test.dart
+++ b/tests/language_2/deferred/constraints_type_annotation_test.dart
@@ -24,11 +24,11 @@
   lib2.C a1 = new lib2.C(); //# type_annotation_non_deferred: continued
   asyncStart();
   lib.loadLibrary().then((_) {
-    lib.C a2 = new lib.C(); //# type_annotation1: dynamic type error, compile-time error
-    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: dynamic type error, compile-time error
+    lib.C a2 = new lib.C(); //# type_annotation1: compile-time error
+    lib.G<F> a3 = new lib.G<F>(); //# type_annotation_generic1: compile-time error
     G2<lib.C> a4 = new G2(); //# type_annotation_generic2: compile-time error
     G2<lib.C> a5 = new G2<lib.C>(); //# type_annotation_generic3: compile-time error
-    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: dynamic type error, compile-time error
+    lib.G<lib.C> a = new lib.G<lib.C>(); //# type_annotation_generic4: compile-time error
     var a6 = new lib.C(); //# new: ok
     var g1 = new lib.G<F>(); //# new_generic1: ok
     // new G2<lib.C>() does not give a dynamic type error because a malformed
diff --git a/tests/language_2/factory/factory1_test.dart b/tests/language_2/factory/factory1_test.dart
index d8b1dd7..bac0e94 100644
--- a/tests/language_2/factory/factory1_test.dart
+++ b/tests/language_2/factory/factory1_test.dart
@@ -8,20 +8,28 @@
 class A<T> {
   A() {}
   factory A.factory() {
-    return new A<String>(); // //# 00: compile-time error
+    return new A<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'A<String>' can't be assigned to a variable of type 'A<T>'.
   }
 }
 
 class B<T> extends A<T> {
   B() {}
   factory B.factory() {
-    return new B<String>(); // //# 01: compile-time error
+    return new B<String>();
+    //     ^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
+    //         ^
+    // [cfe] A value of type 'B<String>' can't be assigned to a variable of type 'B<T>'.
   }
 }
 
 main() {
   new A<String>.factory();
-  new A<int>.factory(); // //# 00: dynamic type error
+  new A<int>.factory();
   new B<String>.factory();
-  new B<int>.factory(); // //# 01: dynamic type error
+  new B<int>.factory();
 }
diff --git a/tools/VERSION b/tools/VERSION
index a12e0b3..6e2781c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 82
+PRERELEASE 83
 PRERELEASE_PATCH 0
\ No newline at end of file