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