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