Version 2.13.0-215.0.dev

Merge commit '69f6378ed52dd118364c8e6b25a6ecbd8353ad07' into 'dev'
diff --git a/DEPS b/DEPS
index 380ac87..4ca4eda 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "fddb1dce948cec277bf3dc23b45ee95e761b89fe",
+  "co19_rev": "812ab751c41fe8d706fd1e4aae62d2dea2887ac2",
   "co19_2_rev": "3642f24e2e6273c6fb65a8f60cd0edc95153942e",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/pkg/_fe_analyzer_shared/LICENSE b/pkg/_fe_analyzer_shared/LICENSE
index f75d7c2..a0d5f54 100644
--- a/pkg/_fe_analyzer_shared/LICENSE
+++ b/pkg/_fe_analyzer_shared/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2019, the Dart project authors. All rights reserved.
+Copyright 2019, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index e4c7261..bf501a0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -736,8 +736,13 @@
   /// expression to the left hand side of the `.`, and [propertyName] should be
   /// the identifier to the right hand side of the `.`.  [staticType] should be
   /// the static type of the value returned by the property get.
+  ///
+  /// [propertyMember] should be whatever data structure the client uses to keep
+  /// track of the field or property being accessed.  In the event of
+  /// non-promotion of a property get, this value can be retrieved from
+  /// [PropertyNotPromoted.propertyMember].
   void propertyGet(Expression wholeExpression, Expression target,
-      String propertyName, Type staticType);
+      String propertyName, Object? propertyMember, Type staticType);
 
   /// Retrieves the SSA node associated with [variable], or `null` if [variable]
   /// is not associated with an SSA node because it is write captured.  For
@@ -788,8 +793,13 @@
   /// the whole property get, and [propertyName] should be the name of the
   /// property being read.  [staticType] should be the static type of the value
   /// returned by the property get.
-  void thisOrSuperPropertyGet(
-      Expression expression, String propertyName, Type staticType);
+  ///
+  /// [propertyMember] should be whatever data structure the client uses to keep
+  /// track of the field or property being accessed.  In the event of
+  /// non-promotion of a property get, this value can be retrieved from
+  /// [PropertyNotPromoted.propertyMember].
+  void thisOrSuperPropertyGet(Expression expression, String propertyName,
+      Object? propertyMember, Type staticType);
 
   /// Call this method just before visiting the body of a "try/catch" statement.
   ///
@@ -1339,11 +1349,12 @@
 
   @override
   void propertyGet(Expression wholeExpression, Expression target,
-      String propertyName, Type staticType) {
+      String propertyName, Object? propertyMember, Type staticType) {
     _wrap(
-        'propertyGet($wholeExpression, $target, $propertyName, $staticType)',
+        'propertyGet($wholeExpression, $target, $propertyName, '
+        '$propertyMember, $staticType)',
         () => _wrapped.propertyGet(
-            wholeExpression, target, propertyName, staticType));
+            wholeExpression, target, propertyName, propertyMember, staticType));
   }
 
   @override
@@ -1378,12 +1389,13 @@
   }
 
   @override
-  void thisOrSuperPropertyGet(
-      Expression expression, String propertyName, Type staticType) {
+  void thisOrSuperPropertyGet(Expression expression, String propertyName,
+      Object? propertyMember, Type staticType) {
     _wrap(
-        'thisOrSuperPropertyGet($expression, $propertyName, $staticType)',
+        'thisOrSuperPropertyGet($expression, $propertyName, $propertyMember, '
+        '$staticType)',
         () => _wrapped.thisOrSuperPropertyGet(
-            expression, propertyName, staticType));
+            expression, propertyName, propertyMember, staticType));
   }
 
   @override
@@ -2334,12 +2346,17 @@
   /// The name of the property.
   final String propertyName;
 
+  /// The field or property being accessed.  This matches a `propertyMember`
+  /// value that was passed to either [FlowAnalysis.propertyGet] or
+  /// [FlowAnalysis.thisOrSuperPropertyGet].
+  final Object? propertyMember;
+
   /// The static type of the property at the time of the access.  This is the
   /// type that was passed to [FlowAnalysis.whyNotPromoted]; it is provided to
   /// the client as a convenience for ID testing.
   final Type staticType;
 
-  PropertyNotPromoted(this.propertyName, this.staticType);
+  PropertyNotPromoted(this.propertyName, this.propertyMember, this.staticType);
 
   @override
   String get documentationLink => 'http://dart.dev/go/non-promo-property';
@@ -2517,8 +2534,10 @@
 
   /// Creates a reference representing a get of a property called [propertyName]
   /// on the reference represented by `this`.
-  Reference<Variable, Type> propertyGet(String propertyName) =>
-      new _PropertyGetReference<Variable, Type>(this, propertyName);
+  Reference<Variable, Type> propertyGet(
+          String propertyName, Object? propertyMember) =>
+      new _PropertyGetReference<Variable, Type>(
+          this, propertyName, propertyMember);
 
   /// Stores info for this reference in [variableInfo].
   void storeInfo(Map<Variable?, VariableModel<Variable, Type>> variableInfo,
@@ -3952,14 +3971,14 @@
 
   @override
   void propertyGet(Expression wholeExpression, Expression target,
-      String propertyName, Type staticType) {
+      String propertyName, Object? propertyMember, Type staticType) {
     Reference<Variable, Type>? reference =
         _getExpressionReference(target)?.reference;
     if (reference != null) {
       _storeExpressionReference(
           wholeExpression,
           new ReferenceWithType<Variable, Type>(
-              reference.propertyGet(propertyName), staticType));
+              reference.propertyGet(propertyName, propertyMember), staticType));
     }
   }
 
@@ -4016,12 +4035,13 @@
   }
 
   @override
-  void thisOrSuperPropertyGet(
-      Expression expression, String propertyName, Type staticType) {
+  void thisOrSuperPropertyGet(Expression expression, String propertyName,
+      Object? propertyMember, Type staticType) {
     _storeExpressionReference(
         expression,
         new ReferenceWithType<Variable, Type>(
-            new _ThisReference<Variable, Type>().propertyGet(propertyName),
+            new _ThisReference<Variable, Type>()
+                .propertyGet(propertyName, propertyMember),
             staticType));
   }
 
@@ -4686,7 +4706,7 @@
 
   @override
   void propertyGet(Expression wholeExpression, Expression target,
-      String propertyName, Type staticType) {}
+      String propertyName, Object? propertyMember, Type staticType) {}
 
   @override
   SsaNode<Variable, Type>? ssaNodeForTesting(Variable variable) {
@@ -4706,8 +4726,8 @@
   void thisOrSuper(Expression expression, Type staticType) {}
 
   @override
-  void thisOrSuperPropertyGet(
-      Expression expression, String propertyName, Type staticType) {}
+  void thisOrSuperPropertyGet(Expression expression, String propertyName,
+      Object? propertyMember, Type staticType) {}
 
   @override
   void tryCatchStatement_bodyBegin() {}
@@ -4908,7 +4928,12 @@
   /// The name of the property.
   final String propertyName;
 
-  _PropertyGetReference(this.target, this.propertyName);
+  /// The field or property being accessed.  This matches a `propertyMember`
+  /// value that was passed to either [FlowAnalysis.propertyGet] or
+  /// [FlowAnalysis.thisOrSuperPropertyGet].
+  final Object? propertyMember;
+
+  _PropertyGetReference(this.target, this.propertyName, this.propertyMember);
 
   @override
   Map<Type, NonPromotionReason> Function() getNonPromotionReasons(
@@ -4920,7 +4945,8 @@
       return () {
         Map<Type, NonPromotionReason> result = <Type, NonPromotionReason>{};
         for (Type type in promotedTypes) {
-          result[type] = new PropertyNotPromoted(propertyName, staticType);
+          result[type] =
+              new PropertyNotPromoted(propertyName, propertyMember, staticType);
         }
         return result;
       };
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
index 4496ca6..a5c894b 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/why_not_promoted/data/argument_type_not_assignable_nullability_error.dart
@@ -429,11 +429,10 @@
 }
 
 indexSetCompound(C29 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C29.bad, type: int?))*/ c
-          .bad] += 1;
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C29.bad, type: int?))*/ bad] += 1;
 }
 
 class C30 {
@@ -441,11 +440,10 @@
 }
 
 indexSetIfNull(C30 c, List<int?> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C30.bad, type: int?))*/ c
-          .bad] ??= 1;
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C30.bad, type: int?))*/ bad] ??= 1;
 }
 
 class C31 {
@@ -453,14 +451,13 @@
 }
 
 indexSetPreIncDec(C31 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   ++values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C31.bad, type: int?))*/ c
-          .bad];
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C31.bad, type: int?))*/ bad];
   --values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C31.bad, type: int?))*/ c
-          .bad];
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C31.bad, type: int?))*/ bad];
 }
 
 class C32 {
@@ -468,12 +465,11 @@
 }
 
 indexSetPostIncDec(C32 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ c
-          .bad]++;
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ bad]++;
   values[
       /*analyzer.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ c
-          .bad]--;
+          . /*cfe.notPromoted(propertyNotPromoted(target: member:C32.bad, type: int?))*/ bad]--;
 }
diff --git a/pkg/_fe_analyzer_shared/test/mini_ast.dart b/pkg/_fe_analyzer_shared/test/mini_ast.dart
index 5e41049..fd0db4b 100644
--- a/pkg/_fe_analyzer_shared/test/mini_ast.dart
+++ b/pkg/_fe_analyzer_shared/test/mini_ast.dart
@@ -1510,7 +1510,7 @@
       Harness h, FlowAnalysis<Node, Statement, Expression, Var, Type> flow) {
     var targetType = target._visit(h, flow);
     var propertyType = h.getMember(targetType, propertyName);
-    flow.propertyGet(this, target, propertyName, propertyType);
+    flow.propertyGet(this, target, propertyName, propertyName, propertyType);
     return propertyType;
   }
 
@@ -1614,7 +1614,7 @@
   @override
   Type _visit(
       Harness h, FlowAnalysis<Node, Statement, Expression, Var, Type> flow) {
-    flow.thisOrSuperPropertyGet(this, propertyName, type);
+    flow.thisOrSuperPropertyGet(this, propertyName, propertyName, type);
     return type;
   }
 }
diff --git a/pkg/_js_interop_checks/LICENSE b/pkg/_js_interop_checks/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/_js_interop_checks/LICENSE
+++ b/pkg/_js_interop_checks/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/analysis_server/LICENSE b/pkg/analysis_server/LICENSE
index 5c60afe..162572a 100644
--- a/pkg/analysis_server/LICENSE
+++ b/pkg/analysis_server/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2014, the Dart project authors. All rights reserved.
+Copyright 2014, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/analysis_server_client/LICENSE b/pkg/analysis_server_client/LICENSE
index 076334f..aa86769 100644
--- a/pkg/analysis_server_client/LICENSE
+++ b/pkg/analysis_server_client/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2017, the Dart project authors. All rights reserved.
+Copyright 2017, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
@@ -23,4 +24,4 @@
 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/analyzer/LICENSE b/pkg/analyzer/LICENSE
index ee99930..7efe25f 100644
--- a/pkg/analyzer/LICENSE
+++ b/pkg/analyzer/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2013, the Dart project authors. All rights reserved.
+Copyright 2013, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index aaaa182..3b63d6c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -121,8 +121,7 @@
       CompileTimeErrorCode.INVALID_ASSIGNMENT,
       right,
       [rightType, writeType],
-      _resolver.computeWhyNotPromotedMessages(
-          right, right, whyNotPromoted?.call()),
+      _resolver.computeWhyNotPromotedMessages(right, whyNotPromoted?.call()),
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index caff683..a6ab6e7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -807,7 +807,11 @@
         );
       }
       _resolver.flowAnalysis?.flow?.propertyGet(
-          functionExpression, target, node.methodName.name, getterReturnType);
+          functionExpression,
+          target,
+          node.methodName.name,
+          node.methodName.staticElement,
+          getterReturnType);
       functionExpression.staticType = targetType;
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 8a64758..e2d5336 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -203,8 +203,8 @@
       readElementRequested = readLookup.requested;
       if (readElementRequested is PropertyAccessorElement &&
           !readElementRequested.isStatic) {
-        _resolver.flowAnalysis?.flow?.thisOrSuperPropertyGet(
-            node, node.name, readElementRequested.returnType);
+        _resolver.flowAnalysis?.flow?.thisOrSuperPropertyGet(node, node.name,
+            readElementRequested, readElementRequested.returnType);
       }
       _resolver.checkReadOfNotAssignedLocalVariable(node, readElementRequested);
     }
@@ -373,7 +373,11 @@
       nameErrorEntity: propertyName,
     );
 
-    _resolver.flowAnalysis?.flow?.propertyGet(node, target, propertyName.name,
+    _resolver.flowAnalysis?.flow?.propertyGet(
+        node,
+        target,
+        propertyName.name,
+        result.getter,
         result.getter?.returnType ?? _typeSystem.typeProvider.dynamicType);
 
     if (hasRead && result.needsGetterError) {
@@ -653,6 +657,7 @@
             node,
             target,
             propertyName.name,
+            readElement,
             readElement?.returnType ?? _typeSystem.typeProvider.dynamicType);
       }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
index cff8b7e..4ffbaaa 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
@@ -130,11 +130,11 @@
       if (flow != null) {
         if (receiver != null) {
           messages = _resolver.computeWhyNotPromotedMessages(
-              receiver, nameErrorEntity, flow.whyNotPromoted(receiver)());
+              nameErrorEntity, flow.whyNotPromoted(receiver)());
         } else {
           var thisType = _resolver.thisType;
           if (thisType != null) {
-            messages = _resolver.computeWhyNotPromotedMessages(receiver,
+            messages = _resolver.computeWhyNotPromotedMessages(
                 nameErrorEntity, flow.whyNotPromotedImplicitThis(thisType)());
           }
         }
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index 43d2462..e56e3ad 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -57,7 +57,7 @@
             errorCode: CompileTimeErrorCode
                 .UNCHECKED_USE_OF_NULLABLE_VALUE_AS_CONDITION,
             messages: _resolver.computeWhyNotPromotedMessages(
-                expression, expression, whyNotPromoted?.call()));
+                expression, whyNotPromoted?.call()));
       } else {
         _errorReporter.reportErrorForNode(errorCode, expression, arguments);
       }
diff --git a/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart b/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
index cf1f3b5..fb96d1b 100644
--- a/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
+++ b/pkg/analyzer/lib/src/error/nullable_dereference_verifier.dart
@@ -76,8 +76,8 @@
 
     List<DiagnosticMessage>? messages;
     if (errorNode is Expression) {
-      messages = _resolver.computeWhyNotPromotedMessages(errorNode, errorNode,
-          _resolver.flowAnalysis?.flow?.whyNotPromoted(errorNode)());
+      messages = _resolver.computeWhyNotPromotedMessages(
+          errorNode, _resolver.flowAnalysis?.flow?.whyNotPromoted(errorNode)());
     }
     report(errorNode, receiverType, errorCode: errorCode, messages: messages);
     return true;
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index af745c8..ce69393 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -85,8 +85,8 @@
       }
       return;
     }
