Version 2.14.0-343.0.dev

Merge commit '45899910b39825473ab042609c1bc823cddc9594' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ef545f2..7730306 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1369,6 +1369,46 @@
     typeAliasedFactoryInvocations.clear();
   }
 
+  @override
+  bool isProperRenameForClass(Typedef typedef) {
+    DartType? rhsType = typedef.type;
+    if (rhsType is! InterfaceType) {
+      return false;
+    }
+
+    List<TypeParameter> fromParameters = typedef.typeParameters;
+    List<TypeParameter> toParameters = rhsType.classNode.typeParameters;
+    List<DartType> typeArguments = rhsType.typeArguments;
+    if (fromParameters.length != typeArguments.length) {
+      return false;
+    }
+    for (int i = 0; i < fromParameters.length; ++i) {
+      if (typeArguments[i] !=
+          new TypeParameterType.withDefaultNullabilityForLibrary(
+              fromParameters[i], typedef.enclosingLibrary)) {
+        return false;
+      }
+    }
+
+    Map<TypeParameter, DartType> substitutionMap = {};
+    for (int i = 0; i < fromParameters.length; ++i) {
+      substitutionMap[fromParameters[i]] =
+          new TypeParameterType.forAlphaRenaming(
+              fromParameters[i], toParameters[i]);
+    }
+    Substitution substitution = Substitution.fromMap(substitutionMap);
+    for (int i = 0; i < fromParameters.length; ++i) {
+      if (!typeEnvironment.areMutualSubtypes(
+          toParameters[i].bound,
+          substitution.substituteType(fromParameters[i].bound),
+          SubtypeCheckMode.withNullabilities)) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
   /// Perform actions that were delayed
   ///
   /// An action can be delayed, for instance, because it depends on some
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 8842a74..7a251c4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -3120,8 +3120,6 @@
             _uri);
       } else {
         if (declarationBuilder is DeclarationBuilder) {
-          unaliasedTypeArguments =
-              aliasBuilder.unaliasTypeArguments(aliasedTypeArguments);
           if (aliasedTypeArguments != null) {
             _helper.libraryBuilder.uncheckedTypedefTypes.add(
                 new UncheckedTypedefType(new TypedefType(
@@ -3132,6 +3130,10 @@
                   ..fileUri = _uri
                   ..offset = fileOffset);
           }
+
+          // If the arguments weren't supplied, the tear off is treated as
+          // generic, and the aliased type arguments match type parameters of
+          // the type alias.
           if (aliasedTypeArguments == null &&
               aliasBuilder.typeVariablesCount != 0) {
             isGenericTypedefTearOff = true;
@@ -3192,16 +3194,34 @@
             if (tearOffExpression != null) {
               List<DartType>? builtTypeArguments;
               if (unaliasedTypeArguments != null) {
-                builtTypeArguments = declarationBuilder.buildTypeArguments(
-                    _helper.libraryBuilder, unaliasedTypeArguments);
+                if (unaliasedTypeArguments.length !=
+                    declarationBuilder.typeVariablesCount) {
+                  // The type arguments are either aren't provided or mismatch
+                  // in number with the type variables of the RHS declaration.
+                  // We substitute them with the default types here: in the
+                  // first case that would be exactly what type inference fills
+                  // in for the RHS, and in the second case it's a reasonable
+                  // fallback, as the error is reported during a check on the
+                  // typedef.
+                  builtTypeArguments = <DartType>[];
+                  for (TypeParameter typeParameter
+                      in declarationBuilder.cls.typeParameters) {
+                    builtTypeArguments.add(typeParameter.defaultType);
+                  }
+                } else {
+                  builtTypeArguments = declarationBuilder.buildTypeArguments(
+                      _helper.libraryBuilder, unaliasedTypeArguments);
+                }
               } else if (typeArguments != null) {
                 builtTypeArguments =
                     _helper.buildDartTypeArguments(typeArguments);
               }
               if (isGenericTypedefTearOff) {
+                if (_helper.isProperRenameForClass(aliasBuilder!.typedef)) {
+                  return tearOffExpression;
+                }
                 FreshTypeParameters freshTypeParameters =
-                    getFreshTypeParameters(
-                        aliasBuilder!.typedef.typeParameters);
+                    getFreshTypeParameters(aliasBuilder.typedef.typeParameters);
                 List<DartType>? substitutedTypeArguments;
                 if (builtTypeArguments != null) {
                   substitutedTypeArguments = <DartType>[];
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 88a1430..8578128 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -36,6 +36,7 @@
         StaticGet,
         TreeNode,
         TypeParameter,
+        Typedef,
         VariableDeclaration;
 
 abstract class ExpressionGeneratorHelper implements InferenceHelper {
@@ -176,4 +177,7 @@
   ///
   /// This is needed for type promotion.
   void registerVariableAssignment(VariableDeclaration variable);
+
+  /// Checks that a generic [typedef] for a generic class.
+  bool isProperRenameForClass(Typedef typedef);
 }
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart
new file mode 100644
index 0000000..969cca4
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A1<T> {}
+
+typedef B1<T> = A1<T>;
+
+class A2<T extends num> {}
+
+typedef B2<T extends num> = A2<T>;
+
+class A3<T extends List<dynamic>, S extends Never?> {}
+
+typedef B3<T extends List<Object?>, S extends Null> = A3<T, S>;
+
+class A4<T extends num> {}
+
+typedef B4<T extends int> = A4<T>;
+
+class A5<T extends List<dynamic>, S extends Never?> {}
+
+typedef B5<T extends List<Object?>, S extends Null> = A5;
+
+class StaticIdentityTest {
+  const StaticIdentityTest(a, b) : assert(identical(a, b));
+}
+
+test1() => const StaticIdentityTest(A1.new, B1.new); // Ok.
+test2() => const StaticIdentityTest(A2.new, B2.new); // Ok.
+test3() => const StaticIdentityTest(A3.new, B3.new); // Ok.
+test4() => const StaticIdentityTest(A4.new, B4.new); // Error.
+test5() => const StaticIdentityTest(A5.new, B5.new); // Error.
+
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.expect
new file mode 100644
index 0000000..1fc439e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    : super core::Object::•()
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    : super core::Object::•()
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    : super core::Object::•()
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    : super core::Object::•()
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    : super core::Object::•()
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  return #C1;
+static method test2() → dynamic
+  return #C1;
+static method test3() → dynamic
+  return #C1;
+static method test4() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method test5() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::StaticIdentityTest {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_proper_rename_identity.dart:
+- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.transformed.expect
new file mode 100644
index 0000000..1fc439e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.strong.transformed.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    : super core::Object::•()
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    : super core::Object::•()
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    : super core::Object::•()
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    : super core::Object::•()
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    : super core::Object::•()
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  return #C1;
+static method test2() → dynamic
+  return #C1;
+static method test3() → dynamic
+  return #C1;
+static method test4() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method test5() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::StaticIdentityTest {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_proper_rename_identity.dart:
+- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.textual_outline.expect
new file mode 100644
index 0000000..77787a1
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.textual_outline.expect
@@ -0,0 +1,19 @@
+class A1<T> {}
+typedef B1<T> = A1<T>;
+class A2<T extends num> {}
+typedef B2<T extends num> = A2<T>;
+class A3<T extends List<dynamic>, S extends Never?> {}
+typedef B3<T extends List<Object?>, S extends Null> = A3<T, S>;
+class A4<T extends num> {}
+typedef B4<T extends int> = A4<T>;
+class A5<T extends List<dynamic>, S extends Never?> {}
+typedef B5<T extends List<Object?>, S extends Null> = A5;
+class StaticIdentityTest {
+  const StaticIdentityTest(a, b) : assert(identical(a, b));
+}
+test1() => const StaticIdentityTest(A1.new, B1.new);
+test2() => const StaticIdentityTest(A2.new, B2.new);
+test3() => const StaticIdentityTest(A3.new, B3.new);
+test4() => const StaticIdentityTest(A4.new, B4.new);
+test5() => const StaticIdentityTest(A5.new, B5.new);
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.expect
new file mode 100644
index 0000000..1fc439e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    : super core::Object::•()
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    : super core::Object::•()
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    : super core::Object::•()
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    : super core::Object::•()
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    : super core::Object::•()
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  return #C1;
+static method test2() → dynamic
+  return #C1;
+static method test3() → dynamic
+  return #C1;
+static method test4() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method test5() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::StaticIdentityTest {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_proper_rename_identity.dart:
+- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.outline.expect
new file mode 100644
index 0000000..fd75da2
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.outline.expect
@@ -0,0 +1,46 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method test3() → dynamic
+  ;
+static method test4() → dynamic
+  ;
+static method test5() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.transformed.expect
new file mode 100644
index 0000000..1fc439e
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/simple_proper_rename_identity.dart.weak.transformed.expect
@@ -0,0 +1,60 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef B1<T extends core::Object? = dynamic> = self::A1<T%>;
+typedef B2<T extends core::num> = self::A2<T>;
+typedef B3<T extends core::List<core::Object?>, S extends Null> = self::A3<T, S%>;
+typedef B4<T extends core::int> = self::A4<T>;
+typedef B5<unrelated T extends core::List<core::Object?>, unrelated S extends Null> = self::A5<core::List<dynamic>, Never?>;
+class A1<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A1<self::A1::T%>
+    : super core::Object::•()
+    ;
+}
+class A2<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A2<self::A2::T>
+    : super core::Object::•()
+    ;
+}
+class A3<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A3<self::A3::T, self::A3::S%>
+    : super core::Object::•()
+    ;
+}
+class A4<T extends core::num> extends core::Object {
+  synthetic constructor •() → self::A4<self::A4::T>
+    : super core::Object::•()
+    ;
+}
+class A5<T extends core::List<dynamic>, S extends Never?> extends core::Object {
+  synthetic constructor •() → self::A5<self::A5::T, self::A5::S%>
+    : super core::Object::•()
+    ;
+}
+class StaticIdentityTest extends core::Object /*hasConstConstructor*/  {
+  const constructor •(dynamic a, dynamic b) → self::StaticIdentityTest
+    : assert(core::identical(a, b)), super core::Object::•()
+    ;
+}
+static method test1() → dynamic
+  return #C1;
+static method test2() → dynamic
+  return #C1;
+static method test3() → dynamic
+  return #C1;
+static method test4() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method test5() → dynamic
+  return invalid-expression "Constant evaluation has no support for TypedefTearOff!";
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::StaticIdentityTest {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///simple_proper_rename_identity.dart:
+- StaticIdentityTest. (from org-dartlang-testcase:///simple_proper_rename_identity.dart:26:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml b/pkg/front_end/testcases/incremental/issue_46666.yaml
new file mode 100644
index 0000000..0ac3970
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml
@@ -0,0 +1,54 @@
+# Copyright (c) 2021, 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.
+
+# Reproduces https://dartbug.com/46666.
+
+type: newworld
+worlds:
+  - entry: b.dart
+    experiments: non-nullable
+    sources:
+      a.dart: |
+        import 'dart:ffi';
+
+        class StructA extends Struct {
+          external Pointer<Void> a1;
+          external Pointer<Void> a2;
+          external Pointer<Void> a3;
+          external NestedStruct blah;
+        }
+
+        class NestedStruct extends Struct {
+          external Pointer<Void> n1;
+          external Pointer<Void> n2;
+          external Pointer<Void> n3;
+        }
+      b.dart: |
+        import 'dart:ffi';
+        import 'dart:isolate';
+        import 'dart:async';
+
+        import 'a.dart';
+
+        class StructB extends Struct {
+          external StructA b1;
+        }
+
+        void periodic() {
+          print(sizeOf<StructB>());
+        }
+
+        void main() {
+          Timer.periodic(const Duration(seconds: 1), (_) => periodic());
+        }
+    expectedLibraryCount: 2
+
+  - entry: b.dart
+    experiments: non-nullable
+    worldType: updated
+    expectInitializeFromDill: false
+    invalidate:
+      - b.dart
+    expectedLibraryCount: 2
+    expectsRebuildBodiesOnly: false
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
new file mode 100644
index 0000000..516a77e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.1.expect
@@ -0,0 +1,126 @@
+main = b::main;
+library from "org-dartlang-test:///a.dart" as a {
+
+  import "dart:ffi";
+
+  @#C7
+  class StructA extends dart.ffi::Struct {
+    synthetic constructor •() → a::StructA
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::StructA
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get a1() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get a2() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get a3() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get blah() → a::NestedStruct
+      return new a::NestedStruct::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
+        dart.core::int #offset = (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::NestedStruct>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : 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}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
+    set blah(a::NestedStruct #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+  @#C24
+  class NestedStruct extends dart.ffi::Struct {
+    synthetic constructor •() → a::NestedStruct
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::NestedStruct
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get n1() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get n2() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get n3() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+}
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "dart:ffi";
+  import "dart:isolate";
+  import "dart:async";
+  import "org-dartlang-test:///a.dart";
+
+  @#C28
+  class StructB extends dart.ffi::Struct {
+    synthetic constructor •() → b::StructB
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → b::StructB
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get b1() → a::StructA
+      return new a::StructA::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
+        dart.core::int #offset = (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::StructA>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : 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}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
+    set b1(a::StructA #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+  static method periodic() → void {
+    dart.core::print(b::StructB::#sizeOf);
+  }
+  static method main() → void {
+    dart.async::Timer::periodic(#C30, (dart.async::Timer _) → void => b::periodic());
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C3 = TypeLiteralConstant(a::NestedStruct)
+  #C4 = <dart.core::Type>[#C2, #C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 0
+  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C10 = 8
+  #C11 = 4
+  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C10, #C10]
+  #C15 = 24
+  #C16 = 12
+  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C18 = "vm:prefer-inline"
+  #C19 = dart.core::pragma {name:#C18, options:#C5}
+  #C20 = 48
+  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C22 = <dart.core::Type>[#C2, #C2, #C2]
+  #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
+  #C24 = dart.core::pragma {name:#C1, options:#C23}
+  #C25 = TypeLiteralConstant(a::StructA)
+  #C26 = <dart.core::Type>[#C25]
+  #C27 = dart.ffi::_FfiStructLayout {fieldTypes:#C26, packing:#C5}
+  #C28 = dart.core::pragma {name:#C1, options:#C27}
+  #C29 = 1000000
+  #C30 = dart.core::Duration {_duration:#C29}
+}
diff --git a/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
new file mode 100644
index 0000000..516a77e
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/issue_46666.yaml.world.2.expect
@@ -0,0 +1,126 @@
+main = b::main;
+library from "org-dartlang-test:///a.dart" as a {
+
+  import "dart:ffi";
+
+  @#C7
+  class StructA extends dart.ffi::Struct {
+    synthetic constructor •() → a::StructA
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::StructA
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get a1() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get a2() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get a3() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set a3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get blah() → a::NestedStruct
+      return new a::NestedStruct::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
+        dart.core::int #offset = (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::NestedStruct>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : 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}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
+    set blah(a::NestedStruct #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+  @#C24
+  class NestedStruct extends dart.ffi::Struct {
+    synthetic constructor •() → a::NestedStruct
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::NestedStruct
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get n1() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get n2() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    get n3() → dart.ffi::Pointer<dart.ffi::Void>
+      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
+    set n3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C17).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+}
+library from "org-dartlang-test:///b.dart" as b {
+
+  import "dart:ffi";
+  import "dart:isolate";
+  import "dart:async";
+  import "org-dartlang-test:///a.dart";
+
+  @#C28
+  class StructB extends dart.ffi::Struct {
+    synthetic constructor •() → b::StructB
+      : super dart.ffi::Struct::•()
+      ;
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → b::StructB
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
+      ;
+    get b1() → a::StructA
+      return new a::StructA::#fromTypedDataBase( block {
+        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
+        dart.core::int #offset = (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::StructA>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : 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}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
+    set b1(a::StructA #externalFieldValue) → void
+      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, (#C9).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
+    @#C19
+    static get #sizeOf() → dart.core::int*
+      return (#C21).{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
+  }
+  static method periodic() → void {
+    dart.core::print(b::StructB::#sizeOf);
+  }
+  static method main() → void {
+    dart.async::Timer::periodic(#C30, (dart.async::Timer _) → void => b::periodic());
+  }
+}
+constants  {
+  #C1 = "vm:ffi:struct-fields"
+  #C2 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
+  #C3 = TypeLiteralConstant(a::NestedStruct)
+  #C4 = <dart.core::Type>[#C2, #C2, #C2, #C3]
+  #C5 = null
+  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
+  #C7 = dart.core::pragma {name:#C1, options:#C6}
+  #C8 = 0
+  #C9 = <dart.core::int*>[#C8, #C8, #C8]
+  #C10 = 8
+  #C11 = 4
+  #C12 = <dart.core::int*>[#C10, #C11, #C11]
+  #C13 = 16
+  #C14 = <dart.core::int*>[#C13, #C10, #C10]
+  #C15 = 24
+  #C16 = 12
+  #C17 = <dart.core::int*>[#C15, #C16, #C16]
+  #C18 = "vm:prefer-inline"
+  #C19 = dart.core::pragma {name:#C18, options:#C5}
+  #C20 = 48
+  #C21 = <dart.core::int*>[#C20, #C15, #C15]
+  #C22 = <dart.core::Type>[#C2, #C2, #C2]
+  #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
+  #C24 = dart.core::pragma {name:#C1, options:#C23}
+  #C25 = TypeLiteralConstant(a::StructA)
+  #C26 = <dart.core::Type>[#C25]
+  #C27 = dart.ffi::_FfiStructLayout {fieldTypes:#C26, packing:#C5}
+  #C28 = dart.core::pragma {name:#C1, options:#C27}
+  #C29 = 1000000
+  #C30 = dart.core::Duration {_duration:#C29}
+}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 08d5069..690ab74 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -33,6 +33,7 @@
 constructor_tearoffs/nongeneric_tearoff_without_context: FormatterCrash
 constructor_tearoffs/redirecting_constructors: FormatterCrash
 constructor_tearoffs/simple_instantiated_type_literals: FormatterCrash
+constructor_tearoffs/simple_proper_rename_identity: FormatterCrash
 constructor_tearoffs/typedef_tearoffs: FormatterCrash
 constructor_tearoffs/unnamed_constructor: FormatterCrash
 dart2js/late_fields: FormatterCrash
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 340f2b9..26cdd5e 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -733,13 +733,15 @@
     for (final fieldType in fieldTypes.entries) {
       if (fieldType is TypeLiteralConstant) {
         final dartType = fieldType.type;
-        members.add(NativeTypeCfe(this, dartType));
+        members
+            .add(NativeTypeCfe(this, dartType, compoundCache: compoundCache));
       } else if (fieldType is InstanceConstant) {
         final singleElementConstant = fieldType
                 .fieldValues[ffiInlineArrayElementTypeField.getterReference]
             as TypeLiteralConstant;
-        final singleElementType =
-            NativeTypeCfe(this, singleElementConstant.type);
+        final singleElementType = NativeTypeCfe(
+            this, singleElementConstant.type,
+            compoundCache: compoundCache);
         final arrayLengthConstant =
             fieldType.fieldValues[ffiInlineArrayLengthField.getterReference]
                 as IntConstant;
diff --git a/tools/VERSION b/tools/VERSION
index f4cab42..4038a7d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 342
+PRERELEASE 343
 PRERELEASE_PATCH 0
\ No newline at end of file