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