-    var messages = computeWhyNotPromotedMessages(
-        expression, expression, whyNotPromoted?.call());
+    var messages =
+        computeWhyNotPromotedMessages(expression, whyNotPromoted?.call());
     // report problem
     if (isConstConstructor) {
       // TODO(paulberry): this error should be based on the actual type of the
@@ -229,7 +229,6 @@
   /// [whyNotPromoted] should be the non-promotion details returned by the flow
   /// analysis engine.
   List<DiagnosticMessage> computeWhyNotPromotedMessages(
-      Expression? expression,
       SyntacticEntity errorEntity,
       Map<DartType, NonPromotionReason>? whyNotPromoted);
 
@@ -313,8 +312,7 @@
         errorCode,
         getErrorNode(expression),
         [actualStaticType, expectedStaticType],
-        computeWhyNotPromotedMessages(
-            expression, expression, whyNotPromoted?.call()),
+        computeWhyNotPromotedMessages(expression, whyNotPromoted?.call()),
       );
       return false;
     }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9601c2e9..0d097e9 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -312,7 +312,6 @@
 
   @override
   List<DiagnosticMessage> computeWhyNotPromotedMessages(
-      Expression? expression,
       SyntacticEntity errorEntity,
       Map<DartType, NonPromotionReason>? whyNotPromoted) {
     return [];
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 1a1918d..b878793 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -533,17 +533,13 @@
 
   @override
   List<DiagnosticMessage> computeWhyNotPromotedMessages(
-      Expression? expression,
       SyntacticEntity errorEntity,
       Map<DartType, NonPromotionReason>? whyNotPromoted) {
-    if (expression is NamedExpression) {
-      expression = expression.expression;
-    }
     List<DiagnosticMessage> messages = [];
     if (whyNotPromoted != null) {
       for (var entry in whyNotPromoted.entries) {
         var whyNotPromotedVisitor = _WhyNotPromotedVisitor(
-            source, expression, errorEntity, flowAnalysis!.dataForTesting);
+            source, errorEntity, flowAnalysis!.dataForTesting);
         if (typeSystem.isPotentiallyNullable(entry.key)) continue;
         var message = entry.value.accept(whyNotPromotedVisitor);
         if (message != null) {
@@ -3447,10 +3443,6 @@
             PromotableElement, DartType> {
   final Source source;
 
-  /// The expression that was not promoted, or `null` if the thing that was not
-  /// promoted was an implicit `this`.
-  final Expression? _expression;
-
   final SyntacticEntity _errorEntity;
 
   final FlowAnalysisDataForTesting? _dataForTesting;
@@ -3459,8 +3451,7 @@
 
   DartType? propertyType;
 
-  _WhyNotPromotedVisitor(
-      this.source, this._expression, this._errorEntity, this._dataForTesting);
+  _WhyNotPromotedVisitor(this.source, this._errorEntity, this._dataForTesting);
 
   @override
   DiagnosticMessage? visitDemoteViaExplicitWrite(
@@ -3480,18 +3471,7 @@
   @override
   DiagnosticMessage? visitPropertyNotPromoted(
       PropertyNotPromoted<DartType> reason) {
-    var expression = _expression;
-    Element? receiverElement;
-    if (expression is SimpleIdentifier) {
-      receiverElement = expression.staticElement;
-    } else if (expression is PropertyAccess) {
-      receiverElement = expression.propertyName.staticElement;
-    } else if (expression is PrefixedIdentifier) {
-      receiverElement = expression.identifier.staticElement;
-    } else {
-      assert(false,
-          'Unrecognized property access expression: ${expression.runtimeType}');
-    }
+    var receiverElement = reason.propertyMember;
     if (receiverElement is PropertyAccessorElement) {
       propertyReference = receiverElement;
       propertyType = reason.staticType;
diff --git a/pkg/analyzer_cli/LICENSE b/pkg/analyzer_cli/LICENSE
index ee99930..7efe25f 100644
--- a/pkg/analyzer_cli/LICENSE
+++ b/pkg/analyzer_cli/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2013, the Dart project authors. All rights reserved.
+Copyright 2013, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/analyzer_plugin/LICENSE b/pkg/analyzer_plugin/LICENSE
index 389ce98..aa86769 100644
--- a/pkg/analyzer_plugin/LICENSE
+++ b/pkg/analyzer_plugin/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2017, the Dart project authors. All rights reserved.
+Copyright 2017, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/async_helper/LICENSE b/pkg/async_helper/LICENSE
index 5c60afe..162572a 100644
--- a/pkg/async_helper/LICENSE
+++ b/pkg/async_helper/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2014, the Dart project authors. All rights reserved.
+Copyright 2014, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/build_integration/LICENSE b/pkg/build_integration/LICENSE
index c4dc9ba..4d1ad40 100644
--- a/pkg/build_integration/LICENSE
+++ b/pkg/build_integration/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2018, the Dart project authors. All rights reserved.
+Copyright 2018, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/dart_internal/LICENSE b/pkg/dart_internal/LICENSE
index 389ce98..aa86769 100644
--- a/pkg/dart_internal/LICENSE
+++ b/pkg/dart_internal/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2017, the Dart project authors. All rights reserved.
+Copyright 2017, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/dartdev/LICENSE b/pkg/dartdev/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/dartdev/LICENSE
+++ b/pkg/dartdev/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/dds/LICENSE b/pkg/dds/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/dds/LICENSE
+++ b/pkg/dds/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/dev_compiler/LICENSE b/pkg/dev_compiler/LICENSE
index 9276409..633672a 100644
--- a/pkg/dev_compiler/LICENSE
+++ b/pkg/dev_compiler/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2015, the Dart project authors. All rights reserved.
+Copyright 2015, the Dart project authors.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -10,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/diagnostic/LICENSE b/pkg/diagnostic/LICENSE
index c4dc9ba..4d1ad40 100644
--- a/pkg/diagnostic/LICENSE
+++ b/pkg/diagnostic/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2018, the Dart project authors. All rights reserved.
+Copyright 2018, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/expect/LICENSE b/pkg/expect/LICENSE
index 5c60afe..162572a 100644
--- a/pkg/expect/LICENSE
+++ b/pkg/expect/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2014, the Dart project authors. All rights reserved.
+Copyright 2014, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/front_end/LICENSE b/pkg/front_end/LICENSE
index 82e9b52..ac7d7af 100644
--- a/pkg/front_end/LICENSE
+++ b/pkg/front_end/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2016, the Dart project authors. All rights reserved.
+Copyright 2016, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 89fdd5e..d17ce83 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -4,6 +4,7 @@
 
 // @dart = 2.9
 
+import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 import 'package:_fe_analyzer_shared/src/util/link.dart';
 import 'package:front_end/src/api_prototype/lowering_predicates.dart';
 import 'package:kernel/ast.dart';
@@ -1480,7 +1481,6 @@
               replacement = inferrer.helper.buildProblem(
                   messageNullableSpreadError, receiver.fileOffset, 1,
                   context: inferrer.getWhyNotPromotedContext(
-                      receiver,
                       inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
                       element,
                       (type) => !type.isPotentiallyNullable));
@@ -1550,7 +1550,6 @@
             replacement = inferrer.helper.buildProblem(
                 messageNullableSpreadError, receiver.fileOffset, 1,
                 context: inferrer.getWhyNotPromotedContext(
-                    receiver,
                     inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
                     element,
                     (type) => !type.isPotentiallyNullable));
@@ -1988,7 +1987,6 @@
               Expression problem = inferrer.helper.buildProblem(
                   messageNullableSpreadError, receiver.fileOffset, 1,
                   context: inferrer.getWhyNotPromotedContext(
-                      receiver,
                       inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
                       entry,
                       (type) => !type.isPotentiallyNullable));
@@ -2008,7 +2006,6 @@
                 receiver.fileOffset,
                 1,
                 context: inferrer.getWhyNotPromotedContext(
-                    receiver,
                     inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
                     entry,
                     (type) => !type.isPotentiallyNullable));
@@ -2119,7 +2116,6 @@
             keyError = inferrer.helper.buildProblem(
                 messageNullableSpreadError, receiver.fileOffset, 1,
                 context: inferrer.getWhyNotPromotedContext(
-                    receiver,
                     inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
                     entry,
                     (type) => !type.isPotentiallyNullable));
@@ -2884,8 +2880,9 @@
     }
 
     ExpressionInferenceResult readResult = _computePropertyGet(node.readOffset,
-        readReceiver, receiverType, node.propertyName, const UnknownType(),
-        isThisReceiver: node.receiver is ThisExpression);
+            readReceiver, receiverType, node.propertyName, const UnknownType(),
+            isThisReceiver: node.receiver is ThisExpression)
+        .expressionInferenceResult;
 
     Expression read = readResult.expression;
     DartType readType = readResult.inferredType;
@@ -2941,8 +2938,9 @@
     Expression writeReceiver = createVariableGet(receiverVariable);
 
     ExpressionInferenceResult readResult = _computePropertyGet(node.readOffset,
-        readReceiver, receiverType, node.propertyName, const UnknownType(),
-        isThisReceiver: node.receiver is ThisExpression);
+            readReceiver, receiverType, node.propertyName, const UnknownType(),
+            isThisReceiver: node.receiver is ThisExpression)
+        .expressionInferenceResult;
 
     reportNonNullableInNullAwareWarningIfNeeded(
         readResult.inferredType, "??=", node.readOffset);
@@ -3375,6 +3373,8 @@
 
     VariableDeclaration indexVariable;
     Expression readIndex = indexResult.expression;
+    Map<DartType, NonPromotionReason> Function() whyNotPromotedIndex =
+        inferrer.flowAnalysis?.whyNotPromoted(readIndex);
     Expression writeIndex;
     if (isPureExpression(readIndex)) {
       writeIndex = clonePureExpression(readIndex);
@@ -3385,7 +3385,8 @@
     }
 
     readIndex = inferrer.ensureAssignable(
-        readIndexType, indexResult.inferredType, readIndex);
+        readIndexType, indexResult.inferredType, readIndex,
+        whyNotPromoted: whyNotPromotedIndex);
 
     ExpressionInferenceResult readResult = _computeIndexGet(
         node.readOffset,
@@ -3406,7 +3407,8 @@
         .member;
 
     writeIndex = inferrer.ensureAssignable(
-        writeIndexType, indexResult.inferredType, writeIndex);
+        writeIndexType, indexResult.inferredType, writeIndex,
+        whyNotPromoted: whyNotPromotedIndex);
 
     ExpressionInferenceResult valueResult = inferrer
         .inferExpression(node.value, valueType, true, isVoidAllowed: true);
@@ -4695,7 +4697,7 @@
   /// [typeContext] is used to create implicit generic tearoff instantiation
   /// if necessary. [isThisReceiver] must be set to `true` if the receiver is a
   /// `this` expression.
-  ExpressionInferenceResult _computePropertyGet(
+  PropertyGetInferenceResult _computePropertyGet(
       int fileOffset,
       Expression receiver,
       DartType receiverType,
@@ -4879,12 +4881,11 @@
           read.fileOffset,
           propertyName.text.length,
           context: inferrer.getWhyNotPromotedContext(
-              receiver,
               inferrer.flowAnalysis?.whyNotPromoted(receiver)(),
               read,
               (type) => !type.isPotentiallyNullable));
     }
-    return readResult;
+    return new PropertyGetInferenceResult(readResult, readTarget.member);
   }
 
   /// Creates a property set operation of [writeTarget] on [receiver] using
@@ -5059,6 +5060,8 @@
 
     VariableDeclaration indexVariable;
     Expression readIndex = indexResult.expression;
+    Map<DartType, NonPromotionReason> Function() whyNotPromotedIndex =
+        inferrer.flowAnalysis?.whyNotPromoted(readIndex);
     Expression writeIndex;
     if (isPureExpression(readIndex)) {
       writeIndex = clonePureExpression(readIndex);
@@ -5069,7 +5072,8 @@
     }
 
     readIndex = inferrer.ensureAssignable(
-        readIndexType, indexResult.inferredType, readIndex);
+        readIndexType, indexResult.inferredType, readIndex,
+        whyNotPromoted: whyNotPromotedIndex);
 
     ExpressionInferenceResult readResult = _computeIndexGet(
         node.readOffset,
@@ -5114,7 +5118,8 @@
     DartType binaryType = binaryResult.inferredType;
 
     writeIndex = inferrer.ensureAssignable(
-        writeIndexType, indexResult.inferredType, writeIndex);
+        writeIndexType, indexResult.inferredType, writeIndex,
+        whyNotPromoted: whyNotPromotedIndex);
 
     binary = inferrer.ensureAssignable(valueType, binaryType, binary,
         fileOffset: node.fileOffset);
@@ -5216,12 +5221,13 @@
     DartType nonNullReceiverType = receiverType.toNonNull();
 
     ExpressionInferenceResult readResult = _computePropertyGet(
-        node.readOffset,
-        readReceiver,
-        nonNullReceiverType,
-        node.propertyName,
-        const UnknownType(),
-        isThisReceiver: node.receiver is ThisExpression);
+            node.readOffset,
+            readReceiver,
+            nonNullReceiverType,
+            node.propertyName,
+            const UnknownType(),
+            isThisReceiver: node.receiver is ThisExpression)
+        .expressionInferenceResult;
     Expression read = readResult.expression;
     DartType readType = readResult.inferredType;
 
@@ -5752,8 +5758,9 @@
     DartType nonNullReceiverType = receiverType.toNonNull();
 
     ExpressionInferenceResult readResult = _computePropertyGet(node.readOffset,
-        readReceiver, nonNullReceiverType, node.name, typeContext,
-        isThisReceiver: node.receiver is ThisExpression);
+            readReceiver, nonNullReceiverType, node.name, typeContext,
+            isThisReceiver: node.receiver is ThisExpression)
+        .expressionInferenceResult;
     Expression read = readResult.expression;
     DartType readType = readResult.inferredType;
     inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
@@ -5845,11 +5852,13 @@
     DartType receiverType = result.nullAwareActionType;
 
     node.receiver = receiver..parent = node;
