Version 2.17.0-37.0.dev
Merge commit 'd9b69e907eed1b92a436f7688d5222c8e8d87be5' into 'dev'
diff --git a/DEPS b/DEPS
index b13d2dc..cfd0829 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
# co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
# hashes. It requires access to the dart-build-access group, which EngProd
# has.
- "co19_rev": "143ad7f74919b132951e447a547236e991d9f900",
+ "co19_rev": "73fa4da0cb5a6fec136a2ac045503770eed2b58f",
# This line prevents conflicts when both packages are rolled simultaneously.
"co19_2_rev": "995745937abffe9fc3a6441f9f0db27b2d706e4c",
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
index 7bc929b..4e453145 100644
--- a/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/util/libraries_specification.dart
@@ -42,8 +42,8 @@
/// - a top level entry for each target. Keys are target names (e.g. "vm"
/// above), and values contain the entire specification of a target.
///
-/// - each target specification is a map. Today, only one key is supported on
-/// this map: "libraries".
+/// - each target specification is a map. The supported keys are "libraries"
+/// and "include".
///
/// - The "libraries" entry contains details for how each platform library is
/// implemented. The entry is a map, where keys are the name of the platform
@@ -79,6 +79,30 @@
/// Internal libraries are never supported through conditional imports and
/// const `fromEnvironment` expressions.
///
+/// - The "include" entry is a list of maps, each containing either a "path"
+/// and a "target" entry, or only a "target" entry.
+///
+/// If both "path" and "target" entries are present, the libraries
+/// specification file located at "path", relative to the location current
+/// libraries specification file is loaded, and the libraries defined
+/// in the target with the target name of the "target" entry are included in
+/// this target.
+///
+/// If only the "target" is present, the libraries in the target in the
+/// current libraries specification file with the target name of the
+/// "target" entry are included in this target.
+///
+/// The "include" mechanism support transitive inclusion but doesn't allow
+/// cyclic dependencies.
+///
+/// If the same library is defined in multiple included target
+/// specifications, the last included takes precedence. This means that
+/// if a target specification include a library and also defines it itself,
+/// the latter is used.
+///
+/// Currently it is not supported to include a subset of the libraries from
+/// an included target specifications.
+///
///
/// Note: we currently have several different files that need to be updated
/// when changing libraries, sources, and patch files:
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 4576ec6..814b523 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -137,6 +137,14 @@
/* charOffset = */ null,
instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
+ final NamedTypeBuilder enumType = new NamedTypeBuilder(
+ "Enum",
+ const NullabilityBuilder.omitted(),
+ /* arguments = */ null,
+ /* fileUri = */ null,
+ /* charOffset = */ null,
+ instanceTypeVariableAccess: InstanceTypeVariableAccessState.Unexpected);
+
final bool excludeSource = !CompilerContext.current.options.embedSourceText;
final Map<String, String>? environmentDefines =
@@ -406,6 +414,7 @@
link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
computeCoreTypes();
loader.buildClassHierarchy(sourceClassBuilders, objectClassBuilder);
+ loader.checkSupertypes(sourceClassBuilders, enumClass);
// TODO(johnniwinther): Enable this when supported in the isolate-based
// macro executor.
/*if (macroApplications != null) {
@@ -416,7 +425,6 @@
loader.computeShowHideElements();
loader.installTypedefTearOffs();
loader.performTopLevelInference(sourceClassBuilders);
- loader.checkSupertypes(sourceClassBuilders);
loader.checkOverrides(sourceClassBuilders);
loader.checkAbstractMembers(sourceClassBuilders);
loader.addNoSuchMethodForwarders(sourceClassBuilders);
@@ -648,6 +656,10 @@
Class get objectClass => objectClassBuilder.cls;
+ ClassBuilder get enumClassBuilder => enumType.declaration as ClassBuilder;
+
+ Class get enumClass => enumClassBuilder.cls;
+
/// If [builder] doesn't have a constructors, install the defaults.
void installDefaultConstructor(SourceClassBuilder builder) {
assert(!builder.isMixinApplication);
@@ -976,6 +988,8 @@
nullType.bind(nullClassBuilder..isNullClass = true);
bottomType.bind(loader.coreLibrary
.lookupLocalMember("Never", required: true) as TypeDeclarationBuilder);
+ enumType.bind(loader.coreLibrary.lookupLocalMember("Enum", required: true)
+ as TypeDeclarationBuilder);
}
void computeCoreTypes() {
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 4e4540e..fb348d8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -40,6 +40,7 @@
import '../dill/dill_member_builder.dart';
import '../fasta_codes.dart';
import '../kernel/combined_member_signature.dart';
+import '../kernel/hierarchy/hierarchy_builder.dart';
import '../kernel/kernel_helper.dart';
import '../kernel/kernel_target.dart' show KernelTarget;
import '../kernel/redirecting_factory_body.dart'
@@ -621,12 +622,34 @@
}
}
- void checkSupertypes(CoreTypes coreTypes) {
+ void checkSupertypes(CoreTypes coreTypes,
+ ClassHierarchyBuilder hierarchyBuilder, Class enumClass) {
// This method determines whether the class (that's being built) its super
// class appears both in 'extends' and 'implements' clauses and whether any
// interface appears multiple times in the 'implements' clause.
// Moreover, it checks that `FutureOr` and `void` are not among the
- // supertypes.
+ // supertypes and that `Enum` is not implemented by non-abstract classes.
+
+ if (!cls.isAbstract && !cls.isEnum) {
+ bool isEnumFound = false;
+ List<Supertype> interfaces =
+ hierarchyBuilder.getNodeFromClass(cls).superclasses;
+ for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+ if (interfaces[i].classNode == enumClass) {
+ isEnumFound = true;
+ }
+ }
+ interfaces = hierarchyBuilder.getNodeFromClass(cls).interfaces;
+ for (int i = 0; !isEnumFound && i < interfaces.length; i++) {
+ if (interfaces[i].classNode == enumClass) {
+ isEnumFound = true;
+ }
+ }
+ if (isEnumFound) {
+ addProblem(templateEnumSupertypeOfNonAbstractClass.withArguments(name),
+ charOffset, noLength);
+ }
+ }
void fail(NamedTypeBuilder target, Message message,
TypeAliasBuilder? aliasBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 0b7498f..a01a8c4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -4390,9 +4390,13 @@
if (arguments.types.isEmpty) return;
Class klass;
List<DartType> receiverTypeArguments;
+ Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
if (receiverType is InterfaceType) {
klass = receiverType.classNode;
receiverTypeArguments = receiverType.typeArguments;
+ for (int i = 0; i < receiverTypeArguments.length; ++i) {
+ substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+ }
} else {
return;
}
@@ -4408,10 +4412,12 @@
hierarchy.getClassAsInstanceOf(klass, method.enclosingClass!)!;
klass = method.enclosingClass!;
receiverTypeArguments = parent.typeArguments;
- }
- Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
- for (int i = 0; i < receiverTypeArguments.length; ++i) {
- substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+ Map<TypeParameter, DartType> instanceSubstitutionMap = substitutionMap;
+ substitutionMap = <TypeParameter, DartType>{};
+ for (int i = 0; i < receiverTypeArguments.length; ++i) {
+ substitutionMap[klass.typeParameters[i]] =
+ substitute(receiverTypeArguments[i], instanceSubstitutionMap);
+ }
}
List<TypeParameter> methodParameters = method.function.typeParameters;
// The error is to be reported elsewhere.
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 9795167..e8b0af8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1713,20 +1713,12 @@
bool checkEnumSupertypeIsDenylisted(SourceClassBuilder cls) {
if (!cls.library.enableEnhancedEnumsInLibrary) {
cls.addProblem(
- templateExperimentNotEnabled.withArguments('enhanced-enums',
- cls.library.enableEnhancedEnumsVersionInLibrary.toText()),
+ templateEnumSupertypeOfNonAbstractClass.withArguments(cls.name),
cls.charOffset,
noLength);
return true;
- } else {
- if (!cls.isAbstract) {
- cls.addProblem(
- templateEnumSupertypeOfNonAbstractClass.withArguments(cls.name),
- cls.charOffset,
- noLength);
- }
- return false;
}
+ return false;
}
void checkClassSupertypes(
@@ -1925,10 +1917,11 @@
ticker.logMs("Computed core types");
}
- void checkSupertypes(List<SourceClassBuilder> sourceClasses) {
+ void checkSupertypes(
+ List<SourceClassBuilder> sourceClasses, Class enumClass) {
for (SourceClassBuilder builder in sourceClasses) {
if (builder.library.loader == this && !builder.isPatch) {
- builder.checkSupertypes(coreTypes);
+ builder.checkSupertypes(coreTypes, hierarchyBuilder, enumClass);
}
}
ticker.logMs("Checked supertypes");
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index b67f720..7ec217f 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1247,6 +1247,7 @@
spec'ed
specialization
specially
+specifications
specifics
speeding
spend
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
index 7d0f370..8889a45 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart
@@ -10,4 +10,20 @@
int get foo => index;
}
+abstract class EnumInterface implements Enum {}
+
+class EnumClass extends EnumInterface { // Error.
+ int get index => 0;
+}
+
+abstract class AbstractEnumClass extends EnumInterface {}
+
+class EnumClass2 extends AbstractEnumClass {} // Error.
+
+mixin EnumMixin on Enum {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+class EnumClass3 extends AbstractEnumClass2 {} // Error.
+
main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -59,6 +106,51 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ : super core::Object::•()
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ : super self::EnumInterface::•()
+ ;
+ get index() → core::int
+ return 0;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ : super self::EnumInterface::•()
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ : super self::AbstractEnumClass::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ : super self::AbstractEnumClass2::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic {}
constants {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
index 8e7b231..9f0c21d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.strong.transformed.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -59,6 +106,51 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ : super core::Object::•()
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ : super self::EnumInterface::•()
+ ;
+ get index() → core::int
+ return 0;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ : super self::EnumInterface::•()
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ : super self::AbstractEnumClass::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin extends core::Object implements self::EnumMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ : super self::AbstractEnumClass2::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic {}
constants {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
index 585427e..91bd71d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline.expect
@@ -6,4 +6,20 @@
int get foo => index;
}
+abstract class EnumInterface implements Enum {}
+
+class EnumClass extends EnumInterface {
+ int get index => 0;
+}
+
+abstract class AbstractEnumClass extends EnumInterface {}
+
+class EnumClass2 extends AbstractEnumClass {}
+
+mixin EnumMixin on Enum {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+class EnumClass3 extends AbstractEnumClass2 {}
+
main() {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
index 585427e..b8f73e5 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.textual_outline_modelled.expect
@@ -1,3 +1,9 @@
+abstract class AbstractEnumClass extends EnumInterface {}
+
+abstract class AbstractEnumClass2 with EnumMixin {}
+
+abstract class EnumInterface implements Enum {}
+
class A extends Enum {
int get foo => index;
}
@@ -6,4 +12,13 @@
int get foo => index;
}
+class EnumClass extends EnumInterface {
+ int get index => 0;
+}
+
+class EnumClass2 extends AbstractEnumClass {}
+
+class EnumClass3 extends AbstractEnumClass2 {}
+
main() {}
+mixin EnumMixin on Enum {}
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -59,6 +106,51 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ : super core::Object::•()
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ : super self::EnumInterface::•()
+ ;
+ get index() → core::int
+ return 0;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ : super self::EnumInterface::•()
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ : super self::AbstractEnumClass::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ : super self::AbstractEnumClass2::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic {}
constants {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
index 8e7b231..99bdbbb 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.modular.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -59,6 +106,51 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ : super core::Object::•()
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ : super self::EnumInterface::•()
+ ;
+ get index() → core::int
+ return 0;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ : super self::EnumInterface::•()
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ : super self::AbstractEnumClass::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ : super self::AbstractEnumClass2::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic {}
constants {
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
index 08bae2f..75296a2 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.outline.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -57,6 +104,45 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ ;
+ get index() → core::int
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin = core::Object with self::EnumMixin /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_name, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic
;
@@ -70,4 +156,16 @@
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
-Extra constant evaluation: evaluated: 18, effectively constant: 8
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> SymbolConstant(#_name)
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <Type*>[])
+Evaluated: ListLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> ListConstant(const <dynamic>[])
+Evaluated: MapLiteral @ org-dartlang-sdk:///sdk/lib/core/enum.dart:47:14 -> MapConstant(const <Symbol*, dynamic>{})
+Extra constant evaluation: evaluated: 45, effectively constant: 20
diff --git a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
index 8e7b231..9f0c21d 100644
--- a/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart.weak.transformed.expect
@@ -10,6 +10,18 @@
// class B implements Enum { // Error.
// ^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:15:7: Error: Non-abstract class 'EnumClass' has 'Enum' as a superinterface.
+// class EnumClass extends EnumInterface { // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: Non-abstract class 'EnumClass2' has 'Enum' as a superinterface.
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: Non-abstract class 'EnumClass3' has 'Enum' as a superinterface.
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^
+//
// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:5:7: Error: The non-abstract class 'A' is missing implementations for these members:
// - Enum.index
// Try to either
@@ -38,6 +50,41 @@
// int get index;
// ^^^^^
//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:21:7: Error: The non-abstract class 'EnumClass2' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass2 extends AbstractEnumClass {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:27:7: Error: The non-abstract class 'EnumClass3' is missing implementations for these members:
+// - Enum.index
+// Try to either
+// - provide an implementation,
+// - inherit an implementation from a superclass or mixin,
+// - mark the class as abstract, or
+// - provide a 'noSuchMethod' implementation.
+//
+// class EnumClass3 extends AbstractEnumClass2 {} // Error.
+// ^^^^^^^^^^
+// sdk/lib/core/enum.dart:22:11: Context: 'Enum.index' is defined here.
+// int get index;
+// ^^^^^
+//
+// pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart:25:16: Error: 'Object' doesn't implement 'Enum' so it can't be used with 'EnumMixin'.
+// - 'Object' is from 'dart:core'.
+// - 'Enum' is from 'dart:core'.
+// - 'EnumMixin' is from 'pkg/front_end/testcases/enhanced_enums/enum_as_supertype_error.dart'.
+// abstract class AbstractEnumClass2 with EnumMixin {}
+// ^
+//
import self as self;
import "dart:core" as core;
@@ -59,6 +106,51 @@
no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
}
+abstract class EnumInterface extends core::Object implements core::Enum {
+ synthetic constructor •() → self::EnumInterface
+ : super core::Object::•()
+ ;
+}
+class EnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::EnumClass
+ : super self::EnumInterface::•()
+ ;
+ get index() → core::int
+ return 0;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class AbstractEnumClass extends self::EnumInterface {
+ synthetic constructor •() → self::AbstractEnumClass
+ : super self::EnumInterface::•()
+ ;
+}
+class EnumClass2 extends self::AbstractEnumClass {
+ synthetic constructor •() → self::EnumClass2
+ : super self::AbstractEnumClass::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
+abstract class EnumMixin extends core::Enum /*isMixinDeclaration*/ {
+}
+abstract class _AbstractEnumClass2&Object&EnumMixin extends core::Object implements self::EnumMixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_AbstractEnumClass2&Object&EnumMixin
+ : super core::Object::•()
+ ;
+}
+abstract class AbstractEnumClass2 extends self::_AbstractEnumClass2&Object&EnumMixin {
+ synthetic constructor •() → self::AbstractEnumClass2
+ : super self::_AbstractEnumClass2&Object&EnumMixin::•()
+ ;
+}
+class EnumClass3 extends self::AbstractEnumClass2 {
+ synthetic constructor •() → self::EnumClass3
+ : super self::AbstractEnumClass2::•()
+ ;
+ no-such-method-forwarder get /* from org-dartlang-sdk:///sdk/lib/core/enum.dart */ _name() → core::String
+ return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
+}
static method main() → dynamic {}
constants {
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
index 3c3d062..42fb0ba 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.expect
@@ -2,6 +2,11 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
// - A1.extendedInterfaceMember
// Try to either
@@ -88,11 +93,6 @@
// void mixedInAndImplementedInterfaceMember() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
index 3c3d062..42fb0ba 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.modular.expect
@@ -2,6 +2,11 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
// - A1.extendedInterfaceMember
// Try to either
@@ -88,11 +93,6 @@
// void mixedInAndImplementedInterfaceMember() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
index 66c5f61..f96deda 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.outline.expect
@@ -2,6 +2,11 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
// - A1.extendedInterfaceMember
// Try to either
@@ -88,11 +93,6 @@
// void mixedInAndImplementedInterfaceMember() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect b/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
index 2c99461f9..1b21721 100644
--- a/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/hierarchy.dart.weak.transformed.expect
@@ -2,6 +2,11 @@
//
// Problems in library:
//
+// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
+// Try removing one of the occurrences.
+// class A6 extends A1 implements A1 {}
+// ^
+//
// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: The non-abstract class 'A6' is missing implementations for these members:
// - A1.extendedInterfaceMember
// Try to either
@@ -88,11 +93,6 @@
// void mixedInAndImplementedInterfaceMember() {}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/hierarchy.dart:24:7: Error: 'A1' can't be used in both 'extends' and 'implements' clauses.
-// Try removing one of the occurrences.
-// class A6 extends A1 implements A1 {}
-// ^
-//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/issue48131.dart b/pkg/front_end/testcases/general/issue48131.dart
new file mode 100644
index 0000000..cf58ea6
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {
+ new B<Object>().foo<int>();
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect
new file mode 100644
index 0000000..8eabec2
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void
+ ;
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ ;
+}
+static method main() → void
+ ;
diff --git a/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue48131.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart b/pkg/front_end/testcases/nnbd/issue48131.dart
new file mode 100644
index 0000000..cf58ea6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {
+ new B<Object>().foo<int>();
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..2e5ec26
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.textual_outline_modelled.expect
@@ -0,0 +1,7 @@
+abstract class A<X> {
+ void foo<Y extends X>() {}
+}
+
+class B<Z> extends A<Z> {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.modular.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect
new file mode 100644
index 0000000..8eabec2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.outline.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void
+ ;
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ ;
+}
+static method main() → void
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect
new file mode 100644
index 0000000..c09fc11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue48131.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<X extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+ method foo<covariant-by-class Y extends self::A::X%>() → void {}
+}
+class B<Z extends core::Object? = dynamic> extends self::A<self::B::Z%> {
+ synthetic constructor •() → self::B<self::B::Z%>
+ : super self::A::•()
+ ;
+}
+static method main() → void {
+ new self::B::•<core::Object>().{self::A::foo}<core::int>(){() → void};
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 0685477..98ecdc0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -168,9 +168,7 @@
[ $system == windows ]
cc/CorelibCompilerStats: Skip
dart/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
-dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
dart_2/disassemble_determinism_test: Slow, Pass # Times out on slower bots.
-dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579: Dart C API symbols not available.
[ $arch == ia32 && $mode == debug && $system == windows ]
dart/transferable_test: Skip # This is performance test and somehow debug win ia32 bot's performance is unpredictable
@@ -275,6 +273,11 @@
dart_2/null_safety_autodetection_in_kernel_compiler_test: SkipByDesign # Test needs to run from source
dart_2/snapshot_depfile_test: SkipByDesign # Test needs to run from source
+[ $compiler == dartkp && $system == windows ]
+dart/finalizer/weak_reference_run_gc_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/40579 Dart C API symbols not available.
+
[ $compiler == dartkp && ($arch == simarm || $arch == simarm64 || $arch == simarm64c) ]
dart/causal_stacks/async_throws_stack_lazy_non_symbolic_test: Pass, Slow
dart_2/causal_stacks/async_throws_stack_lazy_non_symbolic_test: Pass, Slow
@@ -317,11 +320,11 @@
# up with the real Dart stack trace and hence we don't get correct
# symbol names.
[ $arch == simarm || $arch == simarm64 || $arch == simarm64c ]
-cc/DartAPI_NativeFieldAccess: Skip # Test uses dart:ffi which is not supported on simulators.
-cc/DartAPI_NativeFieldAccess_Throws: Skip # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver_DoesNotResolve: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-cc/Dart_SetFfiNativeResolver_MissingResolver: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
+cc/DartAPI_NativeFieldAccess: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/DartAPI_NativeFieldAccess_Throws: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver_DoesNotResolve: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+cc/Dart_SetFfiNativeResolver_MissingResolver: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
cc/LargeMap: SkipByDesign
cc/Profiler_AllocationSampleTest: SkipByDesign
cc/Profiler_ArrayAllocation: SkipByDesign
@@ -348,20 +351,21 @@
cc/Profiler_TrivialRecordAllocation: SkipByDesign
cc/Profiler_TypedArrayAllocation: SkipByDesign
cc/Service_Profile: SkipByDesign
-dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart/isolates/thread_pool_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart/regress_41971_test: SkipByDesign # dart:ffi is not supported on simulator
+dart/finalizer/weak_reference_run_gc_test: SkipByDesign # https://dartbug.com/37299 FFI not yet supported on simulators.
+dart/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart/isolates/thread_pool_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart/regress_41971_test: SkipByDesign # https://dartbug.com/37299 dart:ffi is not supported on simulator
dart/sdk_hash_test: SkipSlow # gen_kernel is slow to run on simarm
-dart/unboxed_param_args_descriptor_test: SkipByDesign # FFI helper not supported on simulator
-dart/unboxed_param_tear_off_test: SkipByDesign # FFI helper not supported on simulator
-dart/unboxed_param_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart_2/isolates/thread_pool_test: SkipByDesign # Test uses dart:ffi which is not supported on simulators.
-dart_2/regress_41971_test: SkipByDesign # dart:ffi is not supported on simulator
+dart/unboxed_param_args_descriptor_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart/unboxed_param_tear_off_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart/unboxed_param_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/isolates/dart_api_create_lightweight_isolate_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart_2/isolates/thread_pool_test: SkipByDesign # https://dartbug.com/37299 Test uses dart:ffi which is not supported on simulators.
+dart_2/regress_41971_test: SkipByDesign # https://dartbug.com/37299 dart:ffi is not supported on simulator
dart_2/sdk_hash_test: SkipSlow # gen_kernel is slow to run on simarm
-dart_2/unboxed_param_args_descriptor_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/unboxed_param_tear_off_test: SkipByDesign # FFI helper not supported on simulator
-dart_2/unboxed_param_test: SkipByDesign # FFI helper not supported on simulator
+dart_2/unboxed_param_args_descriptor_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/unboxed_param_tear_off_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
+dart_2/unboxed_param_test: SkipByDesign # https://dartbug.com/37299 FFI helper not supported on simulator
[ $arch == simarm || $arch == simarm64 || $arch == simarm64c || $system != macos ]
dart/thread_priority_macos_test: SkipByDesign
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 88f4deb..bb7b84a 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -6,6 +6,8 @@
# Run dartanalyzer.dart on the Dart VM. This script assumes the Dart SDK's
# directory structure.
+echo "Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'." 1>&2
+
function follow_links() {
file="$1"
while [ -h "$file" ]; do
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index 57dd538..7b1e03b 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -3,6 +3,8 @@
REM for details. All rights reserved. Use of this source code is governed by a
REM BSD-style license that can be found in the LICENSE file.
+echo Warning: 'dartanalyzer' is deprecated. Please use 'dart analyze'. 1>&2
+
setlocal
rem Handle the case where dart-sdk/bin has been symlinked to.
set DIR_NAME_WITH_SLASH=%~dp0
diff --git a/tools/VERSION b/tools/VERSION
index dd07624..a6ed96c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 36
+PRERELEASE 37
PRERELEASE_PATCH 0
\ No newline at end of file