Version 2.11.0-208.0.dev

Merge commit '976a0da3fd223f27b0fe877d7936c53075359a34' into 'dev'
diff --git a/DEPS b/DEPS
index 90a6ced..8d44494 100644
--- a/DEPS
+++ b/DEPS
@@ -39,7 +39,7 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.10.0-110.3.beta",
+  "sdk_tag": "version:2.11.0-190.0.dev",
 
   # 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
@@ -97,7 +97,7 @@
   "dart_style_tag": "1.3.7",  # Please see the note above before updating.
 
   "chromedriver_tag": "83.0.4103.39",
-  "dartdoc_rev" : "v0.35.0",
+  "dartdoc_rev" : "8f5f30e58bbc0f11f104888ee87f11cbd6b82cc7",
   "ffi_rev": "454ab0f9ea6bd06942a983238d8a6818b1357edb",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9e0b07a..09790fa 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -860,18 +860,19 @@
   InterfaceType get supertype {
     if (_supertype != null) return _supertype;
 
+    if (hasModifier(Modifier.DART_CORE_OBJECT)) {
+      return null;
+    }
+
     if (linkedNode != null) {
-      var context = enclosingUnit.linkedContext;
-
-      var coreTypes = context.bundleContext.elementFactory.coreTypes;
-      if (identical(this, coreTypes.objectClass)) {
-        return null;
-      }
-
-      var type = context.getSuperclass(linkedNode)?.type;
+      var type = linkedContext.getSuperclass(linkedNode)?.type;
       if (_isInterfaceTypeClass(type)) {
         return _supertype = type;
       }
+      if (library.isDartCore && name == 'Object') {
+        setModifier(Modifier.DART_CORE_OBJECT, true);
+        return null;
+      }
       return _supertype = library.typeProvider.objectType;
     }
     return _supertype;
@@ -5898,61 +5899,65 @@
   /// Indicates that the modifier 'covariant' was applied to the element.
   static const Modifier COVARIANT = Modifier('COVARIANT', 3);
 
+  /// Indicates that the class is `Object` from `dart:core`.
+  static const Modifier DART_CORE_OBJECT = Modifier('DART_CORE_OBJECT', 4);
+
   /// Indicates that the import element represents a deferred library.
-  static const Modifier DEFERRED = Modifier('DEFERRED', 4);
+  static const Modifier DEFERRED = Modifier('DEFERRED', 5);
 
   /// Indicates that a class element was defined by an enum declaration.
-  static const Modifier ENUM = Modifier('ENUM', 5);
+  static const Modifier ENUM = Modifier('ENUM', 6);
 
   /// Indicates that a class element was defined by an enum declaration.
-  static const Modifier EXTERNAL = Modifier('EXTERNAL', 6);
+  static const Modifier EXTERNAL = Modifier('EXTERNAL', 7);
 
   /// Indicates that the modifier 'factory' was applied to the element.
-  static const Modifier FACTORY = Modifier('FACTORY', 7);
+  static const Modifier FACTORY = Modifier('FACTORY', 8);
 
   /// Indicates that the modifier 'final' was applied to the element.
-  static const Modifier FINAL = Modifier('FINAL', 8);
+  static const Modifier FINAL = Modifier('FINAL', 9);
 
   /// Indicates that an executable element has a body marked as being a
   /// generator.
-  static const Modifier GENERATOR = Modifier('GENERATOR', 9);
+  static const Modifier GENERATOR = Modifier('GENERATOR', 10);
 
   /// Indicates that the pseudo-modifier 'get' was applied to the element.
-  static const Modifier GETTER = Modifier('GETTER', 10);
+  static const Modifier GETTER = Modifier('GETTER', 11);
 
   /// A flag used for libraries indicating that the defining compilation unit
   /// contains at least one import directive whose URI uses the "dart-ext"
   /// scheme.
-  static const Modifier HAS_EXT_URI = Modifier('HAS_EXT_URI', 11);
+  static const Modifier HAS_EXT_URI = Modifier('HAS_EXT_URI', 12);
 
   /// Indicates that the associated element did not have an explicit type
   /// associated with it. If the element is an [ExecutableElement], then the
   /// type being referred to is the return type.
-  static const Modifier IMPLICIT_TYPE = Modifier('IMPLICIT_TYPE', 12);
+  static const Modifier IMPLICIT_TYPE = Modifier('IMPLICIT_TYPE', 13);
 
   /// Indicates that modifier 'lazy' was applied to the element.
-  static const Modifier LATE = Modifier('LATE', 13);
+  static const Modifier LATE = Modifier('LATE', 14);
 
   /// Indicates that a class is a mixin application.
-  static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 14);
+  static const Modifier MIXIN_APPLICATION = Modifier('MIXIN_APPLICATION', 15);
 
   /// Indicates that the pseudo-modifier 'set' was applied to the element.