-    ExpressionInferenceResult readResult = _computePropertyGet(
+    PropertyGetInferenceResult propertyGetInferenceResult = _computePropertyGet(
         node.fileOffset, receiver, receiverType, node.name, typeContext,
         isThisReceiver: node.receiver is ThisExpression);
-    inferrer.flowAnalysis.propertyGet(
-        node, node.receiver, node.name.text, readResult.inferredType);
+    ExpressionInferenceResult readResult =
+        propertyGetInferenceResult.expressionInferenceResult;
+    inferrer.flowAnalysis.propertyGet(node, node.receiver, node.name.text,
+        propertyGetInferenceResult.member, readResult.inferredType);
     ExpressionInferenceResult expressionInferenceResult =
         inferrer.createNullAwareExpressionInferenceResult(
             readResult.inferredType, readResult.expression, nullAwareGuards);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index 161109e..f8373f8 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -427,7 +427,7 @@
       returnType = _declaredReturnType;
     }
     if (inferrer.library.isNonNullableByDefault &&
-        (containsInvalidType(returnType) ||
+        (!containsInvalidType(returnType) &&
             returnType.isPotentiallyNonNullable) &&
         inferrer.flowAnalysis.isReachable) {
       Statement resultStatement =
@@ -830,7 +830,7 @@
     }
     returnType = inferrer.typeSchemaEnvironment.flatten(returnType);
     if (inferrer.library.isNonNullableByDefault &&
-        (containsInvalidType(returnType) ||
+        (!containsInvalidType(returnType) &&
             returnType.isPotentiallyNonNullable) &&
         inferrer.flowAnalysis.isReachable) {
       Statement resultStatement =
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 15606b8..7acf10f 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -290,14 +290,13 @@
   /// promoted, to be used when reporting an error for a larger expression
   /// containing [receiver].  [node] is the containing tree node.
   List<LocatedMessage> getWhyNotPromotedContext(
-      Expression receiver,
       Map<DartType, NonPromotionReason> whyNotPromoted,
       TreeNode node,
       bool Function(DartType) typeFilter) {
     List<LocatedMessage> context;
     if (whyNotPromoted != null && whyNotPromoted.isNotEmpty) {
       _WhyNotPromotedVisitor whyNotPromotedVisitor =
-          new _WhyNotPromotedVisitor(this, receiver);
+          new _WhyNotPromotedVisitor(this);
       for (core.MapEntry<DartType, NonPromotionReason> entry
           in whyNotPromoted.entries) {
         if (!typeFilter(entry.key)) continue;
@@ -317,7 +316,17 @@
           if (args.isNotEmpty) {
             nonPromotionReasonText += '(${args.join(', ')})';
           }
-          dataForTesting.flowAnalysisResult.nonPromotionReasons[node] =
+          TreeNode origNode = node;
+          while (origNode is VariableGet &&
+              origNode.variable.name == null &&
+              origNode.variable.initializer != null) {
+            // This is a read of a synthetic variable, presumably from a "let".
+            // Find the original expression.
+            // TODO(johnniwinther): add a general solution for getting the
+            // original node for testing.
+            origNode = (origNode as VariableGet).variable.initializer;
+          }
+          dataForTesting.flowAnalysisResult.nonPromotionReasons[origNode] =
               nonPromotionReasonText;
         }
         // Note: this will always pick the first viable reason (only).  I
@@ -479,7 +488,8 @@
       Template<Message Function(DartType, DartType, bool)>
           nullabilityNullTypeErrorTemplate,
       Template<Message Function(DartType, DartType, DartType, DartType, bool)>
-          nullabilityPartErrorTemplate}) {
+          nullabilityPartErrorTemplate,
+      Map<DartType, NonPromotionReason> Function() whyNotPromoted}) {
     assert(contextType != null);
 
     // [errorTemplate], [nullabilityErrorTemplate], and
@@ -608,6 +618,7 @@
                     declaredContextType ?? contextType,
                     isNonNullableByDefault));
           } else {
+            whyNotPromoted ??= flowAnalysis?.whyNotPromoted(expression);
             result = _wrapUnassignableExpression(
                 expression,
                 expressionType,
@@ -615,8 +626,7 @@
                 nullabilityErrorTemplate.withArguments(expressionType,
                     declaredContextType ?? contextType, isNonNullableByDefault),
                 context: getWhyNotPromotedContext(
-                    expression,
-                    flowAnalysis?.whyNotPromoted(expression)(),
+                    whyNotPromoted?.call(),
                     expression,
                     (type) => typeSchemaEnvironment.isSubtypeOf(type,
                         contextType, SubtypeCheckMode.withNullabilities)));
@@ -2826,7 +2836,6 @@
         //     void Function() get call => () {};
         //   }
         List<LocatedMessage> context = getWhyNotPromotedContext(
-            receiver,
             flowAnalysis?.whyNotPromoted(receiver)(),
             staticInvocation,
             (type) => !type.isPotentiallyNullable);
@@ -2858,7 +2867,6 @@
       Expression replacement = result.applyResult(staticInvocation);
       if (!isTopLevel && target.isNullable) {
         List<LocatedMessage> context = getWhyNotPromotedContext(
-            receiver,
             flowAnalysis?.whyNotPromoted(receiver)(),
             staticInvocation,
             (type) => !type.isPotentiallyNullable);
@@ -2972,7 +2980,6 @@
     Expression replacement = result.applyResult(expression);
     if (!isTopLevel && target.isNullableCallFunction) {
       List<LocatedMessage> context = getWhyNotPromotedContext(
-          receiver,
           flowAnalysis?.whyNotPromoted(receiver)(),
           expression,
           (type) => !type.isPotentiallyNullable);
@@ -3147,7 +3154,6 @@
     replacement = result.applyResult(replacement);
     if (!isTopLevel && target.isNullable) {
       List<LocatedMessage> context = getWhyNotPromotedContext(
-          receiver,
           flowAnalysis?.whyNotPromoted(receiver)(),
           expression,
           (type) => !type.isPotentiallyNullable);
@@ -3308,7 +3314,6 @@
       //     void Function() get foo => () {};
       //   }
       List<LocatedMessage> context = getWhyNotPromotedContext(
-          receiver,
           flowAnalysis?.whyNotPromoted(receiver)(),
           invocationResult.expression,
           (type) => !type.isPotentiallyNullable);
@@ -3465,8 +3470,8 @@
           new PropertyGet(originalReceiver, originalName, originalTarget)
             ..fileOffset = fileOffset;
     }
-    flowAnalysis.propertyGet(
-        originalPropertyGet, originalReceiver, originalName.text, calleeType);
+    flowAnalysis.propertyGet(originalPropertyGet, originalReceiver,
+        originalName.text, originalTarget, calleeType);
     Expression propertyGet = originalPropertyGet;
     if (receiver is! ThisExpression &&
         calleeType is! DynamicType &&
@@ -3518,11 +3523,8 @@
       //   }
       // TODO(paulberry): would it be better to report NullableMethodCallError
       // in this scenario?
-      List<LocatedMessage> context = getWhyNotPromotedContext(
-          receiver,
-          whyNotPromoted(),
-          invocationResult.expression,
-          (type) => !type.isPotentiallyNullable);
+      List<LocatedMessage> context = getWhyNotPromotedContext(whyNotPromoted(),
+          invocationResult.expression, (type) => !type.isPotentiallyNullable);
       invocationResult = wrapExpressionInferenceResultInProblem(
           invocationResult,
           templateNullableExpressionCallError.withArguments(
@@ -3853,7 +3855,7 @@
       return instantiateTearOff(inferredType, typeContext, expression);
     }
     flowAnalysis.thisOrSuperPropertyGet(
-        expression, expression.name.name, inferredType);
+        expression, expression.name.name, member, inferredType);
     return new ExpressionInferenceResult(inferredType, expression);
   }
 
@@ -4644,6 +4646,17 @@
   }
 }
 
+/// The result of inference of a property get expression.
+class PropertyGetInferenceResult {
+  /// The main inference result.
+  final ExpressionInferenceResult expressionInferenceResult;
+
+  /// The property that was looked up, or `null` if no property was found.
+  final Member member;
+
+  PropertyGetInferenceResult(this.expressionInferenceResult, this.member);
+}
+
 /// The result of an expression inference.
 class ExpressionInferenceResult {
   /// The inferred type of the expression.
@@ -5134,13 +5147,11 @@
             DartType> {
   final TypeInferrerImpl inferrer;
 
-  final Expression receiver;
-
   Member propertyReference;
 
   DartType propertyType;
 
-  _WhyNotPromotedVisitor(this.inferrer, this.receiver);
+  _WhyNotPromotedVisitor(this.inferrer);
 
   @override
   LocatedMessage visitDemoteViaExplicitWrite(
@@ -5158,26 +5169,16 @@
 
   @override
   LocatedMessage visitPropertyNotPromoted(PropertyNotPromoted reason) {
-    Member member;
-    Expression receiver = this.receiver;
-    if (receiver is InstanceGet) {
-      member = receiver.interfaceTarget;
-    } else if (receiver is SuperPropertyGet) {
-      member = receiver.interfaceTarget;
-    } else if (receiver is StaticInvocation) {
-      member = receiver.target;
-    } else if (receiver is PropertyGet) {
-      member = receiver.interfaceTarget;
-    } else {
-      assert(false, 'Unrecognized receiver: ${receiver.runtimeType}');
-    }
-    if (member != null) {
+    Object member = reason.propertyMember;
+    if (member is Member) {
       propertyReference = member;
       propertyType = reason.staticType;
       return templateFieldNotPromoted
           .withArguments(reason.propertyName, reason.documentationLink)
           .withLocation(member.fileUri, member.fileOffset, noLength);
     } else {
+      assert(member == null,
+          'Unrecognized property member: ${member.runtimeType}');
       return null;
     }
   }
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 17b04d6..624830e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -744,13 +744,8 @@
 SuperclassMethodArgumentMismatch/example: Fail
 SupertypeIsFunction/analyzerCode: Fail
 SupertypeIsFunction/example: Fail
-SupertypeIsIllegal/example: Fail
-SupertypeIsIllegalAliased/example: Fail
-SupertypeIsNullableAliased/example: Fail
-SupertypeIsTypeVariable/example: Fail
 SwitchCaseFallThrough/example: Fail
 SwitchExpressionNotSubtype/analyzerCode: Fail
-SwitchExpressionNotSubtype/example: Fail
 SwitchExpressionUserDefinedEquals/analyzerCode: Fail
 SwitchExpressionUserDefinedEquals/example: Fail
 SyntheticToken/example: Fail # Can't be tested, used to recover from other errors.
@@ -786,7 +781,6 @@
 UndefinedExtensionOperator/example: Fail
 UndefinedExtensionSetter/analyzerCode: Fail
 UndefinedExtensionSetter/example: Fail
-UnexpectedModifierInNonNnbd/part_wrapped_script: Fail # Test requires @dart= annotation
 UnexpectedToken/part_wrapped_script1: Fail
 UnexpectedToken/script1: Fail
 UnmatchedToken/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 05f2d16..b1ae496 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -14,6 +14,9 @@
 #    should be the path to an external test. The external test will not be run,
 #    but the existence of the file will be verified.
 #
+#    Multiple scripts can start with a `// @dart=` annotation to enforce the
+#    language version used for the example code.
+#
 # Note that it can be hard or impossible to write an example that only gives the
 # specific error. To allow for this, one can specify
 # "exampleAllowMoreCodes: true" which filters out every message with a
@@ -588,12 +591,20 @@
   tip: "Try removing the 'abstract' keyword. You can add the 'abstract' keyword before the class declaration."
   analyzerCode: ParserErrorCode.ABSTRACT_CLASS_MEMBER
   script:
-    - "abstract class C {abstract C.c();}"
-    - "abstract class C {abstract m();}"
-    - "abstract class C {abstract get m;}"
-    - "abstract class C {abstract set m(int x);}"
-    - "abstract class C {abstract var f;}"
-    - "abstract class C {abstract static var f;}"
+    - |
+      abstract class C {abstract C.c();}
+    - |
+      abstract class C {abstract m();}
+    - |
+      abstract class C {abstract get m;}
+    - |
+      abstract class C {abstract set m(int x);}
+    - |
+      // @dart=2.9
+      abstract class C {abstract var f;}
+    - |
+      // @dart=2.9
+      abstract class C {abstract static var f;}
 
 AbstractExternalField:
   index: 110
@@ -720,8 +731,11 @@
   template: "Only redirecting factory constructors can be declared to be 'const'."
   tip: "Try removing the 'const' keyword, or replacing the body with '=' followed by a valid target."
   analyzerCode: ParserErrorCode.CONST_FACTORY
-  script:
-    - "class C { const factory C() {} }"
+  script: |
+    class C {
+      const factory C() => const C.internal();
+      const C.internal();
+    }
 
 ConstFactoryRedirectionToNonConst:
   template: "Constant factory constructor can't delegate to a non-constant constructor."
@@ -762,8 +776,11 @@
   template: "Factory constructors cannot have a return type."
   tip: "Try removing the type appearing before 'factory'."
   analyzerCode: ParserErrorCode.TYPE_BEFORE_FACTORY
-  script:
-    - "class C { T factory C() { return null; } }"
+  script: |
+    class C {
+      T factory C() { return new C.constructor(); }
+      C.constructor();
+    }
 
 ConstConstructorWithBody:
   template: "A const constructor can't have a body."
@@ -828,7 +845,9 @@
   tip: "Try removing the keyword 'external', or replacing the field by an external getter and/or setter."
   analyzerCode: ParserErrorCode.EXTERNAL_FIELD
   script:
-    - "class C { external var f; }"
+    - |
+      // @dart=2.9
+      class C { external var f; }
 
 
 ExternalFieldInitializer:
@@ -885,10 +904,10 @@
   # also ASSERT_IN_REDIRECTING_CONSTRUCTOR
   analyzerCode: FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR
   script:
-    - "class C { int x; C(); C.bad() : x = 5, this(); }"
-    - "class C { int x; C(); C.bad() : this(), x = 5; }"
-    - "class C { int x; C(); C.bad() : assert(true), this(); }"
-    - "class C { int x; C(); C.bad() : this(), assert(true); }"
+    - "class C { int? x; C(); C.bad() : x = 5, this(); }"
+    - "class C { int? x; C(); C.bad() : this(), x = 5; }"
+    - "class C { int? x; C(); C.bad() : assert(true), this(); }"
+    - "class C { int? x; C(); C.bad() : this(), assert(true); }"
 
 SuperInitializerNotLast:
   template: "Can't have initializers after 'super'."
@@ -1575,10 +1594,20 @@
   analyzerCode: ParserErrorCode.TYPE_PARAMETER_ON_CONSTRUCTOR
   tip: "Try removing the type parameters."
   script:
-    - "class C { C<T>() {} }"
-    - "class C { C.foo<T>() {} }"
-    - "class C { factory C<T>() => null; }"
-    - "class C { factory C.foo<T>() => null; }"
+    - >-
+      class C { C<T>() {} }
+    - >-
+      class C { C.foo<T>() {} }
+    - >-
+      class C {
+        factory C<T>() => new C.internal();
+        C.internal();
+      }
+    - >-
+      class C {
+        factory C.foo<T>() => new C.internal();
+        C.internal();
+      }
 
 ConstructorWithTypeArguments:
   template: "A constructor invocation can't have type arguments on the constructor name."
@@ -1593,9 +1622,18 @@
   analyzerCode: ParserErrorCode.INVALID_CONSTRUCTOR_NAME
   index: 102
   script:
-    - "class A { B.foo() {} }"
-    - "class A { factory B() => null; }"
-    - "class A { factory B.foo() => null; }"
+    - >-
+      class A { B.foo() {} }
+    - >-
+      class A {
+        factory B() => new A.internal();
+        A.internal();
+      }
+    - >-
+      class A {
+        factory B.foo() => new A.internal();
+        A.internal();
+      }
 
 ConstructorWithWrongNameContext:
   template: "The name of the enclosing class is '#name'."
@@ -2379,6 +2417,7 @@
 InvalidGetterSetterTypeLegacy:
   template: "The type '#type' of the getter '#name' is not assignable to the type '#type2' of the setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       String get property;
       void set property(int i);
@@ -2387,6 +2426,7 @@
 InvalidGetterSetterTypeGetterInheritedLegacy:
   template: "The type '#type' of the inherited getter '#name' is not assignable to the type '#type2' of the setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       String get property;
     }
@@ -2397,6 +2437,7 @@
 InvalidGetterSetterTypeFieldInheritedLegacy:
   template: "The type '#type' of the inherited field '#name' is not assignable to the type '#type2' of the setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       final String property;
       A(this.property);
@@ -2408,6 +2449,7 @@
 InvalidGetterSetterTypeSetterInheritedGetterLegacy:
   template: "The type '#type' of the getter '#name' is not assignable to the type '#type2' of the inherited setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       void set property(int i);
     }
@@ -2418,6 +2460,7 @@
 InvalidGetterSetterTypeSetterInheritedFieldLegacy:
   template: "The type '#type' of the field '#name' is not assignable to the type '#type2' of the inherited setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       void set property(int i);
     }
@@ -2429,6 +2472,7 @@
 InvalidGetterSetterTypeBothInheritedFieldLegacy:
   template: "The type '#type' of the inherited field '#name' is not assignable to the type '#type2' of the inherited setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       final String property;
       A(this.property);
@@ -2441,6 +2485,7 @@
 InvalidGetterSetterTypeBothInheritedGetterLegacy:
   template: "The type '#type' of the inherited getter '#name' is not assignable to the type '#type2' of the inherited setter '#name2'."
   script: |
+    // @dart=2.9
     abstract class A {
       String get property;
     }
@@ -2535,8 +2580,8 @@
   template: "An external constructor can't have any initializers."
   analyzerCode: ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_INITIALIZER
   script:
-    - "class C { int x; external C() : x = 1; }"
-    - "class C { int x; external C.foo() : x = 1; }"
+    - "class C { int? x; external C() : x = 1; }"
+    - "class C { int? x; external C.foo() : x = 1; }"
 
 ExternalTypedef:
   index: 76
@@ -2578,7 +2623,9 @@
 TypedefNullableType:
   template: "Can't create typedef from nullable type."
   configuration: nnbd-strong
-  script: typedef F = void Function()?;
+  script: |
+    // @dart=2.12
+    typedef F = void Function()?;
 
 TypedefUnaliasedTypeCause:
   template: "This is the type denoted by the type alias."
@@ -2898,8 +2945,8 @@
     - "class C { get C => 42; }"
     - "class C { set C(x) {} }"
     - "class C { set C(x) => 42; }"
-    - "class C { int C; }"
-    - "class C { int A, B, C, D, E; }"
+    - "class C { int? C; }"
+    - "class C { int? A, B, C, D, E; }"
 
 EnumConstantSameNameAsEnclosing:
   template: "Name of enum constant '#name' can't be the same as the enum's own name."
@@ -2951,18 +2998,30 @@
 SupertypeIsIllegal:
   template: "The type '#name' can't be used as supertype."
   analyzerCode: EXTENDS_NON_CLASS
+  script: |
+    class C extends dynamic {}
 
 SupertypeIsIllegalAliased:
   template: "The type '#name' which is an alias of '#type' can't be used as supertype."
   analyzerCode: EXTENDS_NON_CLASS
+  script: |
+    typedef F = void Function();
+    class C extends F {}
 
 SupertypeIsNullableAliased:
   template: "The type '#name' which is an alias of '#type' can't be used as supertype because it is nullable."
   analyzerCode: EXTENDS_NON_CLASS
+  experiments: nonfunction-type-aliases
+  script: |
+    class A {}
+    typedef B = A?;
+    class C extends B {}
 
 SupertypeIsTypeVariable:
   template: "The type variable '#name' can't be used as supertype."
   analyzerCode: EXTENDS_NON_CLASS
+  script: |
+    class C<T> extends T {}
 
 PartOfLibraryNameMismatch:
   template: "Using '#uri' as part of '#name' but its 'part of' declaration says '#name2'."
@@ -3033,7 +3092,8 @@
   template: "Type '#type' of the switch expression isn't assignable to the type '#type2' of this case expression."
   analyzerCode: SWITCH_EXPRESSION_NOT_ASSIGNABLE
   script:
-    - >-
+    - |
+      // @dart=2.9
       void f() {
         switch (42) {
           case "foo": break;
@@ -3046,6 +3106,13 @@
 
 SwitchExpressionNotSubtype:
   template: "Type '#type' of the case expression is not a subtype of type '#type2' of this switch expression."
+  script:
+    - |
+      void f() {
+        switch (42) {
+          case "foo": break;
+        }
+      }
 
 SwitchHasCaseAfterDefault:
   index: 16
@@ -3107,14 +3174,14 @@
     - |
       class C<T> {
         static staticMethod() {
-          List<T> t = null;
+          List<T>? t = null;
           return t;
         }
       }
     - |
       class C<T> {
         static staticMethod() {
-          T t = null;
+          T? t = null;
           return t;
         }
       }
@@ -3132,13 +3199,13 @@
     - |
       class C<T> {
         instanceMethod() {
-          return const <T>[null];
+          return const <T>[];
         }
       }
     - |
       class C<T> {
         instanceMethod() {
-          return const <List<T>>[null];
+          return const <List<T>>[];
         }
       }
 
@@ -3509,8 +3576,7 @@
   analyzerCode: UNDEFINED_GETTER
   script: >
     class C {}
-    main() {
-      C c;
+    test(C c) {
       print(c.foo);
     }
 
@@ -3520,8 +3586,7 @@
   analyzerCode: UNDEFINED_SETTER
   script: >
     class C {}
-    main() {
-      C c;
+    test(C c) {
       c.foo = 0;
     }
 
@@ -3531,8 +3596,7 @@
   analyzerCode: UNDEFINED_METHOD
   script: >
     class C {}
-    main() {
-      C c;
+    test(C c) {
       c.foo();
     }
 
@@ -3542,8 +3606,7 @@
   analyzerCode: UNDEFINED_METHOD
   script: >
     class C {}
-    main() {
-      C c;
+    test(C c) {
       c + 0;
     }
 
@@ -3947,7 +4010,9 @@
   template: "Must explicitly return a value from a non-void function."
   severity: WARNING
   analyzerCode: RETURN_WITHOUT_VALUE
-  declaration: "int foo() { return; }"
+  script: |
+    // @dart=2.9
+    int foo() { return; }
 
 ReturnWithoutExpressionSync:
   template: "A value must be explicitly returned from a non-void function."
@@ -4025,6 +4090,7 @@
   template: "'#name' isn't a function or method and can't be invoked."
   analyzerCode: INVOCATION_OF_NON_FUNCTION
   script: |
+    // @dart=2.9
     class Foo {
       int f;
     }
@@ -4100,8 +4166,8 @@
       }
     - >-
       class A {
-        factory A.f({int x}) = A.g;
-        A.g({int y}) { }
+        factory A.f({int? x}) = A.g;
+        A.g({int? y}) { }
       }
     - >-
       class A {
@@ -4159,7 +4225,7 @@
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
     class A<T extends num> {}
-    A<String> foo() => null;
+    A<String> foo() => throw '';
 
 IncorrectTypeArgumentInferred:
   template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
@@ -4217,14 +4283,16 @@
   analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
   script:
     - >-
-      typedef F = List<T> Function<T>(T);
+      typedef F = Class<T> Function<T>(T);
+      class Class<T> {}
       main() {
-        List<F> list1;
+        Class<F> class1;
       }
     - >-
-      typedef F = List<T> Function<T>(T);
+      typedef F = Class<T> Function<T>(T);
+      class Class<T> {}
       main() {
-        new List<F>();
+        Class<F>();
       }
 
 GenericFunctionTypeInferredAsActualTypeArgument:
@@ -4400,7 +4468,7 @@
       }
     - |
       main() {
-        int Function() a = null;
+        int Function() a = () => 42;
         var b = [...a];
       }
 
@@ -4443,7 +4511,7 @@
       }
     - |
       main() {
-        int Function() a = null;
+        int Function() a = () => 42;
         var b = <dynamic, dynamic>{...a};
       }
 
diff --git a/pkg/front_end/test/fasta/messages_suite.dart b/pkg/front_end/test/fasta/messages_suite.dart
index 9795ed4..7530042 100644
--- a/pkg/front_end/test/fasta/messages_suite.dart
+++ b/pkg/front_end/test/fasta/messages_suite.dart
@@ -28,10 +28,14 @@
 import "package:yaml/yaml.dart" show YamlList, YamlMap, YamlNode, loadYamlNode;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions, InvocationMode;
+    show
+        CompilerOptions,
+        InvocationMode,
+        parseExperimentalArguments,
+        parseExperimentalFlags;
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
-    show ExperimentalFlag;
+    show ExperimentalFlag, defaultExperimentalFlags;
 
 import 'package:front_end/src/api_prototype/memory_file_system.dart'
     show MemoryFileSystem;
@@ -78,10 +82,7 @@
 
   CompilerOptions apply(CompilerOptions options) {
     if (nnbdMode != null) {
-      options.explicitExperimentalFlags[ExperimentalFlag.nonNullable] = true;
       options.nnbdMode = nnbdMode;
-    } else {
-      options.explicitExperimentalFlags[ExperimentalFlag.nonNullable] = false;
     }
     options.invocationModes = invocationModes;
     return options;
@@ -169,6 +170,7 @@
           "'spell_checking_list_messages.txt' or "
           "'spell_checking_list_common.txt'.";
       Configuration configuration;
+      Map<ExperimentalFlag, bool> experimentalFlags;
 
       Source source;
       List<String> formatSpellingMistakes(spell.SpellingResult spellResult,
@@ -372,6 +374,16 @@
             }
             break;
 
+          case "experiments":
+            if (value is String) {
+              experimentalFlags = parseExperimentalFlags(
+                  parseExperimentalArguments(value.split(',')),
+                  onError: (message) => throw new ArgumentError(message));
+            } else {
+              throw new ArgumentError("Unknown experiments value: $value.");
+            }
+            break;
+
           default:
             unknownKeys.add(key);
         }
@@ -386,6 +398,8 @@
       for (Example example in examples) {
         example.configuration =
             configuration ?? Configuration.defaultConfiguration;
+        example.experimentalFlags =
+            experimentalFlags ?? defaultExperimentalFlags;
       }
 
       MessageTestDescription createDescription(
@@ -527,15 +541,13 @@
 
   Configuration configuration;
 
+  Map<ExperimentalFlag, bool> experimentalFlags;
+
   Example(this.name, this.expectedCode);
 
   YamlNode get node;
 
-  Uint8List get bytes;
-
-  Map<String, Uint8List> get scripts {
-    return {mainFilename: bytes};
-  }
+  Map<String, Script> get scripts;
 
   String get mainFilename => "main.dart";
 }
@@ -544,12 +556,16 @@
   @override
   final YamlList node;
 
-  @override
   final Uint8List bytes;
 
   BytesExample(String name, String code, this.node)
       : bytes = new Uint8List.fromList(node.cast<int>()),
         super(name, code);
+
+  @override
+  Map<String, Script> get scripts {
+    return {mainFilename: new Script(bytes, '', null)};
+  }
 }
 
 class DeclarationExample extends Example {
@@ -563,13 +579,15 @@
         super(name, code);
 
   @override
-  Uint8List get bytes {
-    return new Uint8List.fromList(utf8.encode("""
+  Map<String, Script> get scripts {
+    return {
+      mainFilename: new Script.fromSource("""
 $declaration
 
 main() {
 }
-"""));
+""")
+    };
   }
 }
 
@@ -584,12 +602,14 @@
         super(name, code);
 
   @override
-  Uint8List get bytes {
-    return new Uint8List.fromList(utf8.encode("""
+  Map<String, Script> get scripts {
+    return {
+      mainFilename: new Script.fromSource("""
 main() {
   $statement
 }
-"""));
+""")
+    };
   }
 }
 
@@ -603,13 +623,14 @@
       : expression = node.value,
         super(name, code);
 
-  @override
-  Uint8List get bytes {
-    return new Uint8List.fromList(utf8.encode("""
+  Map<String, Script> get scripts {
+    return {
+      mainFilename: new Script.fromSource("""
 main() {
   $expression;
 }
-"""));
+""")
+    };
   }
 }
 
@@ -630,20 +651,17 @@
   }
 
   @override
-  Uint8List get bytes => throw "Unsupported: ScriptExample.bytes";
-
-  @override
-  Map<String, Uint8List> get scripts {
+  Map<String, Script> get scripts {
     Object script = this.script;
     if (script is Map) {
-      var scriptFiles = <String, Uint8List>{};
+      Map<String, Script> scriptFiles = <String, Script>{};
       script.forEach((fileName, value) {
-        scriptFiles[fileName] = new Uint8List.fromList(utf8.encode(value));
+        scriptFiles[fileName] = new Script.fromSource(value);
         print("$fileName => $value\n\n======\n\n");
       });
       return scriptFiles;
     } else {
-      return {mainFilename: new Uint8List.fromList(utf8.encode(script))};
+      return {mainFilename: new Script.fromSource(script)};
     }
   }
 }
@@ -656,19 +674,17 @@
   PartWrapExample(String name, String code, this.allowMoreCodes, this.example)
       : super(name, code) {
     configuration = example.configuration;
+    experimentalFlags = example.experimentalFlags;
   }
 
   @override
-  Uint8List get bytes => throw "Unsupported: PartWrapExample.bytes";
-
-  @override
   String get mainFilename => "main_wrapped.dart";
 
   @override
-  Map<String, Uint8List> get scripts {
-    Map<String, Uint8List> wrapped = example.scripts;
+  Map<String, Script> get scripts {
+    Map<String, Script> wrapped = example.scripts;
 
-    var scriptFiles = <String, Uint8List>{};
+    Map<String, Script> scriptFiles = <String, Script>{};
     scriptFiles.addAll(wrapped);
 
     // Create a new main file
@@ -677,21 +693,35 @@
       throw "Framework failure: "
           "Wanted to create wrapper file, but the file already exists!";
     }
-    scriptFiles[mainFilename] = new Uint8List.fromList(utf8.encode("""
-      part "${example.mainFilename}";
-    """));
+    Script originalMainScript = scriptFiles[example.mainFilename];
+    String preamble = originalMainScript.preamble;
+    scriptFiles[mainFilename] = new Script.fromSource("""
+${preamble}part "${example.mainFilename}";
+    """);
 
     // Modify the original main file to be part of the wrapper and add lots of
     // gunk so every actual position in the file is not a valid position in the
     // wrapper.
-    scriptFiles[example.mainFilename] = new Uint8List.fromList(utf8.encode("""
-      part of "${mainFilename}";
-      // La la la la la la la la la la la la la.
-      // La la la la la la la la la la la la la.
-      // La la la la la la la la la la la la la.
-      // La la la la la la la la la la la la la.
-      // La la la la la la la la la la la la la.
-    """) + scriptFiles[example.mainFilename]);
+    String originalMainSource = originalMainScript.sourceWithoutPreamble;
+    String partPrefix = """
+${preamble}part of "${mainFilename}";
+// La la la la la la la la la la la la la.
+// La la la la la la la la la la la la la.
+// La la la la la la la la la la la la la.
+// La la la la la la la la la la la la la.
+// La la la la la la la la la la la la la.
+
+""";
+    if (originalMainSource != null) {
+      scriptFiles[example.mainFilename] =
+          new Script.fromSource('$partPrefix$originalMainSource');
+    } else {
+      scriptFiles[example.mainFilename] = new Script(
+          new Uint8List.fromList(
+              utf8.encode(partPrefix) + originalMainScript.bytes),
+          '',
+          null);
+    }
 
     return scriptFiles;
   }
@@ -723,9 +753,9 @@
   Future<Result<Null>> run(Example example, MessageTestSuite suite) async {
     if (example == null) return pass(null);
     String dir = "${example.expectedCode}/${example.name}";
-    example.scripts.forEach((String fileName, Uint8List bytes) {
+    example.scripts.forEach((String fileName, Script script) {
       Uri uri = suite.fileSystem.currentDirectory.resolve("$dir/$fileName");
-      suite.fileSystem.entityForUri(uri).writeAsBytesSync(bytes);
+      suite.fileSystem.entityForUri(uri).writeAsBytesSync(script.bytes);
     });
     Uri main = suite.fileSystem.currentDirectory
         .resolve("$dir/${example.mainFilename}");
@@ -749,6 +779,7 @@
         example.configuration.apply(new CompilerOptions()
           ..sdkSummary = computePlatformBinariesLocation(forceBuildDir: true)
               .resolve("vm_platform_strong.dill")
+          ..explicitExperimentalFlags = example.experimentalFlags ?? {}
           ..target = new VmTarget(new TargetFlags())
           ..fileSystem = new HybridFileSystem(suite.fileSystem)
           ..packagesFileUri = dotPackagesUri
@@ -814,5 +845,29 @@
   }
 }
 
+class Script {
+  final Uint8List bytes;
+  final String preamble;
+  final String sourceWithoutPreamble;
+
+  Script(this.bytes, this.preamble, this.sourceWithoutPreamble);
+
+  factory Script.fromSource(String source) {
+    List<String> lines = source.split('\n');
+    String firstLine = lines.first;
+    String preamble;
+    String sourceWithoutPreamble;
+    if (firstLine.trim().startsWith('//') && firstLine.contains('@dart=')) {
+      preamble = '$firstLine\n';
+      sourceWithoutPreamble = lines.skip(1).join('\n');
+    } else {
+      preamble = '';
+      sourceWithoutPreamble = source;
+    }
+    return new Script(new Uint8List.fromList(utf8.encode(source)), preamble,
+        sourceWithoutPreamble);
+  }
+}
+
 main([List<String> arguments = const []]) =>
     runMe(arguments, createContext, configurationPath: "../../testing.json");
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index cce4737..10f93ef 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -809,6 +809,7 @@
 orders
 ordinal
 org
+orig
 orphancy
 orphans
 ors
@@ -884,6 +885,7 @@
 preorder
 presented
 presubmit
+presumably
 prev
 prime
 printer
diff --git a/pkg/front_end/test/unit_test_suites_impl.dart b/pkg/front_end/test/unit_test_suites_impl.dart
index c67f5b3..cdead85 100644
--- a/pkg/front_end/test/unit_test_suites_impl.dart
+++ b/pkg/front_end/test/unit_test_suites_impl.dart
@@ -207,15 +207,20 @@
   @override
   void logSuiteComplete(testing.Suite suite) {}
 
-  handleTestResult(TestDescription testDescription, Result result,
-      String fullSuiteName, bool matchedExpectations) {
+  handleTestResult(
+      testing.Suite suite,
+      TestDescription testDescription,
+      Result result,
+      String fullSuiteName,
+      bool matchedExpectations,
+      Set<Expectation> expectedOutcomes) {
     String testName = getTestName(testDescription);
-    String suite = "pkg";
-    String shortTestName = testName.substring(suite.length + 1);
+    String suiteName = "pkg";
+    String shortTestName = testName.substring(suiteName.length + 1);
     resultsPort.send(jsonEncode({
       "name": testName,
       "configuration": configurationName,
-      "suite": suite,
+      "suite": suiteName,
       "test_name": shortTestName,
       "time_ms": stopwatches[testName]!.elapsedMilliseconds,
       "expected": "Pass",
@@ -224,6 +229,10 @@
     }));
     if (!matchedExpectations) {
       StringBuffer sb = new StringBuffer();
+      if (printFailureLog) {
+        String outcome = "${result.outcome}";
+        sb.write("FAILED: $testName: $outcome");
+      }
       sb.write(result.log);
       if (result.error != null) {
         sb.write("\n\n${result.error}");
@@ -246,6 +255,26 @@
               'used when many tests need updating.\n');
         }
       }
+      if (result.outcome == Expectation.Pass) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test passed, but wasn't expected to. "
+            "You should update the status file for this test."
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be removed."
+            "\n\nThe status file is ${suite.statusFile}.");
+      } else if (result.autoFixCommand == null) {
+        String expectedString =
+            expectedOutcomes.map((e) => e.toString()).join(", ");
+        sb.write("\n\nThe test has outcome ${result.outcome}, "
+            "but was expected to have outcome(s) ${expectedOutcomes}. "
+            "You might have to update the status file to the new outcome"
+            "\nThere's a status entry looking something like"
+            "\n\n  ${testDescription.shortName}: ${expectedString}"
+            "\n\nwhich should be updated."
+            "\n\nThe status file is ${suite.statusFile}.");
+      }
       String failureLog = sb.toString();
       String outcome = "${result.outcome}";
       logsPort.send(jsonEncode({
@@ -255,7 +284,6 @@
         "log": failureLog,
       }));
       if (printFailureLog) {
-        print('FAILED: $testName: $outcome');
         print(failureLog);
       }
     }
@@ -280,7 +308,8 @@
 
   void logExpectedResult(testing.Suite suite, TestDescription description,
       Result result, Set<Expectation> expectedOutcomes) {
-    handleTestResult(description, result, prefix, true);
+    handleTestResult(
+        suite, description, result, prefix, true, expectedOutcomes);
   }
 
   @override
@@ -292,7 +321,8 @@
     String testName = getTestName(description);
     if (seenTests.contains(testName)) return;
     seenTests.add(testName);
-    handleTestResult(description, result, prefix, false);
+    handleTestResult(
+        suite, description, result, prefix, false, expectedOutcomes);
   }
 
   @override
diff --git a/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.expect b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.expect
index ffd4dfe..fb38c29 100644
--- a/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.expect
@@ -38,10 +38,6 @@
 //   Constraints get constraints {}
 //   ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/crashes/crash_01/main_lib.dart:2:19: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//   Constraints get constraints {}
-//                   ^
-//
 import self as mai;
 import "dart:core" as core;
 
@@ -49,11 +45,7 @@
   synthetic constructor •() → mai::RenderObject
     : super core::Object::•()
     ;
-  get constraints() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/crashes/crash_01/main_lib.dart:2:19: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-  Constraints get constraints {}
-                  ^" in null;
-  }
+  get constraints() → invalid-type {}
 }
 abstract class RenderObjectWithChildMixin extends mai::RenderObject /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.transformed.expect
index 2825858..e5818cb 100644
--- a/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/crashes/crash_01/main.dart.weak.transformed.expect
@@ -38,10 +38,6 @@
 //   Constraints get constraints {}
 //   ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/general/crashes/crash_01/main_lib.dart:2:19: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//   Constraints get constraints {}
-//                   ^
-//
 import self as mai;
 import "dart:core" as core;
 
@@ -49,11 +45,7 @@
   synthetic constructor •() → mai::RenderObject
     : super core::Object::•()
     ;
-  get constraints() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/crashes/crash_01/main_lib.dart:2:19: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-  Constraints get constraints {}
-                  ^" in null;
-  }
+  get constraints() → invalid-type {}
 }
 abstract class RenderObjectWithChildMixin extends mai::RenderObject /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.expect
index 922fc9e..ac2beca 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.expect
@@ -20,10 +20,6 @@
 //     co <{
 //     ^^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//     co <{
-//        ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -31,9 +27,5 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  operator <() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-    co <{
-       ^" in null;
-  }
+  operator <() → invalid-type {}
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.transformed.expect
index 922fc9e..ac2beca 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart.weak.transformed.expect
@@ -20,10 +20,6 @@
 //     co <{
 //     ^^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//     co <{
-//        ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -31,9 +27,5 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  operator <() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_39026.crash_dart:2:8: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-    co <{
-       ^" in null;
-  }
+  operator <() → invalid-type {}
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.expect
index a495d01..65bece2 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.expect
@@ -15,10 +15,6 @@
 //     co operator <{
 //     ^^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//     co operator <{
-//                 ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -26,9 +22,5 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  operator <() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-    co operator <{
-                ^" in null;
-  }
+  operator <() → invalid-type {}
 }
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.transformed.expect
index a495d01..65bece2 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart.weak.transformed.expect
@@ -15,10 +15,6 @@
 //     co operator <{
 //     ^^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-//     co operator <{
-//                 ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -26,9 +22,5 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  operator <() → invalid-type {
-    return let final Never #t1 = invalid-expression "pkg/front_end/testcases/general/error_recovery/issue_39026_prime.crash_dart:2:17: Error: A non-null value must be returned since the return type 'invalid-type' doesn't allow null.
-    co operator <{
-                ^" in null;
-  }
+  operator <() → invalid-type {}
 }
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
index 3d65f9e..92bc643 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.expect
@@ -19,7 +19,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
+  abstract member-signature get _typedDataBase() → core::Object*; -> ffi::Struct::_typedDataBase
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.outline.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.outline.expect
index 9b14f9b..6390099 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.outline.expect
@@ -14,7 +14,7 @@
   field ffi::Pointer<self::Coordinate*>* next;
   static factory allocate(ffi::Allocator* allocator, core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate*
     ;
-  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
+  abstract member-signature get _typedDataBase() → core::Object*; -> ffi::Struct::_typedDataBase
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
index 4e3bcdc..fa07ce3 100644
--- a/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/ffi_sample.dart.weak.transformed.expect
@@ -9,9 +9,8 @@
 @#C7
 class Coordinate extends ffi::Struct {
   static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi());
-  @#C12
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
   static factory allocate(ffi::Allocator* allocator, core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
     return let final self::Coordinate* #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate*>(self::Coordinate::#sizeOf)!) in block {
@@ -20,7 +19,7 @@
       #t1.{self::Coordinate::next} = next;
     } =>#t1;
   }