-  static const Modifier SETTER = Modifier('SETTER', 15);
+  static const Modifier SETTER = Modifier('SETTER', 16);
 
   /// Indicates that the modifier 'static' was applied to the element.
-  static const Modifier STATIC = Modifier('STATIC', 16);
+  static const Modifier STATIC = Modifier('STATIC', 17);
 
   /// Indicates that the element does not appear in the source code but was
   /// implicitly created. For example, if a class does not define any
   /// constructors, an implicit zero-argument constructor will be created and it
   /// will be marked as being synthetic.
-  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 17);
+  static const Modifier SYNTHETIC = Modifier('SYNTHETIC', 18);
 
   static const List<Modifier> values = [
     ABSTRACT,
     ASYNCHRONOUS,
     CONST,
     COVARIANT,
+    DART_CORE_OBJECT,
     DEFERRED,
     ENUM,
     EXTERNAL,
diff --git a/pkg/analyzer/lib/src/summary2/core_types.dart b/pkg/analyzer/lib/src/summary2/core_types.dart
deleted file mode 100644
index 289ea8e..0000000
--- a/pkg/analyzer/lib/src/summary2/core_types.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2019, 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 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/summary2/linked_element_factory.dart';
-
-class CoreTypes {
-  final LinkedElementFactory _elementFactory;
-
-  LibraryElement _coreLibrary;
-  ClassElement _objectClass;
-
-  CoreTypes(this._elementFactory);
-
-  LibraryElement get coreLibrary {
-    return _coreLibrary ??= _elementFactory.libraryOfUri('dart:core');
-  }
-
-  ClassElement get objectClass {
-    return _objectClass ??= _getCoreClass('Object');
-  }
-
-  ClassElement _getCoreClass(String name) {
-    return coreLibrary.getType(name);
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 112fab4..b074a62 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -10,7 +10,6 @@
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary2/core_types.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
@@ -22,8 +21,6 @@
   final Reference rootReference;
   final Map<String, LinkedLibraryContext> libraryMap = {};
 
-  CoreTypes _coreTypes;
-
   LinkedElementFactory(
     this.analysisContext,
     this.analysisSession,
@@ -34,10 +31,6 @@
     declareDartCoreDynamicNever();
   }
 
-  CoreTypes get coreTypes {
-    return _coreTypes ??= CoreTypes(this);
-  }
-
   Reference get dynamicRef {
     return rootReference.getChild('dart:core').getChild('dynamic');
   }
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index ec169b2..45500b8 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -580,6 +580,21 @@
     ]);
   }
 