-  abstract member-signature get _addressOf() → core::Object*; -> ffi::Struct::_addressOf
+  abstract member-signature get _typedDataBase() → core::Object*; -> ffi::Struct::_typedDataBase
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -32,17 +31,17 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
   get x() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C14).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()));
   set x(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C14).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #v);
   get y() → core::double*
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C16).{core::List::[]}(ffi::_abi()));
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()));
   set y(core::double* #v) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C16).{core::List::[]}(ffi::_abi()), #v);
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()), #v);
   get next() → ffi::Pointer<self::Coordinate*>*
-    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C18).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_typedDataBase}, (#C16).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate*>* #v) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C18).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_typedDataBase}, (#C16).{core::List::[]}(ffi::_abi()), #v.{ffi::Pointer::address});
 }
 static method main() → dynamic {}
 
@@ -57,14 +56,12 @@
   #C8 = 24
   #C9 = 20
   #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <core::int*>[#C17, #C17, #C17]
 }
 
 
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
index 5946f0f..359b430 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.1.expect
@@ -6,14 +6,13 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -25,17 +24,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -60,12 +59,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
index 7095982..9e6554f 100644
--- a/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/ffi_01.yaml.world.2.expect
@@ -6,14 +6,13 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -25,17 +24,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -64,12 +63,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
index 1bd3802..aa03bd6d 100644
--- a/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/ffi_02.yaml.world.1.expect
@@ -6,14 +6,13 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -25,17 +24,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -61,12 +60,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
index 5946f0f..359b430 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.1.expect
@@ -6,14 +6,13 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -25,17 +24,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -60,12 +59,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
index 9d3a106..feb7dd1 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.2.expect
@@ -6,14 +6,13 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -25,17 +24,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -61,12 +60,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
index 9094ac3..3b28c5c 100644
--- a/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental/no_outline_change_35.yaml.world.3.expect
@@ -6,15 +6,14 @@
   @#C7
   class Coordinate extends dart.ffi::Struct {
     static final field dart.core::int* #sizeOf = (#C10).{dart.core::List::[]}(dart.ffi::_abi());
-    @#C12
-    constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-      : super dart.ffi::Struct::_fromPointer(#pointer)
+    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
+      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
       ;
     static factory allocate(dart.core::double* x, dart.core::double* y, dart.ffi::Pointer<lib::Coordinate*>* next) → lib::Coordinate* {
       dart.core::print("hello");
       return null;
     }
-    abstract member-signature get _addressOf() → dart.core::Object*; -> dart.ffi::Struct::_addressOf
+    abstract member-signature get _typedDataBase() → dart.core::Object*; -> dart.ffi::Struct::_typedDataBase
     abstract member-signature get _identityHashCode() → dart.core::int*; -> dart.core::Object::_identityHashCode
     abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*; -> dart.core::Object::_instanceOf
     abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*; -> dart.core::Object::_simpleInstanceOf
@@ -26,17 +25,17 @@
     abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
     abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
     get x() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()));
     set x(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C12).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get y() → dart.core::double*
-      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()));
+      return dart.ffi::_loadDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()));
     set y(dart.core::double* #v) → void
-      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_addressOf}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v);
+      return dart.ffi::_storeDouble(this.{dart.ffi::Struct::_typedDataBase}, (#C14).{dart.core::List::[]}(dart.ffi::_abi()), #v);
     get next() → dart.ffi::Pointer<lib::Coordinate*>*
-      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi())));
+      return dart.ffi::_fromAddress<lib::Coordinate*>(dart.ffi::_loadIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi())));
     set next(dart.ffi::Pointer<lib::Coordinate*>* #v) → void
-      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_addressOf}, (#C18).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
+      return dart.ffi::_storeIntPtr(this.{dart.ffi::Struct::_typedDataBase}, (#C16).{dart.core::List::[]}(dart.ffi::_abi()), #v.{dart.ffi::Pointer::address});
   }
 }
 library from "org-dartlang-test:///main.dart" as main {
@@ -62,12 +61,10 @@
   #C8 = 24
   #C9 = 20
   #C10 = <dart.core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = dart.core::pragma {name:#C11, options:#C5}
-  #C13 = 0
+  #C11 = 0
+  #C12 = <dart.core::int*>[#C11, #C11, #C11]
+  #C13 = 8
   #C14 = <dart.core::int*>[#C13, #C13, #C13]
-  #C15 = 8
+  #C15 = 16
   #C16 = <dart.core::int*>[#C15, #C15, #C15]
-  #C17 = 16
-  #C18 = <dart.core::int*>[#C17, #C17, #C17]
 }
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
index ff9d534..a7d1f8b 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.strong.transformed.expect
@@ -9,26 +9,25 @@
 @#C7
 class Coordinate extends ffi::Struct {
   static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi())/*isLegacy*/;
-  @#C12
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C13
+  @#C11
   get x() → core::double
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
-  @#C13
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()));
+  @#C11
   set x(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
-  @#C13
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+  @#C11
   get y() → core::double
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()));
-  @#C13
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()));
+  @#C11
   set y(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -50,15 +49,13 @@
   #C8 = 24
   #C9 = 20
   #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = core::pragma {name:#C11, options:#C5}
-  #C13 = ffi::Double {}
-  #C14 = 0
+  #C11 = ffi::Double {}
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
   #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = 8
+  #C16 = 16
   #C17 = <core::int*>[#C16, #C16, #C16]
-  #C18 = 16
-  #C19 = <core::int*>[#C18, #C18, #C18]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
index ff9d534..a7d1f8b 100644
--- a/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_sample.dart.weak.transformed.expect
@@ -9,26 +9,25 @@
 @#C7
 class Coordinate extends ffi::Struct {
   static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi())/*isLegacy*/;
-  @#C12
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C13
+  @#C11
   get x() → core::double
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
-  @#C13
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()));
+  @#C11
   set x(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
-  @#C13
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+  @#C11
   get y() → core::double
-    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()));
-  @#C13
+    return ffi::_loadDouble(this.{ffi::Struct::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()));
+  @#C11
   set y(core::double #externalFieldValue) → void
-    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue);
+    return ffi::_storeDouble(this.{ffi::Struct::_typedDataBase}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
   get next() → ffi::Pointer<self::Coordinate>
-    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi())));
+    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi())));
   set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
-    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
+    return ffi::_storeIntPtr(this.{ffi::Struct::_typedDataBase}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
   static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
     return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
       #t1.{self::Coordinate::x} = x;
@@ -50,15 +49,13 @@
   #C8 = 24
   #C9 = 20
   #C10 = <core::int*>[#C8, #C9, #C8]
-  #C11 = "vm:entry-point"
-  #C12 = core::pragma {name:#C11, options:#C5}
-  #C13 = ffi::Double {}
-  #C14 = 0
+  #C11 = ffi::Double {}
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = 8
   #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = 8
+  #C16 = 16
   #C17 = <core::int*>[#C16, #C16, #C16]
-  #C18 = 16
-  #C19 = <core::int*>[#C18, #C18, #C18]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
index 62cdedc..e7423e9c 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect
@@ -14,19 +14,18 @@
   synthetic constructor •() → self::StructInlineArray
     : super ffi::Struct::•()
     ;
-  @#C11
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArray
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C12
+  @#C10
   get a0() → ffi::Array<ffi::Uint8>
     return new ffi::Array::_<ffi::Uint8>( block {
-      core::Object #typedDataBase = this.{ffi::Struct::_addressOf};
-      core::int #offset = (#C14).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C15);
-  @#C12
+      core::Object #typedDataBase = this.{ffi::Struct::_typedDataBase};
+      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C13);
+  @#C10
   set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::Struct::_addressOf}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C13, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::Struct::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C9).{core::List::[]}(ffi::_abi()));
 }
 static method main() → dynamic {}
 
@@ -40,12 +39,10 @@
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = "vm:entry-point"
-  #C11 = core::pragma {name:#C10, options:#C6}
-  #C12 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C13 = 0
-  #C14 = <core::int*>[#C13, #C13, #C13]
-  #C15 = <core::int*>[]
+  #C10 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C11 = 0
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = <core::int*>[]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
index 85a31bd..73f80ad 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.transformed.expect
@@ -14,19 +14,18 @@
   synthetic constructor •() → self::StructInlineArray
     : super ffi::Struct::•()
     ;
-  @#C11
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArray
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C12
+  @#C10
   get a0() → ffi::Array<ffi::Uint8>
     return new ffi::Array::_<ffi::Uint8>( block {
-      core::Object #typedDataBase = this.{ffi::Struct::_addressOf};
-      core::int #offset = (#C14).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C15);
-  @#C12
+      core::Object #typedDataBase = this.{ffi::Struct::_typedDataBase};
+      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C3, #C13);
+  @#C10
   set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::Struct::_addressOf}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C13, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::Struct::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C11, (#C9).{core::List::[]}(ffi::_abi()));
 }
 static method main() → dynamic {}
 
@@ -40,12 +39,10 @@
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = "vm:entry-point"
-  #C11 = core::pragma {name:#C10, options:#C6}
-  #C12 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C13 = 0
-  #C14 = <core::int*>[#C13, #C13, #C13]
-  #C15 = <core::int*>[]
+  #C10 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C11 = 0
+  #C12 = <core::int*>[#C11, #C11, #C11]
+  #C13 = <core::int*>[]
 }
 
 
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index f190d80..e9e3431 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -14,29 +14,28 @@
   synthetic constructor •() → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::•()
     ;