+  test_switchCase_implementsEquals_enum() async {
+    await assertNoErrorsInCode(r'''
+enum MyEnum {a, b, c}
+
+void f(MyEnum myEnum) {
+  switch (myEnum) {
+    case MyEnum.a:
+      break;
+    default:
+      break;
+  }
+}
+''');
+  }
+
   test_unknown_uri() async {
     await assertErrorsInCode(r'''
 import 'foo:bar';
diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md
index 60d65bb..8f0d5e3 100644
--- a/pkg/analyzer_plugin/CHANGELOG.md
+++ b/pkg/analyzer_plugin/CHANGELOG.md
@@ -4,6 +4,7 @@
 - Deprecated the method `ChangeBuilder.addFileEdit` and introduced
   `ChangeBuilder.addDartFileEdit` and `ChangeBuilder.addGenericFileEdit` to be
   the replacements for it.
+- Bump maximum supported version of the analyzer to `<0.41.0`.
 
 ## 0.3.0
 - Removed deprecated `Plugin.getResolveResult`. Use `getResolvedUnitResult`.
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 1c02eab..1620c64 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -8,7 +8,7 @@
   sdk: '>=2.3.0 <3.0.0'
 
 dependencies:
-  analyzer: '^0.39.12'
+  analyzer: '>=0.39.12 <0.41.0'
   charcode: '^1.1.0'
   dart_style: '^1.2.0'
   pub_semver: '^1.3.2'
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 9fa3c80..607bf99 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -231,11 +231,13 @@
   bool _typeEnsured = false;
   Set<ClassMember> _overrideDependencies;
 
-  void registerOverrideDependency(ClassMember overriddenMember) {
-    assert(overriddenMember.classBuilder != classBuilder,
-        "Unexpected override dependency for $this: $overriddenMember");
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
+    assert(
+        overriddenMembers.every((overriddenMember) =>
+            overriddenMember.classBuilder != classBuilder),
+        "Unexpected override dependencies for $this: $overriddenMembers");
     _overrideDependencies ??= {};
-    _overrideDependencies.add(overriddenMember);
+    _overrideDependencies.addAll(overriddenMembers);
   }
 
   void _ensureType(ClassHierarchyBuilder hierarchy) {
@@ -697,8 +699,8 @@
   }
 
   @override
-  void registerOverrideDependency(ClassMember overriddenMember) {
-    memberBuilder.registerOverrideDependency(overriddenMember);
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
+    memberBuilder.registerOverrideDependency(overriddenMembers);
   }
 
   @override
@@ -1315,8 +1317,8 @@
   }
 
   @override
-  void registerOverrideDependency(ClassMember overriddenMember) {
-    fieldBuilder.registerOverrideDependency(overriddenMember);
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
+    fieldBuilder.registerOverrideDependency(overriddenMembers);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 38ac664..54a738b 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -249,11 +249,13 @@
   bool _typeEnsured = false;
   Set<ClassMember> _overrideDependencies;
 
-  void registerOverrideDependency(ClassMember overriddenMember) {
-    assert(overriddenMember.classBuilder != classBuilder,
-        "Unexpected override dependency for $this: $overriddenMember");
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
+    assert(
+        overriddenMembers.every((overriddenMember) =>
+            overriddenMember.classBuilder != classBuilder),
+        "Unexpected override dependencies for $this: $overriddenMembers");
     _overrideDependencies ??= {};
-    _overrideDependencies.add(overriddenMember);
+    _overrideDependencies.addAll(overriddenMembers);
   }
 
   void _ensureTypes(ClassHierarchyBuilder hierarchy) {
@@ -594,8 +596,8 @@
   }
 
   @override
-  void registerOverrideDependency(ClassMember overriddenMember) {
-    memberBuilder.registerOverrideDependency(overriddenMember);
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
+    memberBuilder.registerOverrideDependency(overriddenMembers);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index b34c24f..d31e6dd 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -187,7 +187,7 @@
   }
 
   @override
-  void registerOverrideDependency(ClassMember overriddenMember) {
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
     // Do nothing; this is only for source members.
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index a036ae6..7b8b992 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -241,7 +241,7 @@
   bool operator ==(Object other);
 
   void inferType(ClassHierarchyBuilder hierarchy);
-  void registerOverrideDependency(ClassMember overriddenMember);
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers);
 
   /// Returns `true` if this has the same underlying declaration as [other].
   bool isSameDeclaration(ClassMember other);
@@ -1940,31 +1940,6 @@
     /// [ClassHierarchyNode].
     Map<Name, ClassMember> interfaceSetterMap = {};
 
-    Map<ClassMember, Set<ClassMember>> overrideDependencies = {};
-
-    // TODO(johnniwinther): Make these non-local and ensure that each
-    // underlying declaration has only on delayed type, signature, and
-    // override computation. Currently fields get one as a getter and as a
-    // setter.
-
-    void registerOverrideDependency(
-        ClassMember member, ClassMember overriddenMember) {
-      if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
-        if (overriddenMember.hasDeclarations &&
-            classBuilder == overriddenMember.classBuilder) {
-          for (int i = 0; i < overriddenMember.declarations.length; i++) {
-            registerOverrideDependency(
-                member, overriddenMember.declarations[i]);
-          }
-        } else {
-          Set<ClassMember> dependencies =
-              overrideDependencies[member] ??= <ClassMember>{};
-          dependencies.add(overriddenMember);
-          member.registerOverrideDependency(overriddenMember);
-        }
-      }
-    }
-
     void registerOverrideCheck(
         ClassMember member, ClassMember overriddenMember) {
       if (classBuilder is SourceClassBuilder) {
@@ -1982,6 +1957,23 @@
     }
 
     memberMap.forEach((Name name, Tuple tuple) {
+      Set<ClassMember> overriddenMembers = {};
+
+      void registerOverrideDependency(
+          ClassMember member, ClassMember overriddenMember) {
+        if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
+          if (overriddenMember.hasDeclarations &&
+              classBuilder == overriddenMember.classBuilder) {
+            for (int i = 0; i < overriddenMember.declarations.length; i++) {
+              registerOverrideDependency(
+                  member, overriddenMember.declarations[i]);
+            }
+          } else {
+            overriddenMembers.add(overriddenMember);
+          }
+        }
+      }
+
       ClassMember computeClassMember(ClassMember declaredMember,
           ClassMember extendedMember, bool forSetter) {
         if (declaredMember != null) {
@@ -2233,15 +2225,9 @@
         if (member.classBuilder == classBuilder &&
             overriddenMember.classBuilder != classBuilder) {
           if (member is SourceFieldMember) {
-            if (member.isFinal && overriddenMember.isSetter) {
-              registerOverrideDependency(member, overriddenMember);
-              hierarchy.registerOverrideCheck(
-                  classBuilder, member, overriddenMember);
-            } else {
-              registerOverrideDependency(member, overriddenMember);
-              hierarchy.registerOverrideCheck(
-                  classBuilder, member, overriddenMember);
-            }
+            registerOverrideDependency(member, overriddenMember);
+            hierarchy.registerOverrideCheck(
+                classBuilder, member, overriddenMember);
           } else if (member is SourceProcedureMember) {
             registerOverrideDependency(member, overriddenMember);
             hierarchy.registerOverrideCheck(
@@ -2320,18 +2306,21 @@
       if (interfaceSetter != null) {
         interfaceSetterMap[name] = interfaceSetter;
       }
-    });
+      if (overriddenMembers.isNotEmpty) {
+        void registerOverrideDependencies(ClassMember member) {
+          if (member != null &&
+              member.classBuilder == classBuilder &&
+              member.isSourceDeclaration) {
+            member.registerOverrideDependency(overriddenMembers);
+            DelayedTypeComputation computation =
+                new DelayedTypeComputation(this, member, overriddenMembers);
+            hierarchy.registerDelayedTypeComputation(computation);
+          }
+        }
 
-    overrideDependencies
-        .forEach((ClassMember member, Set<ClassMember> overriddenMembers) {
-      assert(
-          member == memberMap[member.name].declaredMember ||
-              member == memberMap[member.name].declaredSetter,
-          "Unexpected method type inference for ${memberMap[member.name]}: "
-          "${member} -> ${overriddenMembers}");
-      DelayedTypeComputation computation =
-          new DelayedTypeComputation(this, member, overriddenMembers);
-      hierarchy.registerDelayedTypeComputation(computation);
+        registerOverrideDependencies(tuple.declaredMember);
+        registerOverrideDependencies(tuple.declaredSetter);
+      }
     });
 
     if (!hasInterfaces) {
@@ -3003,7 +2992,7 @@
   }
 
   @override
-  void registerOverrideDependency(ClassMember overriddenMember) {
+  void registerOverrideDependency(Set<ClassMember> overriddenMembers) {
     // Do nothing; this is only for declared members.
   }
 
diff --git a/pkg/front_end/testcases/general/issue42694.dart b/pkg/front_end/testcases/general/issue42694.dart
new file mode 100644
index 0000000..95e5875
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class A {
+  void set setter(int value);
+}
+
+class B implements A {
+  get setter => throw '';
+  void set setter(value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue42694.dart.outline.expect b/pkg/front_end/testcases/general/issue42694.dart.outline.expect
new file mode 100644
index 0000000..1b716ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.outline.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  abstract set setter(core::int* value) → void;
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get setter() → core::int*
+    ;
+  set setter(core::int* value) → void
+    ;
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue42694.dart.strong.expect b/pkg/front_end/testcases/general/issue42694.dart.strong.expect
new file mode 100644
index 0000000..f8b3fdc
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set setter(core::int* value) → void;
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get setter() → core::int*
+    return throw "";
+  set setter(core::int* value) → void {}
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42694.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue42694.dart.strong.transformed.expect
new file mode 100644
index 0000000..f8b3fdc
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  abstract set setter(core::int* value) → void;
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  get setter() → core::int*
+    return throw "";
+  set setter(core::int* value) → void {}
+  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
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue42694.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue42694.dart.textual_outline.expect
new file mode 100644
index 0000000..6d5d6ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+abstract class A {
+  void set setter(int value);
+}
+
+class B implements A {
+  get setter => throw '';
+  void set setter(value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue42694.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue42694.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..6d5d6ad
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue42694.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+abstract class A {
+  void set setter(int value);
+}
+
+class B implements A {
+  get setter => throw '';
+  void set setter(value) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart b/pkg/front_end/testcases/general/issue43721.dart
new file mode 100644
index 0000000..2e034fd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart
@@ -0,0 +1,15 @@
+import 'dart:async';
+
+ok<T extends FutureOr<num>>(T t) {}
+error<T extends FutureOr<int>>(T t) {}
+
+bar(bool condition) {
+  FutureOr<int> x = null;
+  num n = 1;
+  var z = condition ? x : n;
+
+  ok(z); // Ok.
+  error(z); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart.outline.expect b/pkg/front_end/testcases/general/issue43721.dart.outline.expect
new file mode 100644
index 0000000..84a6f86
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic
+  ;
+static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic
+  ;
+static method bar(core::bool* condition) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue43721.dart.strong.expect b/pkg/front_end/testcases/general/issue43721.dart.strong.expect
new file mode 100644
index 0000000..4874055
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43721.dart:12:3: Error: Inferred type argument 'FutureOr<num>' doesn't conform to the bound 'FutureOr<int>' of the type variable 'T' on 'error'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   error(z); // Error.
+//   ^
+// pkg/front_end/testcases/general/issue43721.dart:4:7: Context: This is the type variable whose bound isn't conformed to.
+// error<T extends FutureOr<int>>(T t) {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
+static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
+static method bar(core::bool* condition) → dynamic {
+  FutureOr<core::int*>* x = null;
+  core::num* n = 1;
+  FutureOr<core::num*>* z = condition ?{FutureOr<core::num*>*} x : n;
+  self::ok<FutureOr<core::num*>*>(z);
+  self::error<FutureOr<core::num*>*>(z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue43721.dart.strong.transformed.expect
new file mode 100644
index 0000000..4874055
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue43721.dart:12:3: Error: Inferred type argument 'FutureOr<num>' doesn't conform to the bound 'FutureOr<int>' of the type variable 'T' on 'error'.
+// Try specifying type arguments explicitly so that they conform to the bounds.
+//   error(z); // Error.
+//   ^
+// pkg/front_end/testcases/general/issue43721.dart:4:7: Context: This is the type variable whose bound isn't conformed to.
+// error<T extends FutureOr<int>>(T t) {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method ok<T extends FutureOr<core::num*>* = FutureOr<core::num*>*>(self::ok::T* t) → dynamic {}
+static method error<T extends FutureOr<core::int*>* = FutureOr<core::int*>*>(self::error::T* t) → dynamic {}
+static method bar(core::bool* condition) → dynamic {
+  FutureOr<core::int*>* x = null;
+  core::num* n = 1;
+  FutureOr<core::num*>* z = condition ?{FutureOr<core::num*>*} x : n;
+  self::ok<FutureOr<core::num*>*>(z);
+  self::error<FutureOr<core::num*>*>(z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue43721.dart.textual_outline.expect
new file mode 100644
index 0000000..8cb94b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+import 'dart:async';
+
+ok<T extends FutureOr<num>>(T t) {}
+error<T extends FutureOr<int>>(T t) {}
+bar(bool condition) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue43721.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue43721.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f3e0e4c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue43721.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'dart:async';
+
+bar(bool condition) {}
+error<T extends FutureOr<int>>(T t) {}
+main() {}
+ok<T extends FutureOr<num>>(T t) {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart b/pkg/front_end/testcases/nnbd/issue43716a.dart
new file mode 100644
index 0000000..fac58ad
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+bool b = true;
+
+class C<X extends C<X, X>?, Y extends C<Y, Y>?> {
+  X x;
+  C(this.x);
+  Object m(X x, Y y) {
+    // UP(X extends C<X, X>?, Y extends C<Y, Y>?) ==
+    // C<Object, Object>?.
+    var z = b ? x : y;
+    if (z == null) throw 0;
+    return z.x; // Error.
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.outline.expect
new file mode 100644
index 0000000..be98ef0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    ;
+  method m(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y% y) → core::Object
+    ;
+}
+static field core::bool b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
new file mode 100644
index 0000000..f415c03
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//     return z.x; // Error.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y% y) → core::Object {
+    self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
+    if(z.{core::Object::==}(null))
+      throw 0;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+ - 'Object' is from 'dart:core'.
+    return z.x; // Error.
+             ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
+  }
+}
+static field core::bool b = true;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
new file mode 100644
index 0000000..06894de
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//     return z.x; // Error.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y% y) → core::Object {
+    self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
+    if(z.{core::Object::==}(null))
+      throw 0;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+ - 'Object' is from 'dart:core'.
+    return z.x; // Error.
+             ^" in let core::Object? #t2 = z{self::C<core::Object?, core::Object?>}.{self::C::x} in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object};
+  }
+}
+static field core::bool b = true;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline.expect
new file mode 100644
index 0000000..52093da
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+bool b = true;
+
+class C<X extends C<X, X>?, Y extends C<Y, Y>?> {
+  X x;
+  C(this.x);
+  Object m(X x, Y y) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5d771921
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.textual_outline_modelled.expect
@@ -0,0 +1,9 @@
+bool b = true;
+
+class C<X extends C<X, X>?, Y extends C<Y, Y>?> {
+  C(this.x);
+  Object m(X x, Y y) {}
+  X x;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
new file mode 100644
index 0000000..f415c03
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//     return z.x; // Error.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y% y) → core::Object {
+    self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
+    if(z.{core::Object::==}(null))
+      throw 0;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+ - 'Object' is from 'dart:core'.
+    return z.x; // Error.
+             ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x} as{TypeError,ForNonNullableByDefault} core::Object;
+  }
+}
+static field core::bool b = true;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
new file mode 100644
index 0000000..2b40d28
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716a.dart.weak.transformed.expect
@@ -0,0 +1,29 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//     return z.x; // Error.
+//              ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends self::C<self::C::X%, self::C::X%>? = self::C<dynamic, dynamic>?, Y extends self::C<self::C::Y%, self::C::Y%>? = self::C<dynamic, dynamic>?> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%, self::C::Y%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m(generic-covariant-impl self::C::X% x, generic-covariant-impl self::C::Y% y) → core::Object {
+    self::C<core::Object?, core::Object?>? z = self::b ?{self::C<core::Object?, core::Object?>?} x : y;
+    if(z.{core::Object::==}(null))
+      throw 0;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716a.dart:15:14: Error: A value of type 'Object?' can't be returned from a function with return type 'Object'.
+ - 'Object' is from 'dart:core'.
+    return z.x; // Error.
+             ^" in z{self::C<core::Object?, core::Object?>}.{self::C::x};
+  }
+}
+static field core::bool b = true;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart b/pkg/front_end/testcases/nnbd/issue43716b.dart
new file mode 100644
index 0000000..629055b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+bool b = true;
+
+void f(Object o) {}
+
+class C<X extends void Function(X)?> {
+  X x;
+  C(this.x);
+  void m() {
+    // UP(X extends void Function(X)?, void Function(Object)) ==
+    // void Function(Object)?.
+    var z = b ? x : f;
+    if (z == null) return;
+    z(42); // Error.
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.outline.expect
new file mode 100644
index 0000000..3b44433
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    ;
+  method m() → void
+    ;
+}
+static field core::bool b;
+static method f(core::Object o) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.expect
new file mode 100644
index 0000000..e9ab0b4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+//     z(42); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m() → void {
+    (Never) →? void z = self::b ?{(Never) →? void} this.{self::C::x} : #C1;
+    if(z.{core::Object::==}(null))
+      return;
+    z{(Never) → void}.call(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+    z(42); // Error.
+      ^" in 42 as{TypeError,ForNonNullableByDefault} Never);
+  }
+}
+static field core::bool b = true;
+static method f(core::Object o) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.transformed.expect
new file mode 100644
index 0000000..e9ab0b4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+//     z(42); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m() → void {
+    (Never) →? void z = self::b ?{(Never) →? void} this.{self::C::x} : #C1;
+    if(z.{core::Object::==}(null))
+      return;
+    z{(Never) → void}.call(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+    z(42); // Error.
+      ^" in 42 as{TypeError,ForNonNullableByDefault} Never);
+  }
+}
+static field core::bool b = true;
+static method f(core::Object o) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline.expect
new file mode 100644
index 0000000..f44dbcd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+bool b = true;
+void f(Object o) {}
+
+class C<X extends void Function(X)?> {
+  X x;
+  C(this.x);
+  void m() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..8a353f3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+bool b = true;
+
+class C<X extends void Function(X)?> {
+  C(this.x);
+  X x;
+  void m() {}
+}
+
+main() {}
+void f(Object o) {}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.expect
new file mode 100644
index 0000000..e9ab0b4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+//     z(42); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m() → void {
+    (Never) →? void z = self::b ?{(Never) →? void} this.{self::C::x} : #C1;
+    if(z.{core::Object::==}(null))
+      return;
+    z{(Never) → void}.call(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+    z(42); // Error.
+      ^" in 42 as{TypeError,ForNonNullableByDefault} Never);
+  }
+}
+static field core::bool b = true;
+static method f(core::Object o) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.transformed.expect
new file mode 100644
index 0000000..e9ab0b4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43716b.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+//     z(42); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<X extends (self::C::X%) →? void = (Never) →? void> extends core::Object {
+  generic-covariant-impl field self::C::X% x;
+  constructor •(self::C::X% x) → self::C<self::C::X%>
+    : self::C::x = x, super core::Object::•()
+    ;
+  method m() → void {
+    (Never) →? void z = self::b ?{(Never) →? void} this.{self::C::x} : #C1;
+    if(z.{core::Object::==}(null))
+      return;
+    z{(Never) → void}.call(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43716b.dart:17:7: Error: The argument type 'int' can't be assigned to the parameter type 'Never'.
+    z(42); // Error.
+      ^" in 42 as{TypeError,ForNonNullableByDefault} Never);
+  }
+}
+static field core::bool b = true;
+static method f(core::Object o) → void {}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart b/pkg/front_end/testcases/nnbd/issue43721.dart
new file mode 100644
index 0000000..a5f8c2c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+foo(Object x) {}
+
+bar(bool condition) {
+  FutureOr<int?> x = null;
+  num n = 1;
+  var z = condition ? x : n;
+  foo(z); // Error.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.outline.expect
new file mode 100644
index 0000000..fb5deaf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.outline.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic
+  ;
+static method bar(core::bool condition) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
new file mode 100644
index 0000000..a293187
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//   foo(z); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic {}
+static method bar(core::bool condition) → dynamic {
+  FutureOr<core::int?>x = null;
+  core::num n = 1;
+  FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+ - 'Object' is from 'dart:core'.
+  foo(z); // Error.
+      ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
new file mode 100644
index 0000000..7d5061d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//   foo(z); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic {}
+static method bar(core::bool condition) → dynamic {
+  FutureOr<core::int?>x = null;
+  core::num n = 1;
+  FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+ - 'Object' is from 'dart:core'.
+  foo(z); // Error.
+      ^" in let FutureOr<core::num?>#t2 = z in #t2.==(null) ?{core::Object} #t2 as{TypeError,ForNonNullableByDefault} core::Object : #t2{core::Object});
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline.expect
new file mode 100644
index 0000000..6cc3511
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+import 'dart:async';
+
+foo(Object x) {}
+bar(bool condition) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..78950e4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+import 'dart:async';
+
+bar(bool condition) {}
+foo(Object x) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
new file mode 100644
index 0000000..a293187
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//   foo(z); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic {}
+static method bar(core::bool condition) → dynamic {
+  FutureOr<core::int?>x = null;
+  core::num n = 1;
+  FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+ - 'Object' is from 'dart:core'.
+  foo(z); // Error.
+      ^" in z as{TypeError,ForNonNullableByDefault} core::Object);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
new file mode 100644
index 0000000..7619193
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43721.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+//  - 'Object' is from 'dart:core'.
+//   foo(z); // Error.
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method foo(core::Object x) → dynamic {}
+static method bar(core::bool condition) → dynamic {
+  FutureOr<core::int?>x = null;
+  core::num n = 1;
+  FutureOr<core::num?>z = condition ?{FutureOr<core::num?>} x : n;
+  self::foo(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue43721.dart:13:7: Error: The argument type 'FutureOr<num?>' can't be assigned to the parameter type 'Object'.
+ - 'Object' is from 'dart:core'.
+  foo(z); // Error.
+      ^" in z);
+}
+static method main() → dynamic {}
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index 15d25e9..2fb3a96 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -728,20 +728,37 @@
           type1, coreTypes.objectNonNullableRawType, clientLibrary);
     }
 
-    if (type1 is FutureOrType || type2 is FutureOrType) {
-      if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
-        return type2;
+    // UP(FutureOr<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(Future<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(FutureOr<T1>, Future<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(T1, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(FutureOr<T1>, T2) = FutureOr<T3> where T3 = UP(T1, T2)
+    if (type1 is FutureOrType) {
+      DartType t1 = type1.typeArgument;
+      DartType t2;
+      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+        t2 = type2.typeArguments.single;
+      } else if (type2 is FutureOrType) {
+        t2 = type2.typeArgument;
+      } else {
+        t2 = type2;
       }
-      if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
-        return type1;
+      return new FutureOrType(
+          getStandardUpperBound(t1, t2, clientLibrary),
+          uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
+    } else if (type2 is FutureOrType) {
+      DartType t2 = type2.typeArgument;
+      DartType t1;
+      if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
+        t1 = type1.typeArguments.single;
+      } else {
+        t1 = type1;
       }
-      if (type1 is FutureOrType && type2 is FutureOrType) {
-        return new FutureOrType(
-            getStandardUpperBound(
-                type1.typeArgument, type2.typeArgument, clientLibrary),
-            uniteNullabilities(
-                type1.declaredNullability, type2.declaredNullability));
-      }
+      return new FutureOrType(
+          getStandardUpperBound(t1, t2, clientLibrary),
+          uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
     }
 
     // UP(T1, T2) = T2 if T1 <: T2
@@ -1289,20 +1306,37 @@
           type1, type2, clientLibrary);
     }
 
-    if (type1 is FutureOrType || type2 is FutureOrType) {
-      if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
-        return type2;
+    // UP(FutureOr<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(Future<T1>, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(FutureOr<T1>, Future<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(T1, FutureOr<T2>) = FutureOr<T3> where T3 = UP(T1, T2)
+    // UP(FutureOr<T1>, T2) = FutureOr<T3> where T3 = UP(T1, T2)
+    if (type1 is FutureOrType) {
+      DartType t1 = type1.typeArgument;
+      DartType t2;
+      if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+        t2 = type2.typeArguments.single;
+      } else if (type2 is FutureOrType) {
+        t2 = type2.typeArgument;
+      } else {
+        t2 = type2;
       }
-      if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
-        return type1;
+      return new FutureOrType(
+          getStandardUpperBound(t1, t2, clientLibrary),
+          uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
+    } else if (type2 is FutureOrType) {
+      DartType t2 = type2.typeArgument;
+      DartType t1;
+      if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
+        t1 = type1.typeArguments.single;
+      } else {
+        t1 = type1;
       }
-      if (type1 is FutureOrType && type2 is FutureOrType) {
-        return new FutureOrType(
-            getStandardUpperBound(
-                type1.typeArgument, type2.typeArgument, clientLibrary),
-            uniteNullabilities(
-                type1.declaredNullability, type2.declaredNullability));
-      }
+      return new FutureOrType(
+          getStandardUpperBound(t1, t2, clientLibrary),
+          uniteNullabilities(
+              type1.declaredNullability, type2.declaredNullability));
     }
 
     if (type1 is InvalidType || type2 is InvalidType) {
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index cc02953..716ba06 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -137,7 +137,11 @@
   //
   // iOS 32 bit alignment:
   // https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture/updating_data_structures
-  Abi.wordSize32Align32: {NativeType.kDouble: 4, NativeType.kInt64: 4},
+  Abi.wordSize32Align32: {
+    NativeType.kDouble: 4,
+    NativeType.kInt64: 4,
+    NativeType.kUnit64: 4
+  },
 
   // The default for MSVC x86:
   // > The alignment-requirement for all data except structures, unions, and
diff --git a/runtime/bin/ffi_test/ffi_test_functions.cc b/runtime/bin/ffi_test/ffi_test_functions.cc
index 3b915c0..c9e39e9 100644
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -1042,4 +1042,13 @@
   return 42;
 }
 
+struct Struct43693 {
+  void* pSomePtr;
+  uint64_t someValue;
+};
+
+DART_EXPORT uint64_t Regress43693(Struct43693* my_struct) {
+  return my_struct->someValue;
+}
+
 }  // namespace dart
diff --git a/tests/ffi/regress_43693_test.dart b/tests/ffi/regress_43693_test.dart
new file mode 100644
index 0000000..a34e8f8
--- /dev/null
+++ b/tests/ffi/regress_43693_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+
+class Struct43693 extends Struct {
+  external Pointer<Void> somePtr;
+
+  @Uint64()
+  external int someValue;
+}
+
+final int Function(Pointer<Struct43693>) readMyStructSomeValue =
+    ffiTestFunctions
+        .lookup<NativeFunction<Uint64 Function(Pointer<Struct43693>)>>(
+            "Regress43693")
+        .asFunction<int Function(Pointer<Struct43693>)>();
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+
+void main() {
+  final myStructs = allocate<Struct43693>();
+  myStructs[0].somePtr = nullptr;
+  myStructs[0].someValue = 0xAAAAAAAABBBBBBBB;
+  final result = readMyStructSomeValue(myStructs);
+  Expect.equals(0xAAAAAAAABBBBBBBB, result);
+  free(myStructs);
+}
diff --git a/tests/ffi_2/regress_43693_test.dart b/tests/ffi_2/regress_43693_test.dart
new file mode 100644
index 0000000..a30a118
--- /dev/null
+++ b/tests/ffi_2/regress_43693_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+import 'package:expect/expect.dart';
+
+import 'dylib_utils.dart';
+
+class Struct43693 extends Struct {
+  Pointer<Void> somePtr;
+
+  @Uint64()
+  int someValue;
+}
+
+final int Function(Pointer<Struct43693>) readMyStructSomeValue =
+    ffiTestFunctions
+        .lookup<NativeFunction<Uint64 Function(Pointer<Struct43693>)>>(
+            "Regress43693")
+        .asFunction<int Function(Pointer<Struct43693>)>();
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+
+void main() {
+  final myStructs = allocate<Struct43693>();
+  myStructs[0].somePtr = nullptr;
+  myStructs[0].someValue = 0xAAAAAAAABBBBBBBB;
+  final result = readMyStructSomeValue(myStructs);
+  Expect.equals(0xAAAAAAAABBBBBBBB, result);
+  free(myStructs);
+}
diff --git a/tools/VERSION b/tools/VERSION
index d7abe73..fd614ac 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 11
 PATCH 0
-PRERELEASE 207
+PRERELEASE 208
 PRERELEASE_PATCH 0
\ No newline at end of file