-  @#C11
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArrayMultiDimensional
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C13
+  @#C11
   get a0() → ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>
     return new ffi::Array::_<ffi::Array<ffi::Array<ffi::Uint8>>>( block {
-      core::Object #typedDataBase = this.{ffi::Struct::_addressOf};
-      core::int #offset = (#C15).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C12, #C16);
-  @#C13
+      core::Object #typedDataBase = this.{ffi::Struct::_typedDataBase};
+      core::int #offset = (#C13).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C10, #C14);
+  @#C11
   set a0(ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C14, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C12, (#C9).{core::List::[]}(ffi::_abi()));
 }
 static method main() → dynamic {
-  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C17).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
+  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C15).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
   final self::StructInlineArrayMultiDimensional struct = new self::StructInlineArrayMultiDimensional::#fromTypedDataBase(pointer!);
   final ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> array = struct.{self::StructInlineArrayMultiDimensional::a0};
   final ffi::Array<ffi::Array<ffi::Uint8>> subArray = block {
     ffi::Array<dynamic> #array = array!;
     core::int #index = 0!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C18;
+    core::int #singleElementSize = #C16;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
   } =>new ffi::Array::_<ffi::Array<ffi::Uint8>>( block {
@@ -47,11 +46,11 @@
     ffi::Array<dynamic> #array = array!;
     core::int #index = 1!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C18;
+    core::int #singleElementSize = #C16;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
-  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C14, #elementSize);
-  (#C17).{ffi::Allocator::free}(pointer);
+  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C12, #elementSize);
+  (#C15).{ffi::Allocator::free}(pointer);
 }
 
 constants  {
@@ -64,15 +63,13 @@
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = "vm:entry-point"
-  #C11 = core::pragma {name:#C10, options:#C6}
-  #C12 = 2
-  #C13 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C12, dimension2:#C12, dimension3:#C12, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C14 = 0
-  #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = <core::int*>[#C12, #C12]
-  #C17 = all::_CallocAllocator {}
-  #C18 = 1
+  #C10 = 2
+  #C11 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C10, dimension2:#C10, dimension3:#C10, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = <core::int*>[#C10, #C10]
+  #C15 = all::_CallocAllocator {}
+  #C16 = 1
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
index abf15e4..f6b5c52 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.weak.transformed.expect
@@ -14,29 +14,28 @@
   synthetic constructor •() → self::StructInlineArrayMultiDimensional
     : super ffi::Struct::•()
     ;
-  @#C11
-  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
-    : super ffi::Struct::_fromPointer(#pointer)
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArrayMultiDimensional
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
     ;
-  @#C13
+  @#C11
   get a0() → ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>>
     return new ffi::Array::_<ffi::Array<ffi::Array<ffi::Uint8>>>( block {
-      core::Object #typedDataBase = this.{ffi::Struct::_addressOf};
-      core::int #offset = (#C15).{core::List::[]}(ffi::_abi());
-    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C12, #C16);
-  @#C13
+      core::Object #typedDataBase = this.{ffi::Struct::_typedDataBase};
+      core::int #offset = (#C13).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Array<ffi::Array<ffi::Uint8>>>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C9).{core::List::[]}(ffi::_abi())), #C10, #C14);
+  @#C11
   set a0(ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> #externalFieldValue) → void
-    return ffi::_memCopy(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C14, (#C9).{core::List::[]}(ffi::_abi()));
+    return ffi::_memCopy(this.{ffi::Struct::_typedDataBase}, (#C13).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C12, (#C9).{core::List::[]}(ffi::_abi()));
 }
 static method main() → dynamic {
-  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C17).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
+  final ffi::Pointer<self::StructInlineArrayMultiDimensional> pointer = (#C15).{ffi::Allocator::allocate}<self::StructInlineArrayMultiDimensional>(self::StructInlineArrayMultiDimensional::#sizeOf);
   final self::StructInlineArrayMultiDimensional struct = new self::StructInlineArrayMultiDimensional::#fromTypedDataBase(pointer!);
   final ffi::Array<ffi::Array<ffi::Array<ffi::Uint8>>> array = struct.{self::StructInlineArrayMultiDimensional::a0};
   final ffi::Array<ffi::Array<ffi::Uint8>> subArray = block {
     ffi::Array<dynamic> #array = array!;
     core::int #index = 0!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C18;
+    core::int #singleElementSize = #C16;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
   } =>new ffi::Array::_<ffi::Array<ffi::Uint8>>( block {
@@ -47,11 +46,11 @@
     ffi::Array<dynamic> #array = array!;
     core::int #index = 1!;
     #array.{ffi::Array::_checkIndex}(#index);
-    core::int #singleElementSize = #C18;
+    core::int #singleElementSize = #C16;
     core::int #elementSize = #singleElementSize.{core::num::*}(#array.{ffi::Array::_nestedDimensionsFlattened});
     core::int #offset = #elementSize.{core::num::*}(#index);
-  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C14, #elementSize);
-  (#C17).{ffi::Allocator::free}(pointer);
+  } =>ffi::_memCopy(#array.{ffi::Array::_typedDataBase}, #offset, subArray.{ffi::Array::_typedDataBase}, #C12, #elementSize);
+  (#C15).{ffi::Allocator::free}(pointer);
 }
 
 constants  {
@@ -64,15 +63,13 @@
   #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
   #C8 = core::pragma {name:#C1, options:#C7}
   #C9 = <core::int*>[#C3, #C3, #C3]
-  #C10 = "vm:entry-point"
-  #C11 = core::pragma {name:#C10, options:#C6}
-  #C12 = 2
-  #C13 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C12, dimension2:#C12, dimension3:#C12, dimension4:#C6, dimension5:#C6, dimensions:#C6}
-  #C14 = 0
-  #C15 = <core::int*>[#C14, #C14, #C14]
-  #C16 = <core::int*>[#C12, #C12]
-  #C17 = all::_CallocAllocator {}
-  #C18 = 1
+  #C10 = 2
+  #C11 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C10, dimension2:#C10, dimension3:#C10, dimension4:#C6, dimension5:#C6, dimensions:#C6}
+  #C12 = 0
+  #C13 = <core::int*>[#C12, #C12, #C12]
+  #C14 = <core::int*>[#C10, #C10]
+  #C15 = all::_CallocAllocator {}
+  #C16 = 1
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.expect
index 1a24046..459497a 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.expect
Binary files differ
diff --git a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.transformed.expect
index 1a24046..459497a 100644
--- a/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/utf_16_le_content.crash_dart.weak.transformed.expect
Binary files differ
diff --git a/pkg/frontend_server/LICENSE b/pkg/frontend_server/LICENSE
index f75d7c2..a0d5f54 100644
--- a/pkg/frontend_server/LICENSE
+++ b/pkg/frontend_server/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2019, the Dart project authors. All rights reserved.
+Copyright 2019, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/js/LICENSE b/pkg/js/LICENSE
index 7205952..fdd3160 100644
--- a/pkg/js/LICENSE
+++ b/pkg/js/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2012, the Dart project authors. All rights reserved.
+Copyright 2012, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/js_ast/LICENSE b/pkg/js_ast/LICENSE
index de31e1a..633672a 100644
--- a/pkg/js_ast/LICENSE
+++ b/pkg/js_ast/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2015, the Dart project authors. All rights reserved.
+Copyright 2015, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/kernel/LICENSE b/pkg/kernel/LICENSE
index 82e9b52..ac7d7af 100644
--- a/pkg/kernel/LICENSE
+++ b/pkg/kernel/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2016, the Dart project authors. All rights reserved.
+Copyright 2016, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/meta/LICENSE b/pkg/meta/LICENSE
index 82e9b52..ac7d7af 100644
--- a/pkg/meta/LICENSE
+++ b/pkg/meta/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2016, the Dart project authors. All rights reserved.
+Copyright 2016, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/native_stack_traces/LICENSE b/pkg/native_stack_traces/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/native_stack_traces/LICENSE
+++ b/pkg/native_stack_traces/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/nnbd_migration/LICENSE b/pkg/nnbd_migration/LICENSE
index f75d7c2..a0d5f54 100644
--- a/pkg/nnbd_migration/LICENSE
+++ b/pkg/nnbd_migration/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2019, the Dart project authors. All rights reserved.
+Copyright 2019, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/telemetry/LICENSE b/pkg/telemetry/LICENSE
index 389ce98..aa86769 100644
--- a/pkg/telemetry/LICENSE
+++ b/pkg/telemetry/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2017, the Dart project authors. All rights reserved.
+Copyright 2017, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/vm/LICENSE b/pkg/vm/LICENSE
index 389ce98..aa86769 100644
--- a/pkg/vm/LICENSE
+++ b/pkg/vm/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2017, the Dart project authors. All rights reserved.
+Copyright 2017, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index 1551f46..84a6dbf 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -207,6 +207,7 @@
   final Procedure typedDataBufferGetter;
   final Procedure typedDataOffsetInBytesGetter;
   final Procedure byteBufferAsUint8List;
+  final Procedure uint8ListFactory;
   final Class pragmaClass;
   final Field pragmaName;
   final Field pragmaOptions;
@@ -252,7 +253,7 @@
   final Procedure sizeOfMethod;
   final Procedure lookupFunctionMethod;
   final Procedure fromFunctionMethod;
-  final Field addressOfField;
+  final Field structTypedDataBaseField;
   final Field arrayTypedDataBaseField;
   final Field arraySizeField;
   final Field arrayNestedDimensionsField;
@@ -260,7 +261,7 @@
   final Field arrayNestedDimensionsFlattened;
   final Field arrayNestedDimensionsFirst;
   final Field arrayNestedDimensionsRest;
-  final Constructor structFromPointer;
+  final Constructor structFromTypedDataBase;
   final Constructor arrayConstructor;
   final Procedure fromAddressInternal;
   final Procedure libraryLookupMethod;
@@ -300,6 +301,7 @@
             'dart:typed_data', 'TypedData', 'get:offsetInBytes'),
         byteBufferAsUint8List =
             index.getMember('dart:typed_data', 'ByteBuffer', 'asUint8List'),
+        uint8ListFactory = index.getMember('dart:typed_data', 'Uint8List', ''),
         pragmaClass = coreTypes.pragmaClass,
         pragmaName = coreTypes.pragmaName,
         pragmaOptions = coreTypes.pragmaOptions,
@@ -346,7 +348,8 @@
         offsetByMethod = index.getMember('dart:ffi', 'Pointer', '_offsetBy'),
         elementAtMethod = index.getMember('dart:ffi', 'Pointer', 'elementAt'),
         addressGetter = index.getMember('dart:ffi', 'Pointer', 'get:address'),
-        addressOfField = index.getMember('dart:ffi', 'Struct', '_addressOf'),
+        structTypedDataBaseField =
+            index.getMember('dart:ffi', 'Struct', '_typedDataBase'),
         arrayTypedDataBaseField =
             index.getMember('dart:ffi', 'Array', '_typedDataBase'),
         arraySizeField = index.getMember('dart:ffi', 'Array', '_size'),
@@ -359,8 +362,8 @@
             index.getMember('dart:ffi', 'Array', '_nestedDimensionsFirst'),
         arrayNestedDimensionsRest =
             index.getMember('dart:ffi', 'Array', '_nestedDimensionsRest'),
-        structFromPointer =
-            index.getMember('dart:ffi', 'Struct', '_fromPointer'),
+        structFromTypedDataBase =
+            index.getMember('dart:ffi', 'Struct', '_fromTypedDataBase'),
         arrayConstructor = index.getMember('dart:ffi', 'Array', '_'),
         fromAddressInternal =
             index.getTopLevelMember('dart:ffi', '_fromAddress'),
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 522510b..ccf8b9d 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -51,17 +51,14 @@
 /// class Coord extends Struct {
 ///   Coord.#fromTypedDataBase(Pointer<Coord> coord) : super._(coord);
 ///
-///   Pointer<Double> get _xPtr => addressOf.cast();
-///   set x(double v) => _xPtr.store(v);
-///   double get x => _xPtr.load();
+///   set x(double v) => ...;
+///   double get x => ...;
 ///
-///   Pointer<Double> get _yPtr => addressOf.offsetBy(...).cast();
-///   set y(double v) => _yPtr.store(v);
-///   double get y => _yPtr.load();
+///   set y(double v) => ...;
+///   double get y => ...;
 ///
-///   ffi.Pointer<Coordinate> get _nextPtr => addressof.offsetBy(...).cast();
-///   set next(Coordinate v) => _nextPtr.store(v);
-///   Coordinate get next => _nextPtr.load();
+///   set next(Coordinate v) => ...;
+///   Coordinate get next => ...;
 ///
 ///   static final int #sizeOf = 24;
 /// }
@@ -422,16 +419,25 @@
       c.initializers.remove(i);
     }
 
-    // Add a constructor which 'load' can use.
-    // C.#fromTypedDataBase(Object address) : super.fromPointer(address);
-    final VariableDeclaration pointer = new VariableDeclaration("#pointer");
+    /// Add a constructor which 'load' can use.
+    ///
+    /// ```dart
+    /// #fromTypedDataBase(Object #typedDataBase) :
+    ///   super._fromTypedDataBase(#typedDataBase);
+    /// ```
+    final VariableDeclaration typedDataBase = new VariableDeclaration(
+        "#typedDataBase",
+        type: coreTypes.objectNonNullableRawType);
     final name = Name("#fromTypedDataBase");
     final referenceFrom = indexedClass?.lookupConstructor(name);
     final Constructor ctor = Constructor(
-        FunctionNode(EmptyStatement(), positionalParameters: [pointer]),
+        FunctionNode(EmptyStatement(),
+            positionalParameters: [typedDataBase],
+            returnType: InterfaceType(node, Nullability.nonNullable)),
         name: name,
         initializers: [
-          SuperInitializer(structFromPointer, Arguments([VariableGet(pointer)]))
+          SuperInitializer(
+              structFromTypedDataBase, Arguments([VariableGet(typedDataBase)]))
         ],
         fileUri: node.fileUri,
         reference: referenceFrom?.reference)
@@ -441,8 +447,6 @@
     // Struct objects are manufactured in the VM by being passed by value
     // in return position in FFI calls, and by value in arguments in FFI
     // callbacks.
-    // TODO(http://dartbug.com/38721): Support tree-shaking, remove this.
-    _makeEntryPoint(ctor);
     node.addConstructor(ctor);
   }
 
@@ -640,15 +644,6 @@
     struct.addField(sizeOf);
   }
 
-  void _makeEntryPoint(Annotatable node) {
-    node.addAnnotation(ConstantExpression(
-        InstanceConstant(pragmaClass.reference, [], {
-          pragmaName.getterReference: StringConstant("vm:entry-point"),
-          pragmaOptions.getterReference: NullConstant()
-        }),
-        InterfaceType(pragmaClass, Nullability.legacy, [])));
-  }
-
   NativeType _getFieldType(Class c) {
     final fieldType = getType(c);
 
@@ -842,7 +837,7 @@
   /// Sample output for `int get x =>`:
   ///
   /// ```
-  /// _loadInt8(_addressOf, offset);
+  /// _loadInt8(_typedDataBase, offset);
   /// ```
   @override
   ReturnStatement generateGetterStatement(
@@ -856,8 +851,10 @@
               ? transformer.loadUnalignedMethods
               : transformer.loadMethods)[nativeType],
           Arguments([
-            PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                ThisExpression(),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             transformer.runtimeBranchOnLayout(offsets)
           ]))
@@ -866,7 +863,7 @@
   /// Sample output for `set x(int #v) =>`:
   ///
   /// ```
-  /// _storeInt8(_addressOf, offset, #v);
+  /// _storeInt8(_typedDataBase, offset, #v);
   /// ```
   @override
   ReturnStatement generateSetterStatement(
@@ -881,8 +878,10 @@
               ? transformer.storeUnalignedMethods
               : transformer.storeMethods)[nativeType],
           Arguments([
-            PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                ThisExpression(),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             transformer.runtimeBranchOnLayout(offsets),
             VariableGet(argument)
@@ -907,7 +906,7 @@
   /// Sample output for `Pointer<Int8> get x =>`:
   ///
   /// ```
-  /// _fromAddress<Int8>(_loadIntPtr(_addressOf, offset));
+  /// _fromAddress<Int8>(_loadIntPtr(_typedDataBase, offset));
   /// ```
   @override
   ReturnStatement generateGetterStatement(
@@ -922,8 +921,10 @@
             StaticInvocation(
                 transformer.loadMethods[NativeType.kIntptr],
                 Arguments([
-                  PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                      transformer.addressOfField)
+                  PropertyGet(
+                      ThisExpression(),
+                      transformer.structTypedDataBaseField.name,
+                      transformer.structTypedDataBaseField)
                     ..fileOffset = fileOffset,
                   transformer.runtimeBranchOnLayout(offsets)
                 ]))
@@ -936,7 +937,7 @@
   /// Sample output for `set x(Pointer<Int8> #v) =>`:
   ///
   /// ```
-  /// _storeIntPtr(_addressOf, offset, (#v as Pointer<Int8>).address);
+  /// _storeIntPtr(_typedDataBase, offset, (#v as Pointer<Int8>).address);
   /// ```
   @override
   ReturnStatement generateSetterStatement(
@@ -949,8 +950,10 @@
       ReturnStatement(StaticInvocation(
           transformer.storeMethods[NativeType.kIntptr],
           Arguments([
-            PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                ThisExpression(),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             transformer.runtimeBranchOnLayout(offsets),
             PropertyGet(VariableGet(argument), transformer.addressGetter.name,
@@ -1017,7 +1020,7 @@
   ///
   /// ```
   /// MyStruct.#fromTypedDataBase(
-  ///   typedDataBaseOffset(_addressOf, offset, size, dartType)
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, dartType)
   /// );
   /// ```
   @override
@@ -1030,8 +1033,10 @@
         constructor,
         Arguments([
           transformer.typedDataBaseOffset(
-              PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                  transformer.addressOfField)
+              PropertyGet(
+                  ThisExpression(),
+                  transformer.structTypedDataBaseField.name,
+                  transformer.structTypedDataBaseField)
                 ..fileOffset = fileOffset,
               transformer.runtimeBranchOnLayout(offsets),
               transformer.runtimeBranchOnLayout(size),
@@ -1044,7 +1049,7 @@
   /// Sample output for `set x(MyStruct #v) =>`:
   ///
   /// ```
-  /// _memCopy(_addressOf, offset, #v._addressOf, 0, size);
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
   /// ```
   @override
   ReturnStatement generateSetterStatement(
@@ -1057,12 +1062,16 @@
       ReturnStatement(StaticInvocation(
           transformer.memCopy,
           Arguments([
-            PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                ThisExpression(),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             transformer.runtimeBranchOnLayout(offsets),
-            PropertyGet(VariableGet(argument), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                VariableGet(argument),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             ConstantExpression(IntConstant(0)),
             transformer.runtimeBranchOnLayout(size),
@@ -1128,7 +1137,7 @@
   ///
   /// ```
   /// Array<Int8>._(
-  ///   typedDataBaseOffset(_addressOf, offset, size, typeArgument)
+  ///   typedDataBaseOffset(_typedDataBase, offset, size, typeArgument)
   /// );
   /// ```
   @override
@@ -1140,8 +1149,10 @@
         transformer.arrayConstructor,
         Arguments([
           transformer.typedDataBaseOffset(
-              PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                  transformer.addressOfField)
+              PropertyGet(
+                  ThisExpression(),
+                  transformer.structTypedDataBaseField.name,
+                  transformer.structTypedDataBaseField)
                 ..fileOffset = fileOffset,
               transformer.runtimeBranchOnLayout(offsets),
               transformer.runtimeBranchOnLayout(size),
@@ -1158,7 +1169,7 @@
   /// Sample output for `set x(Array #v) =>`:
   ///
   /// ```
-  /// _memCopy(_addressOf, offset, #v._typedDataBase, 0, size);
+  /// _memCopy(_typedDataBase, offset, #v._typedDataBase, 0, size);
   /// ```
   @override
   ReturnStatement generateSetterStatement(
@@ -1171,8 +1182,10 @@
       ReturnStatement(StaticInvocation(
           transformer.memCopy,
           Arguments([
-            PropertyGet(ThisExpression(), transformer.addressOfField.name,
-                transformer.addressOfField)
+            PropertyGet(
+                ThisExpression(),
+                transformer.structTypedDataBaseField.name,
+                transformer.structTypedDataBaseField)
               ..fileOffset = fileOffset,
             transformer.runtimeBranchOnLayout(offsets),
             PropertyGet(
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index aad89d8..1b69f26 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -205,11 +205,7 @@
       } else if (target == sizeOfMethod) {
         final DartType nativeType = node.arguments.types[0];
 
-        // TODO(http://dartbug.com/38721): Change this to an error after
-        // package:ffi is no longer using sizeOf generically.
-        if (!isFfiLibrary) {
-          _ensureNativeTypeValid(nativeType, node);
-        }
+        _ensureNativeTypeValid(nativeType, node);
 
         if (nativeType is InterfaceType) {
           Expression inlineSizeOf = _inlineSizeOf(nativeType);
@@ -225,7 +221,19 @@
         _ensureNativeTypeValid(nativeType, node);
         _ensureNativeTypeToDartType(nativeType, dartType, node);
         _ensureNoEmptyStructs(dartType, node);
-        return _replaceLookupFunction(node);
+
+        final replacement = _replaceLookupFunction(node);
+
+        if (dartType is FunctionType) {
+          final returnType = dartType.returnType;
+          if (returnType is InterfaceType) {
+            final clazz = returnType.classNode;
+            if (clazz.superclass == structClass) {
+              return _invokeStructConstructor(replacement, clazz);
+            }
+          }
+        }
+        return replacement;
       } else if (target == asFunctionMethod) {
         final DartType dartType = node.arguments.types[1];
         final DartType nativeType = InterfaceType(
@@ -237,11 +245,23 @@
 
         final DartType nativeSignature =
             (nativeType as InterfaceType).typeArguments[0];
+
         // Inline function body to make all type arguments instatiated.
-        return StaticInvocation(
+        final replacement = StaticInvocation(
             asFunctionInternal,
             Arguments([node.arguments.positional[0]],
                 types: [dartType, nativeSignature]));
+
+        if (dartType is FunctionType) {
+          final returnType = dartType.returnType;
+          if (returnType is InterfaceType) {
+            final clazz = returnType.classNode;
+            if (clazz.superclass == structClass) {
+              return _invokeStructConstructor(replacement, clazz);
+            }
+          }
+        }
+        return replacement;
       } else if (target == fromFunctionMethod) {
         final DartType nativeType = InterfaceType(
             nativeFunctionClass, Nullability.legacy, [node.arguments.types[0]]);
@@ -254,8 +274,9 @@
         _ensureNativeTypeToDartType(nativeType, dartType, node);
         _ensureNoEmptyStructs(dartType, node);
 
+        final funcType = dartType as FunctionType;
+
         // Check `exceptionalReturn`'s type.
-        final FunctionType funcType = dartType;
         final Class expectedReturnClass =
             ((node.arguments.types[0] as FunctionType).returnType
                     as InterfaceType)
@@ -324,18 +345,20 @@
             return node;
           }
         }
-        return _replaceFromFunction(node);
+
+        final replacement = _replaceFromFunction(node);
+
+        final structClasses = funcType.positionalParameters
+            .whereType<InterfaceType>()
+            .map((t) => t.classNode)
+            .where((c) => c.superclass == structClass)
+            .toList();
+        return _invokeStructConstructors(replacement, structClasses);
       } else if (target == allocateMethod) {
         final DartType nativeType = node.arguments.types[0];
 
         _ensureNativeTypeValid(nativeType, node);
 
-        // TODO(http://dartbug.com/38721): Change this to an error.
-        if (nativeType is TypeParameterType) {
-          // Do not rewire generic invocations.
-          return node;
-        }
-
         // Inline the body to get rid of a generic invocation of sizeOf.
         // TODO(http://dartbug.com/39964): Add `allignmentOf<T>()` call.
         Expression sizeInBytes = _inlineSizeOf(nativeType);
@@ -363,6 +386,38 @@
     return node;
   }
 
+  /// Prevents the struct from being tree-shaken in TFA by invoking its
+  /// constructor in a let expression.
+  ///
+  /// TFA does not recognize this as dead code, only the VM does.
+  /// TODO(http://dartbug.com/45607): Wrap with `_nativeEffect` to make the
+  /// intent of this code clear.
+  Expression _invokeStructConstructor(
+      Expression nestedExpression, Class structClass) {
+    final constructor = structClass.constructors
+        .firstWhere((c) => c.name == Name("#fromTypedDataBase"));
+    return Let(
+        VariableDeclaration.forValue(
+            ConstructorInvocation(
+                constructor,
+                Arguments([
+                  StaticInvocation(
+                      uint8ListFactory,
+                      Arguments([
+                        ConstantExpression(IntConstant(1)),
+                      ]))
+                    ..fileOffset = nestedExpression.fileOffset,
+                ]))
+              ..fileOffset = nestedExpression.fileOffset,
+            type: InterfaceType(structClass, Nullability.nonNullable)),
+        nestedExpression)
+      ..fileOffset = nestedExpression.fileOffset;
+  }
+
+  Expression _invokeStructConstructors(
+          Expression nestedExpression, List<Class> structClasses) =>
+      structClasses.distinct().fold(nestedExpression, _invokeStructConstructor);
+
   Expression _inlineSizeOf(InterfaceType nativeType) {
     final Class nativeClass = nativeType.classNode;
     final NativeType nt = getType(nativeClass);
@@ -807,3 +862,11 @@
 /// Used internally for abnormal control flow to prevent cascading error
 /// messages.
 class _FfiStaticTypeError implements Exception {}
+
+extension<T extends Object> on List<T> {
+  /// Order-preserved distinct elements.
+  List<T> distinct() {
+    final seen = <T>{};
+    return where((element) => seen.add(element)).toList();
+  }
+}
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index 810b646..b1e876fe 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -53,7 +53,16 @@
   ensureKernelCanBeSerializedToBinary(component);
 }
 
-main() {
+String argsTestName(List<String> args) {
+  if (args.length > 0) {
+    return args.last;
+  }
+  return null;
+}
+
+main(List<String> args) {
+  final testNameFilter = argsTestName(args);
+
   group('transform-component', () {
     final testCasesDir = new Directory(
         pkgVmDir + '/testcases/transformations/type_flow/transformer');
@@ -61,7 +70,9 @@
     for (var entry
         in testCasesDir.listSync(recursive: true, followLinks: false)) {
       final path = entry.path;
-      if (path.endsWith('.dart') && !path.endsWith('.pb.dart')) {
+      if (path.endsWith('.dart') &&
+          !path.endsWith('.pb.dart') &&
+          (testNameFilter == null || path.contains(testNameFilter))) {
         final bool enableNullSafety = path.endsWith('_nnbd_strong.dart');
         final bool enableNNBD = enableNullSafety || path.endsWith('_nnbd.dart');
         final List<String> experimentalFlags = [
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart
new file mode 100644
index 0000000..fcdd2df
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart
@@ -0,0 +1,180 @@
+// 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.
+
+import 'dart:ffi';
+
+/// Retained because of being by-value return type in FFI call.
+class Struct1 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Retained because of being by-value return type in FFI call.
+class Struct2 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Retained because of being by-value argument type in FFI callback.
+class Struct3 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Class not retained, not referenced at all.
+class Struct4 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Constructor not retained, only referenced as argument type in FFI
+/// call but never instantiated in Dart code.
+class Struct5 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Constructor not retained, only referenced as argument type in FFI
+/// call but never instantiated in Dart code.
+class Struct6 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Constructor not retained, only referenced as return value type in FFI
+/// callback but never instantiated in Dart code.
+class Struct7 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Not retained because of FFI call not being reachable.
+class Struct8 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Not retained because of FFI call not being reachable.
+class Struct9 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Not tetained because of FFI callback not being reachable.
+class Struct10 extends Struct {
+  Pointer notEmpty;
+}
+
+/// Retained by CFE rewrite of load from pointer.
+class Struct11 extends Struct {
+  Struct12 nested;
+}
+
+/// Retained by rewrite of load from surrounding struct.
+class Struct12 extends Struct {
+  Pointer notEmpty;
+}
+
+void main() {
+  testLookupFunctionReturn();
+  testLookupFunctionArgument();
+  testAsFunctionReturn();
+  testAsFunctionArgument();
+  testFromFunctionArgument();
+  testFromFunctionReturn();
+  testPointerLoad();
+  testNestedLoad();
+}
+
+/// This forces retaining [Struct1], because it is constructed as return
+/// value in the FFI trampoline.
+void testLookupFunctionReturn() {
+  final dylib = DynamicLibrary.executable();
+  final function1 =
+      dylib.lookupFunction<Struct1 Function(), Struct1 Function()>('function1');
+  final struct1 = function1();
+  print(struct1);
+}
+
+/// This forces retaining [Struct2], because it is constructed as return
+/// value in the FFI trampoline.
+void testAsFunctionReturn() {
+  final pointer =
+      Pointer<NativeFunction<Struct2 Function()>>.fromAddress(0xdeadbeef);
+  final function2 = pointer.asFunction<Struct2 Function()>();
+  final struct2 = function2();
+  print(struct2);
+}
+
+int useStruct3(Struct3 struct3) {
+  return 42;
+}
+
+/// This forces retaining [Struct3], because it is constructed as an argument
+/// in the FFI callback.
+///
+/// We're not doing data-flow analysis to see if this pointer ever makes it to
+/// C. We're assuming that all pointers from [fromFunction] calls that are not
+/// dead code will be passed to C.
+void testFromFunctionArgument() {
+  final pointer = Pointer.fromFunction<Int32 Function(Struct3)>(useStruct3, 0);
+  print(pointer);
+}
+
+void testLookupFunctionArgument() {
+  final dylib = DynamicLibrary.executable();
+  final function5 =
+      dylib.lookupFunction<Void Function(Struct5), void Function(Struct5)>(
+          'function5');
+  print(function5);
+}
+
+void testAsFunctionArgument() {
+  final pointer =
+      Pointer<NativeFunction<Void Function(Struct6)>>.fromAddress(0xdeadbeef);
+  final function6 = pointer.asFunction<void Function(Struct6)>();
+  print(function6);
+}
+
+Struct7 returnStruct7() {
+  throw "I don't want to create a Struct7!";
+}
+
+void testFromFunctionReturn() {
+  final pointer = Pointer.fromFunction<Struct7 Function()>(returnStruct7);
+  print(pointer);
+}
+
+/// This does not force retaining [Struct8], because it is not reachable.
+void notInvokedLookupFunctionReturn() {
+  final dylib = DynamicLibrary.executable();
+  final function8 =
+      dylib.lookupFunction<Struct8 Function(), Struct8 Function()>('function8');
+  final struct8 = function8();
+  print(struct8);
+}
+
+/// This does not force retaining [Struct9], because it is not reachable.
+void notInvokedAsFunctionReturn() {
+  final pointer =
+      Pointer<NativeFunction<Struct9 Function()>>.fromAddress(0xdeadbeef);
+  final function9 = pointer.asFunction<Struct9 Function()>();
+  final struct9 = function9();
+  print(struct9);
+}
+
+int useStruct10(Struct10 struct10) {
+  return 42;
+}
+
+/// This does not force retaining [Struct10], because it is not reachable.
+void notInvokedFromFunctionArgument() {
+  final pointer =
+      Pointer.fromFunction<Int32 Function(Struct10)>(useStruct10, 0);
+  print(pointer);
+}
+
+void testPointerLoad() {
+  final pointer = Pointer<Struct11>.fromAddress(0xdeadbeef);
+  final struct11 = pointer.ref;
+  print(struct11);
+}
+
+void testNestedLoad() {
+  final pointer = Pointer<Struct11>.fromAddress(0xdeadbeef);
+  final struct11 = pointer.ref;
+  final struct12 = struct11.nested;
+  print(struct12);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
new file mode 100644
index 0000000..66de23b
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/ffi_struct_constructors.dart.expect
@@ -0,0 +1,112 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+import "dart:ffi" as ffi;
+import "dart:typed_data" as typ;
+import "dart:_internal" as _in;
+
+import "dart:ffi";
+
+@#C6
+class Struct1 extends ffi::Struct {
+  constructor #fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] core::Object #typedDataBase) → self::Struct1
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+}
+@#C6
+class Struct2 extends ffi::Struct {
+  constructor #fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] core::Object #typedDataBase) → self::Struct2
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+}
+@#C6
+class Struct3 extends ffi::Struct {
+  constructor #fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] core::Object #typedDataBase) → self::Struct3
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+}
+@#C6
+abstract class Struct5 extends ffi::Struct {
+}
+@#C6
+abstract class Struct6 extends ffi::Struct {
+}
+@#C6
+abstract class Struct7 extends ffi::Struct {
+}
+@#C10
+class Struct11 extends ffi::Struct {
+  constructor #fromTypedDataBase([@vm.inferred-type.metadata=dart.ffi::Pointer] core::Object #typedDataBase) → self::Struct11
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1]  get nested() → self::Struct12*
+    return new self::Struct12::#fromTypedDataBase( block {
+      core::Object #typedDataBase = [@vm.direct-call.metadata=dart.ffi::Struct._typedDataBase] this.{ffi::Struct::_typedDataBase};
+      core::int #offset = (#C12).{core::List::[]}(ffi::_abi());
+    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::_fromAddress<self::Struct12*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] [@vm.direct-call.metadata=dart.ffi::Pointer.address] [@vm.inferred-type.metadata=int?] #typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in [@vm.direct-call.metadata=dart.typed_data::_ByteBuffer.asUint8List] [@vm.inferred-type.metadata=dart.typed_data::_Uint8ArrayView (skip check)] [@vm.inferred-type.metadata=dart.typed_data::_ByteBuffer] #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=dart.core::_Smi] #typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C15).{core::List::[]}(ffi::_abi())));
+}
+@#C6
+class Struct12 extends ffi::Struct {
+  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Struct12
+    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
+    ;
+}
+[@vm.inferred-type.metadata=dart.ffi::Pointer?]static final field ffi::Pointer<ffi::NativeFunction<(self::Struct3*) →* ffi::Int32*>*>* _#ffiCallback0 = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::_pointerFromFunction<ffi::NativeFunction<(self::Struct3*) →* ffi::Int32*>*>(ffi::_nativeCallbackFunction<(self::Struct3*) →* ffi::Int32*>(#C16, 0));
+[@vm.inferred-type.metadata=dart.ffi::Pointer?]static final field ffi::Pointer<ffi::NativeFunction<() →* self::Struct7*>*>* _#ffiCallback1 = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::_pointerFromFunction<ffi::NativeFunction<() →* self::Struct7*>*>(ffi::_nativeCallbackFunction<() →* self::Struct7*>(#C17, null));
+static method main() → void {
+  self::testLookupFunctionReturn();
+  self::testLookupFunctionArgument();
+  self::testAsFunctionReturn();
+  self::testAsFunctionArgument();
+  self::testFromFunctionArgument();
+  self::testFromFunctionReturn();
+  self::testPointerLoad();
+  self::testNestedLoad();
+}
+static method testLookupFunctionReturn() → void {
+  final ffi::DynamicLibrary* dylib = [@vm.inferred-type.metadata=dart.ffi::DynamicLibrary?] ffi::DynamicLibrary::executable();
+  final () →* self::Struct1* function1 = let final self::Struct1 #t1 = new self::Struct1::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C18)) in ffi::_asFunctionInternal<() →* self::Struct1*, () →* self::Struct1*>([@vm.direct-call.metadata=dart.ffi::DynamicLibrary.lookup??] [@vm.inferred-type.metadata=dart.ffi::Pointer? (skip check)] dylib.{ffi::DynamicLibrary::lookup}<ffi::NativeFunction<() →* self::Struct1*>*>("function1"));
+  final self::Struct1* struct1 = [@vm.call-site-attributes.metadata=receiverType:#lib::Struct1* Function()*] function1.call();
+  core::print(struct1);
+}
+static method testAsFunctionReturn() → void {
+  final ffi::Pointer<ffi::NativeFunction<() →* self::Struct2*>*>* pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::Pointer::fromAddress<ffi::NativeFunction<() →* self::Struct2*>*>(3735928559);
+  final () →* self::Struct2* function2 = let final self::Struct2 #t2 = new self::Struct2::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C18)) in ffi::_asFunctionInternal<() →* self::Struct2*, () →* self::Struct2*>(pointer);
+  final self::Struct2* struct2 = [@vm.call-site-attributes.metadata=receiverType:#lib::Struct2* Function()*] function2.call();
+  core::print(struct2);
+}
+[@vm.unboxing-info.metadata=(b)->i]static method useStruct3(self::Struct3* struct3) → core::int* {
+  return 42;
+}
+static method testFromFunctionArgument() → void {
+  final ffi::Pointer<ffi::NativeFunction<(self::Struct3*) →* ffi::Int32*>*>* pointer = let final self::Struct3 #t3 = new self::Struct3::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C18)) in [@vm.inferred-type.metadata=dart.ffi::Pointer?] self::_#ffiCallback0;
+  core::print(pointer);
+}
+static method testLookupFunctionArgument() → void {
+  final ffi::DynamicLibrary* dylib = [@vm.inferred-type.metadata=dart.ffi::DynamicLibrary?] ffi::DynamicLibrary::executable();
+  final (self::Struct5*) →* void function5 = [@vm.inferred-type.metadata=dart.core::_Closure?] ffi::_asFunctionInternal<(self::Struct5*) →* void, (self::Struct5*) →* ffi::Void*>([@vm.direct-call.metadata=dart.ffi::DynamicLibrary.lookup??] [@vm.inferred-type.metadata=dart.ffi::Pointer? (skip check)] dylib.{ffi::DynamicLibrary::lookup}<ffi::NativeFunction<(self::Struct5*) →* ffi::Void*>*>("function5"));
+  core::print(function5);
+}
+static method testAsFunctionArgument() → void {
+  final ffi::Pointer<ffi::NativeFunction<(self::Struct6*) →* ffi::Void*>*>* pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::Pointer::fromAddress<ffi::NativeFunction<(self::Struct6*) →* ffi::Void*>*>(3735928559);
+  final (self::Struct6*) →* void function6 = [@vm.inferred-type.metadata=dart.core::_Closure?] ffi::_asFunctionInternal<(self::Struct6*) →* void, (self::Struct6*) →* ffi::Void*>(pointer);
+  core::print(function6);
+}
+static method returnStruct7() → self::Struct7* {
+  throw "I don't want to create a Struct7!";
+}
+static method testFromFunctionReturn() → void {
+  final ffi::Pointer<ffi::NativeFunction<() →* self::Struct7*>*>* pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer?] self::_#ffiCallback1;
+  core::print(pointer);
+}
+static method testPointerLoad() → void {
+  final ffi::Pointer<self::Struct11*>* pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::Pointer::fromAddress<self::Struct11*>(3735928559);
+  final self::Struct11* struct11 = new self::Struct11::#fromTypedDataBase(pointer!);
+  core::print(struct11);
+}
+static method testNestedLoad() → void {
+  final ffi::Pointer<self::Struct11*>* pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer?] ffi::Pointer::fromAddress<self::Struct11*>(3735928559);
+  final self::Struct11* struct11 = new self::Struct11::#fromTypedDataBase(pointer!);
+  final self::Struct12* struct12 = [@vm.direct-call.metadata=#lib::Struct11.nested] [@vm.inferred-type.metadata=#lib::Struct12] struct11.{self::Struct11::nested};
+  core::print(struct12);
+}
diff --git a/pkg/vm_service/LICENSE b/pkg/vm_service/LICENSE
index de31e1a..633672a 100644
--- a/pkg/vm_service/LICENSE
+++ b/pkg/vm_service/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2015, the Dart project authors. All rights reserved.
+Copyright 2015, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/vm_snapshot_analysis/LICENSE b/pkg/vm_snapshot_analysis/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/vm_snapshot_analysis/LICENSE
+++ b/pkg/vm_snapshot_analysis/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/pkg/wasm/LICENSE b/pkg/wasm/LICENSE
index 18daf2b..467a982 100644
--- a/pkg/wasm/LICENSE
+++ b/pkg/wasm/LICENSE
@@ -1,4 +1,5 @@
-Copyright 2020, the Dart project authors. All rights reserved.
+Copyright 2020, the Dart project authors.
+
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -9,7 +10,7 @@
       copyright notice, this list of conditions and the following
       disclaimer in the documentation and/or other materials provided
       with the distribution.
-    * Neither the name of Google Inc. nor the names of its
+    * Neither the name of Google LLC nor the names of its
       contributors may be used to endorse or promote products derived
       from this software without specific prior written permission.
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 0f193da..012a80e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -3814,7 +3814,8 @@
   const auto& struct_class =
       Class::Handle(Z, lib_ffi.LookupClass(Symbols::Struct()));
   const auto& struct_addressof = Field::ZoneHandle(
-      Z, struct_class.LookupInstanceFieldAllowPrivate(Symbols::_addressOf()));
+      Z,
+      struct_class.LookupInstanceFieldAllowPrivate(Symbols::_typedDataBase()));
   ASSERT(!struct_addressof.IsNull());
 
   Fragment body;
@@ -3834,7 +3835,7 @@
       Class::Handle(zone_, lib_ffi.LookupClass(Symbols::Struct()));
   const Field& struct_addressof = Field::ZoneHandle(
       zone_,
-      struct_class.LookupInstanceFieldAllowPrivate(Symbols::_addressOf()));
+      struct_class.LookupInstanceFieldAllowPrivate(Symbols::_typedDataBase()));
   ASSERT(!struct_addressof.IsNull());
 
   Fragment body;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index c1dd552..7e93009 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -318,7 +318,7 @@
   // Wraps a TypedDataBase from the stack and wraps it in a subclass of Struct.
   Fragment WrapTypedDataBaseInStruct(const AbstractType& struct_type);
 
-  // Loads the addressOf field from a subclass of Struct.
+  // Loads the _typedDataBase field from a subclass of Struct.
   Fragment LoadTypedDataBaseFromStruct();
 
   // Breaks up a subclass of Struct in multiple definitions and puts them on
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index c9ff576..fdff2a6 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1665,7 +1665,7 @@
         Library::Handle(Z, klass.library()).url() == Symbols::DartFfi().ptr()) {
       ASSERT(fields_.length() == 1);
       ASSERT(String::Handle(Z, fields_[0]->name())
-                 .StartsWith(Symbols::_addressOf()));
+                 .StartsWith(Symbols::_typedDataBase()));
       fields_[0]->set_guarded_cid(kDynamicCid);
       fields_[0]->set_is_nullable(true);
     }
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 6688a92..fa89ba0 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -432,7 +432,7 @@
   V(_Utf8Decoder, "_Utf8Decoder")                                              \
   V(_VariableMirror, "_VariableMirror")                                        \
   V(_WeakProperty, "_WeakProperty")                                            \
-  V(_addressOf, "_addressOf")                                                  \
+  V(_typedDataBase, "_typedDataBase")                                          \
   V(_classRangeCheck, "_classRangeCheck")                                      \
   V(_current, "_current")                                                      \
   V(_ensureScheduleImmediate, "_ensureScheduleImmediate")                      \
diff --git a/sdk/lib/_internal/vm/lib/convert_patch.dart b/sdk/lib/_internal/vm/lib/convert_patch.dart
index 22bf67c..0779d4a 100644
--- a/sdk/lib/_internal/vm/lib/convert_patch.dart
+++ b/sdk/lib/_internal/vm/lib/convert_patch.dart
@@ -231,11 +231,10 @@
  * These are all ASCII, so an [Uint8List] is used as backing store.
  *
  * This buffer is used when a JSON number is split between separate chunks.
- *
  */
 class _NumberBuffer {
   static const int minCapacity = 16;
-  static const int kDefaultOverhead = 5;
+  static const int defaultOverhead = 5;
   Uint8List list;
   int length = 0;
   _NumberBuffer(int initialCapacity)
@@ -246,12 +245,14 @@
   // Pick an initial capacity greater than the first part's size.
   // The typical use case has two parts, this is the attempt at
   // guessing the size of the second part without overdoing it.
-  // The default estimate of the second part is [kDefaultOverhead],
+  // The default estimate of the second part is [defaultOverhead],
   // then round to multiplum of four, and return the result,
   // or [minCapacity] if that is greater.
   static int _initialCapacity(int minCapacity) {
-    minCapacity += kDefaultOverhead;
-    if (minCapacity < minCapacity) return minCapacity;
+    minCapacity += defaultOverhead;
+    if (minCapacity < _NumberBuffer.minCapacity) {
+      return _NumberBuffer.minCapacity;
+    }
     minCapacity = (minCapacity + 3) & ~3; // Round to multiple of four.
     return minCapacity;
   }
@@ -1214,7 +1215,7 @@
   // Continues an already chunked number across an entire chunk.
   int continueChunkNumber(int state, int start, _NumberBuffer buffer) {
     int end = chunkEnd;
-    addNumberChunk(buffer, start, end, _NumberBuffer.kDefaultOverhead);
+    addNumberChunk(buffer, start, end, _NumberBuffer.defaultOverhead);
     this.buffer = buffer;
     this.partialState = PARTIAL_NUMERAL | state;
     return end;
diff --git a/sdk/lib/ffi/struct.dart b/sdk/lib/ffi/struct.dart
index ebe326a..e4fce17 100644
--- a/sdk/lib/ffi/struct.dart
+++ b/sdk/lib/ffi/struct.dart
@@ -44,19 +44,20 @@
 /// Dart object is being created.
 ///
 /// Instances of a subclass of [Struct] have reference semantics and are backed
-/// by native memory. The may allocated via allocation or loaded from a
-/// [Pointer], but cannot be created by a generative constructor.
+/// by native memory or typed data. They may allocated via allocation or loaded
+/// from a [Pointer] or created by ffi calls or callbacks. They cannot be
+/// created by a generative constructor.
 abstract class Struct extends NativeType {
   @pragma("vm:entry-point")
-  final Object _addressOf;
+  final Object _typedDataBase;
 
   /// Construct a reference to the [nullptr].
   ///
   /// Use [StructPointer]'s `.ref` to gain references to native memory backed
   /// structs.
-  Struct() : _addressOf = nullptr;
+  Struct() : _typedDataBase = nullptr;
 
-  Struct._fromPointer(this._addressOf);
+  Struct._fromTypedDataBase(this._typedDataBase);
 }
 
 /// Annotation to specify on `Struct` subtypes to indicate that its members
diff --git a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
index c4f6955..e4a8ce7 100644
--- a/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
+++ b/tests/language/why_not_promoted/argument_type_not_assignable_nullability_error_test.dart
@@ -9,7 +9,7 @@
 class C1 {
   int? bad;
   //   ^^^
-  // [context 29] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 21] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 47] 'bad' refers to a property so it couldn't be promoted.
   f(int i) {}
 }
@@ -18,7 +18,7 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 29] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 21] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
   // [cfe 47] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -26,7 +26,7 @@
 class C2 {
   int? bad;
   //   ^^^
-  // [context 38] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 43] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 48] 'bad' refers to a property so it couldn't be promoted.
   f([int i = 0]) {}
 }
@@ -35,7 +35,7 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 38] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 43] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
   // [cfe 48] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -43,7 +43,7 @@
 class C3 {
   int? bad;
   //   ^^^
-  // [context 6] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 7] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 49] 'bad' refers to a property so it couldn't be promoted.
   f({required int i}) {}
 }
@@ -52,7 +52,7 @@
   if (c.bad == null) return;
   c.f(i: c.bad);
   //  ^^^^^^^^
-  // [analyzer 6] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 7] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
   // [cfe 49] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -60,7 +60,7 @@
 class C4 {
   int? bad;
   //   ^^^
-  // [context 16] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 17] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 50] 'bad' refers to a property so it couldn't be promoted.
   f({int i = 0}) {}
 }
@@ -69,7 +69,7 @@
   if (c.bad == null) return;
   c.f(i: c.bad);
   //  ^^^^^^^^
-  // [analyzer 16] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 17] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
   // [cfe 50] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -77,7 +77,7 @@
 class C5 {
   List<int>? bad;
   //         ^^^
-  // [context 33] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 38] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 51] 'bad' refers to a property so it couldn't be promoted.
   f<T>(List<T> x) {}
 }
@@ -86,7 +86,7 @@
   if (c.bad == null) return;
   c.f(c.bad);
   //  ^^^^^
-  // [analyzer 33] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 38] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
   // [cfe 51] The argument type 'List<int>?' can't be assigned to the parameter type 'List<int>' because 'List<int>?' is nullable and 'List<int>' isn't.
 }
@@ -94,7 +94,7 @@
 class C6 {
   int? bad;
   //   ^^^
-  // [context 21] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 5] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 52] 'bad' refers to a property so it couldn't be promoted.
   C6(int i);
 }
@@ -103,7 +103,7 @@
   if (c.bad == null) return null;
   return C6(c.bad);
   //        ^^^^^
-  // [analyzer 21] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 5] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //          ^
   // [cfe 52] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -111,7 +111,7 @@
 class C7 {
   int? bad;
   //   ^^^
-  // [context 42] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 24] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 53] 'bad' refers to a property so it couldn't be promoted.
   C7(int i);
 }
@@ -120,7 +120,7 @@
   if (c.bad == null) return null;
   return new C7(c.bad);
   //            ^^^^^
-  // [analyzer 42] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 24] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //              ^
   // [cfe 53] The argument type 'int?' can't be assigned to the parameter type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -128,7 +128,7 @@
 class C8 {
   int? bad;
   //   ^^^
-  // [context 13] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 32] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 54] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -136,7 +136,7 @@
   if (c.bad == null) return;
   1 + c.bad;
   //  ^^^^^
-  // [analyzer 13] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 32] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //    ^
   // [cfe 54] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 }
@@ -180,8 +180,8 @@
 class C11 {
   bool? bad;
   //    ^^^
-  // [context 30] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 46] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 15] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 16] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 55] 'bad' refers to a property so it couldn't be promoted.
   // [context 56] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
@@ -191,12 +191,12 @@
   if (c.bad == null) return;
   c.f(c.bad && b);
   //  ^^^^^
-  // [analyzer 46] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 16] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
   // [cfe 55] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   c.f(b && c.bad);
   //       ^^^^^
-  // [analyzer 30] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 15] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
   // [cfe 56] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -204,8 +204,8 @@
 class C12 {
   bool? bad;
   //    ^^^
-  // [context 27] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 36] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 4] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 33] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 57] 'bad' refers to a property so it couldn't be promoted.
   // [context 58] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
@@ -215,12 +215,12 @@
   if (c.bad == null) return;
   c.f(c.bad || b);
   //  ^^^^^
-  // [analyzer 27] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 4] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
   // [cfe 57] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   c.f(b || c.bad);
   //       ^^^^^
-  // [analyzer 36] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 33] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
   // [cfe 58] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -228,7 +228,7 @@
 class C13 {
   bool? bad;
   //    ^^^
-  // [context 40] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 3] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 59] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -236,7 +236,7 @@
   if (c.bad == null) return;
   assert(c.bad);
   //     ^^^^^
-  // [analyzer 40] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 3] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
   // [cfe 59] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -244,13 +244,13 @@
 class C14 {
   bool? bad;
   //    ^^^
-  // [context 1] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 13] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 60] 'bad' refers to a property so it couldn't be promoted.
   C14.assertInitializerCondition(C14 c)
       : bad = c.bad!,
         assert(c.bad);
         //     ^^^^^
-        // [analyzer 1] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+        // [analyzer 13] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
         //       ^
         // [cfe 60] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -258,7 +258,7 @@
 class C15 {
   bool? bad;
   //    ^^^
-  // [context 28] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 46] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 61] 'bad' refers to a property so it couldn't be promoted.
   f(bool b) {}
 }
@@ -267,7 +267,7 @@
   if (c.bad == null) return;
   c.f(!c.bad);
   //   ^^^^^
-  // [analyzer 28] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 46] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //     ^
   // [cfe 61] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -275,10 +275,10 @@
 class C16 {
   bool? bad;
   //    ^^^
-  // [context 22] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 24] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 25] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 32] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 9] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 10] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 11] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 12] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 62] 'bad' refers to a property so it couldn't be promoted.
   // [context 63] 'bad' refers to a property so it couldn't be promoted.
   // [context 64] 'bad' refers to a property so it couldn't be promoted.
@@ -289,22 +289,22 @@
   if (c.bad == null) return;
   for (; c.bad;) {}
   //     ^^^^^
-  // [analyzer 32] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 10] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
   // [cfe 62] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   [for (; c.bad;) null];
   //      ^^^^^
-  // [analyzer 25] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 11] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //        ^
   // [cfe 63] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({for (; c.bad;) null});
   //       ^^^^^
-  // [analyzer 22] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 12] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
   // [cfe 64] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({for (; c.bad;) null: null});
   //       ^^^^^
-  // [analyzer 24] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 9] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //         ^
   // [cfe 65] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -312,7 +312,7 @@
 class C17 {
   bool? bad;
   //    ^^^
-  // [context 10] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 28] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 66] 'bad' refers to a property so it couldn't be promoted.
   f(int i) {}
 }
@@ -321,7 +321,7 @@
   if (c.bad == null) return;
   c.f(c.bad ? 1 : 2);
   //  ^^^^^
-  // [analyzer 10] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 28] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
   // [cfe 66] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -329,7 +329,7 @@
 class C18 {
   bool? bad;
   //    ^^^
-  // [context 26] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 1] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 67] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -337,7 +337,7 @@
   if (c.bad == null) return;
   do {} while (c.bad);
   //           ^^^^^
-  // [analyzer 26] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 1] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //             ^
   // [cfe 67] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -345,10 +345,10 @@
 class C19 {
   bool? bad;
   //    ^^^
-  // [context 5] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 9] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 12] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 39] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 14] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 23] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 27] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 44] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 68] 'bad' refers to a property so it couldn't be promoted.
   // [context 69] 'bad' refers to a property so it couldn't be promoted.
   // [context 70] 'bad' refers to a property so it couldn't be promoted.
@@ -359,22 +359,22 @@
   if (c.bad == null) return;
   if (c.bad) {}
   //  ^^^^^
-  // [analyzer 5] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 44] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //    ^
   // [cfe 68] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   [if (c.bad) null];
   //   ^^^^^
-  // [analyzer 12] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 27] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //     ^
   // [cfe 69] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({if (c.bad) null});
   //    ^^^^^
-  // [analyzer 9] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 23] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //      ^
   // [cfe 70] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
   ({if (c.bad) null: null});
   //    ^^^^^
-  // [analyzer 39] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 14] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //      ^
   // [cfe 71] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -382,7 +382,7 @@
 class C20 {
   bool? bad;
   //    ^^^
-  // [context 3] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 19] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 72] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -390,7 +390,7 @@
   if (c.bad == null) return;
   while (c.bad) {}
   //     ^^^^^
-  // [analyzer 3] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+  // [analyzer 19] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
   //       ^
   // [cfe 72] A value of type 'bool?' can't be assigned to a variable of type 'bool' because 'bool?' is nullable and 'bool' isn't.
 }
@@ -398,7 +398,7 @@
 class C21 {
   int? bad;
   //   ^^^
-  // [context 17] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 35] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 73] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -406,7 +406,7 @@
   if (c.bad == null) return;
   i = c.bad;
   //  ^^^^^
-  // [analyzer 17] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 35] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //    ^
   // [cfe 73] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -414,7 +414,7 @@
 class C22 {
   int? bad;
   //   ^^^
-  // [context 18] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 34] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 74] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -422,7 +422,7 @@
   if (c.bad == null) return;
   int i = c.bad;
   //      ^^^^^
-  // [analyzer 18] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 34] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //        ^
   // [cfe 74] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -430,7 +430,7 @@
 class C23 {
   int? bad;
   //   ^^^
-  // [context 20] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 25] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 75] 'bad' refers to a property so it couldn't be promoted.
   final int x;
   final int y;
@@ -438,7 +438,7 @@
       : x = c.bad!,
         y = c.bad;
         //  ^^^^^
-        // [analyzer 20] COMPILE_TIME_ERROR.FIELD_INITIALIZER_NOT_ASSIGNABLE
+        // [analyzer 25] COMPILE_TIME_ERROR.FIELD_INITIALIZER_NOT_ASSIGNABLE
         //    ^
         // [cfe 75] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -446,10 +446,10 @@
 class C24 {
   int? bad;
   //   ^^^
-  // [context 14] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 41] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 43] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 44] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 6] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 8] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 29] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 36] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 76] 'bad' refers to a property so it couldn't be promoted.
   // [context 77] 'bad' refers to a property so it couldn't be promoted.
   // [context 78] 'bad' refers to a property so it couldn't be promoted.
@@ -460,22 +460,22 @@
   if (c.bad == null) return;
   for (int i = c.bad; false;) {}
   //           ^^^^^
-  // [analyzer 44] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 36] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //             ^
   // [cfe 76] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   [for (int i = c.bad; false;) null];
   //            ^^^^^
-  // [analyzer 43] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 29] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //              ^
   // [cfe 77] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (int i = c.bad; false;) null});
   //             ^^^^^
-  // [analyzer 41] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 8] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe 78] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (int i = c.bad; false;) null: null});
   //             ^^^^^
-  // [analyzer 14] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 6] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //               ^
   // [cfe 79] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -483,10 +483,10 @@
 class C25 {
   int? bad;
   //   ^^^
-  // [context 2] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 4] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 8] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 11] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 30] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 39] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 40] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 45] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 80] 'bad' refers to a property so it couldn't be promoted.
   // [context 81] 'bad' refers to a property so it couldn't be promoted.
   // [context 82] 'bad' refers to a property so it couldn't be promoted.
@@ -497,22 +497,22 @@
   if (c.bad == null) return;
   for (i = c.bad; false;) {}
   //       ^^^^^
-  // [analyzer 2] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 30] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //         ^
   // [cfe 80] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   [for (i = c.bad; false;) null];
   //        ^^^^^
-  // [analyzer 4] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 45] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //          ^
   // [cfe 81] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (i = c.bad; false;) null});
   //         ^^^^^
-  // [analyzer 11] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 39] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe 82] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   ({for (i = c.bad; false;) null: null});
   //         ^^^^^
-  // [analyzer 8] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+  // [analyzer 40] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
   //           ^
   // [cfe 83] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -520,7 +520,7 @@
 class C26 {
   int? bad;
   //   ^^^
-  // [context 45] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 26] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 84] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -529,7 +529,7 @@
   if (c.bad == null) return;
   n += c.bad;
   //   ^^^^^
-  // [analyzer 45] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 26] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //     ^
   // [cfe 84] A value of type 'int?' can't be assigned to a variable of type 'num' because 'int?' is nullable and 'num' isn't.
 }
@@ -537,7 +537,7 @@
 class C27 {
   int? bad;
   //   ^^^
-  // [context 7] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 42] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 85] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -545,7 +545,7 @@
   if (c.bad == null) return;
   values[c.bad];
   //     ^^^^^
-  // [analyzer 7] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 42] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
   // [cfe 85] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -553,7 +553,7 @@
 class C28 {
   int? bad;
   //   ^^^
-  // [context 23] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 31] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
   // [context 86] 'bad' refers to a property so it couldn't be promoted.
 }
 
@@ -561,7 +561,7 @@
   if (c.bad == null) return;
   values[c.bad] = 0;
   //     ^^^^^
-  // [analyzer 23] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 31] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
   // [cfe 86] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
@@ -569,75 +569,77 @@
 class C29 {
   int? bad;
   //   ^^^
-  // [context 19] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 22] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 87] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetCompound(C29 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[c.bad] += 1;
   //     ^^^^^
-  // [analyzer 19] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 22] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 87] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C30 {
   int? bad;
   //   ^^^
-  // [context 37] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 18] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 88] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetIfNull(C30 c, List<int?> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[c.bad] ??= 1;
   //     ^^^^^
-  // [analyzer 37] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 18] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 88] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C31 {
   int? bad;
   //   ^^^
-  // [context 31] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 35] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 20] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 41] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 89] 'bad' refers to a property so it couldn't be promoted.
+  // [context 90] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetPreIncDec(C31 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   ++values[c.bad];
   //       ^^^^^
-  // [analyzer 31] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 41] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //         ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 89] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   --values[c.bad];
   //       ^^^^^
-  // [analyzer 35] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 20] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //         ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 90] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
 
 class C32 {
   int? bad;
   //   ^^^
-  // [context 15] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
-  // [context 34] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 2] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 37] 'bad' refers to a property so it couldn't be promoted.  See http://dart.dev/go/non-promo-property
+  // [context 91] 'bad' refers to a property so it couldn't be promoted.
+  // [context 92] 'bad' refers to a property so it couldn't be promoted.
 }
 
 indexSetPostIncDec(C32 c, List<int> values) {
-  // TODO(paulberry): get this to work with the CFE
   if (c.bad == null) return;
   values[c.bad]++;
   //     ^^^^^
-  // [analyzer 34] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 2] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 91] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
   values[c.bad]--;
   //     ^^^^^
-  // [analyzer 15] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
+  // [analyzer 37] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
   //       ^
-  // [cfe] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
+  // [cfe 92] A value of type 'int?' can't be assigned to a variable of type 'int' because 'int?' is nullable and 'int' isn't.
 }
diff --git a/tools/VERSION b/tools/VERSION
index b5dfc3a..11d34ef 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 214
+PRERELEASE 215
 PRERELEASE_PATCH 0
\ No newline at end of file