Version 2.11.0-202.0.dev
Merge commit '51c6ba0edb29098fae632aab4b595a5be8551ce1' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
index de9e6cc..03877e4 100644
--- a/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/flow_analysis/flow_analysis.dart
@@ -2938,7 +2938,7 @@
_assignedVariables._getInfoForNode(node);
++_functionNestingLevel;
_current = _current.conservativeJoin(const [], info._written);
- _stack.add(new _SimpleContext(_current));
+ _stack.add(new _FunctionExpressionContext(_current));
_current = _current.conservativeJoin(_assignedVariables._anywhere._written,
_assignedVariables._anywhere._captured);
}
@@ -2948,7 +2948,7 @@
--_functionNestingLevel;
assert(_functionNestingLevel >= 0);
_SimpleContext<Variable, Type> context =
- _stack.removeLast() as _SimpleContext<Variable, Type>;
+ _stack.removeLast() as _FunctionExpressionContext<Variable, Type>;
_current = context._previous;
}
@@ -2979,6 +2979,9 @@
@override
void ifNullExpression_end() {
+ // TODO(paulberry): CFE sometimes calls ifNullExpression_end and
+ // nullAwareAccess_end out of order, so as a workaround we cast to the
+ // common base class. See https://github.com/dart-lang/sdk/issues/43725.
_SimpleContext<Variable, Type> context =
_stack.removeLast() as _SimpleContext<Variable, Type>;
_current = _join(_current, context._previous);
@@ -2997,7 +3000,7 @@
} else {
promoted = _current;
}
- _stack.add(new _SimpleContext<Variable, Type>(promoted));
+ _stack.add(new _IfNullExpressionContext<Variable, Type>(promoted));
return true;
}
@@ -3148,6 +3151,9 @@
@override
void nullAwareAccess_end() {
+ // TODO(paulberry): CFE sometimes calls ifNullExpression_end and
+ // nullAwareAccess_end out of order, so as a workaround we cast to the
+ // common base class. See https://github.com/dart-lang/sdk/issues/43725.
_SimpleContext<Variable, Type> context =
_stack.removeLast() as _SimpleContext<Variable, Type>;
_current = _join(_current, context._previous);
@@ -3156,7 +3162,7 @@
@override
bool nullAwareAccess_rightBegin(Expression target, Type targetType) {
assert(targetType != null);
- _stack.add(new _SimpleContext<Variable, Type>(_current));
+ _stack.add(new _NullAwareAccessContext<Variable, Type>(_current));
if (target != null) {
ExpressionInfo<Variable, Type> targetInfo = _getExpressionInfo(target);
if (targetInfo is _VariableReadInfo<Variable, Type>) {
@@ -3406,6 +3412,16 @@
/// language for which flow analysis information needs to be tracked.
abstract class _FlowContext {}
+/// [_FlowContext] representing a function expression.
+class _FunctionExpressionContext<Variable, Type>
+ extends _SimpleContext<Variable, Type> {
+ _FunctionExpressionContext(FlowModel<Variable, Type> previous)
+ : super(previous);
+
+ @override
+ String toString() => '_FunctionExpressionContext(previous: $_previous)';
+}
+
/// [_FlowContext] representing an `if` statement.
class _IfContext<Variable, Type> extends _BranchContext<Variable, Type> {
/// Flow model associated with the state of program execution after the `if`
@@ -3420,6 +3436,25 @@
'_IfContext(conditionInfo: $_conditionInfo, afterThen: $_afterThen)';
}
+/// [_FlowContext] representing an "if-null" (`??`) expression.
+class _IfNullExpressionContext<Variable, Type>
+ extends _SimpleContext<Variable, Type> {
+ _IfNullExpressionContext(FlowModel<Variable, Type> previous)
+ : super(previous);
+
+ @override
+ String toString() => '_IfNullExpressionContext(previous: $_previous)';
+}
+
+/// [_FlowContext] representing a null aware access (`?.`).
+class _NullAwareAccessContext<Variable, Type>
+ extends _SimpleContext<Variable, Type> {
+ _NullAwareAccessContext(FlowModel<Variable, Type> previous) : super(previous);
+
+ @override
+ String toString() => '_NullAwareAccessContext(previous: $_previous)';
+}
+
/// [ExpressionInfo] representing a `null` literal.
class _NullInfo<Variable, Type> implements ExpressionInfo<Variable, Type> {
@override
@@ -3437,7 +3472,7 @@
/// [_FlowContext] representing a language construct for which flow analysis
/// must store a flow model state to be retrieved later, such as a `try`
/// statement, function expression, or "if-null" (`??`) expression.
-class _SimpleContext<Variable, Type> extends _FlowContext {
+abstract class _SimpleContext<Variable, Type> extends _FlowContext {
/// The stored state. For a `try` statement, this is the state from the
/// beginning of the `try` block. For a function expression, this is the
/// state at the point the function expression was created. For an "if-null"
@@ -3446,9 +3481,6 @@
final FlowModel<Variable, Type> _previous;
_SimpleContext(this._previous);
-
- @override
- String toString() => '_SimpleContext(previous: $_previous)';
}
/// [_FlowContext] representing a language construct that can be targeted by
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index df9fd1e..a7d67b8 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -687,7 +687,7 @@
templateCantInferReturnTypeDueToInconsistentOverrides =
const Template<Message Function(String name)>(
messageTemplate:
- r"""Can't infer a return type for '#name' as some of the inherited members have different types.""",
+ r"""Can't infer a return type for '#name' as some of the overridden members have different types.""",
tipTemplate: r"""Try adding an explicit type.""",
withArguments:
_withArgumentsCantInferReturnTypeDueToInconsistentOverrides);
@@ -707,7 +707,38 @@
name = demangleMixinApplicationName(name);
return new Message(codeCantInferReturnTypeDueToInconsistentOverrides,
message:
- """Can't infer a return type for '${name}' as some of the inherited members have different types.""",
+ """Can't infer a return type for '${name}' as some of the overridden members have different types.""",
+ tip: """Try adding an explicit type.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateCantInferReturnTypeDueToNoCombinedSignature =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""Can't infer a return type for '#name' as the overridden members don't have a combined signature.""",
+ tipTemplate: r"""Try adding an explicit type.""",
+ withArguments:
+ _withArgumentsCantInferReturnTypeDueToNoCombinedSignature);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeCantInferReturnTypeDueToNoCombinedSignature =
+ const Code<Message Function(String name)>(
+ "CantInferReturnTypeDueToNoCombinedSignature",
+ templateCantInferReturnTypeDueToNoCombinedSignature,
+ analyzerCodes: <String>[
+ "COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferReturnTypeDueToNoCombinedSignature(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeCantInferReturnTypeDueToNoCombinedSignature,
+ message:
+ """Can't infer a return type for '${name}' as the overridden members don't have a combined signature.""",
tip: """Try adding an explicit type.""",
arguments: {'name': name});
}
@@ -744,7 +775,7 @@
templateCantInferTypeDueToInconsistentOverrides =
const Template<Message Function(String name)>(
messageTemplate:
- r"""Can't infer a type for '#name' as some of the inherited members have different types.""",
+ r"""Can't infer a type for '#name' as some of the overridden members have different types.""",
tipTemplate: r"""Try adding an explicit type.""",
withArguments: _withArgumentsCantInferTypeDueToInconsistentOverrides);
@@ -762,7 +793,39 @@
name = demangleMixinApplicationName(name);
return new Message(codeCantInferTypeDueToInconsistentOverrides,
message:
- """Can't infer a type for '${name}' as some of the inherited members have different types.""",
+ """Can't infer a type for '${name}' as some of the overridden members have different types.""",
+ tip: """Try adding an explicit type.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateCantInferTypeDueToNoCombinedSignature = const Template<
+ Message Function(String name)>(
+ messageTemplate:
+ r"""Can't infer a type for '#name' as the overridden members don't have a combined signature.""",
+ tipTemplate: r"""Try adding an explicit type.""",
+ withArguments: _withArgumentsCantInferTypeDueToNoCombinedSignature);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeCantInferTypeDueToNoCombinedSignature =
+ const Code<Message Function(String name)>(
+ "CantInferTypeDueToNoCombinedSignature",
+ templateCantInferTypeDueToNoCombinedSignature,
+ analyzerCodes: <String>[
+ "COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE"
+ ]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsCantInferTypeDueToNoCombinedSignature(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeCantInferTypeDueToNoCombinedSignature,
+ message:
+ """Can't infer a type for '${name}' as the overridden members don't have a combined signature.""",
tip: """Try adding an explicit type.""",
arguments: {'name': name});
}
@@ -1909,14 +1972,14 @@
message: r"""This is the inherited member.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeDeclaredMemberConflictsWithInheritedMembersCause =
- messageDeclaredMemberConflictsWithInheritedMembersCause;
+const Code<Null> codeDeclaredMemberConflictsWithOverriddenMembersCause =
+ messageDeclaredMemberConflictsWithOverriddenMembersCause;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageDeclaredMemberConflictsWithInheritedMembersCause =
- const MessageCode("DeclaredMemberConflictsWithInheritedMembersCause",
+const MessageCode messageDeclaredMemberConflictsWithOverriddenMembersCause =
+ const MessageCode("DeclaredMemberConflictsWithOverriddenMembersCause",
severity: Severity.context,
- message: r"""This is one of the inherited members.""");
+ message: r"""This is one of the overridden members.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeDefaultListConstructorError =
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart
new file mode 100644
index 0000000..31091b0
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/mixed_if_null_and_null_aware.dart
@@ -0,0 +1,8 @@
+// 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.
+
+// This test verifies that we don't crash when trying to analyze an expression
+// that combines if-null with null-aware access.
+
+f(int? i, List? l) => i ?? l?.length;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 81255f6..858f235 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -462,11 +462,11 @@
element.isFinal = node.isFinal;
element.parameterKind = node.kind;
_setCodeRange(element, node);
- element.metadata = _createElementAnnotations(node.metadata);
}
nameNode.staticElement = element;
}
+ element.metadata = _createElementAnnotations(node.metadata);
node.metadata.accept(this);
_setElementAnnotations(node.metadata, element.metadata);
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 5f397fd..a116216 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -326,6 +326,17 @@
''');
}
+ test_localFunction_defaultFieldFormalParameter_metadata() async {
+ await _assertCanBeAnalyzed(r'''
+const my = 0;
+
+void foo() {
+ // ignore:unused_element
+ void bar({@my this.x}) {}
+}
+''');
+ }
+
test_typeBeforeAnnotation() async {
await _assertCanBeAnalyzed('''
class A {
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 429d5f1..9fa3c80 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -232,6 +232,8 @@
Set<ClassMember> _overrideDependencies;
void registerOverrideDependency(ClassMember overriddenMember) {
+ assert(overriddenMember.classBuilder != classBuilder,
+ "Unexpected override dependency for $this: $overriddenMember");
_overrideDependencies ??= {};
_overrideDependencies.add(overriddenMember);
}
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index d91935f..f8700b1 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -4,28 +4,47 @@
library fasta.never_type_builder;
-import 'package:kernel/ast.dart' show DartType, Nullability;
+import 'package:kernel/ast.dart' show DartType, InterfaceType, Nullability;
import 'builtin_type_declaration_builder.dart';
+import 'class_builder.dart';
import 'library_builder.dart';
import 'nullability_builder.dart';
import 'type_builder.dart';
class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
- NeverTypeDeclarationBuilder(
- DartType type, LibraryBuilder compilationUnit, int charOffset)
- : super("Never", type, compilationUnit, charOffset);
+ final LibraryBuilder coreLibrary;
+ DartType _nullType;
+
+ NeverTypeDeclarationBuilder(DartType type, this.coreLibrary, int charOffset)
+ : super("Never", type, coreLibrary, charOffset) {
+ assert(coreLibrary.importUri == Uri.parse('dart:core'));
+ }
String get debugName => "NeverTypeDeclarationBuilder";
+ DartType get nullType {
+ if (_nullType == null) {
+ ClassBuilder nullClass = coreLibrary.lookupLocalMember('Null');
+ _nullType = new InterfaceType(nullClass.cls, Nullability.nullable, []);
+ }
+ return _nullType;
+ }
+
DartType buildType(LibraryBuilder library,
NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
[bool notInstanceContext]) {
+ if (!library.isNonNullableByDefault) {
+ return nullType;
+ }
return type.withDeclaredNullability(nullabilityBuilder.build(library));
}
DartType buildTypesWithBuiltArguments(LibraryBuilder library,
Nullability nullability, List<DartType> arguments) {
+ if (!library.isNonNullableByDefault) {
+ return nullType;
+ }
return type.withDeclaredNullability(nullability);
}
}
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 b42e61e..0fd06ec 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -250,6 +250,8 @@
Set<ClassMember> _overrideDependencies;
void registerOverrideDependency(ClassMember overriddenMember) {
+ assert(overriddenMember.classBuilder != classBuilder,
+ "Unexpected override dependency for $this: $overriddenMember");
_overrideDependencies ??= {};
_overrideDependencies.add(overriddenMember);
}
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 43778fe..a4af6df 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
@@ -43,14 +43,16 @@
Message,
messageDeclaredMemberConflictsWithInheritedMember,
messageDeclaredMemberConflictsWithInheritedMemberCause,
- messageDeclaredMemberConflictsWithInheritedMembersCause,
+ messageDeclaredMemberConflictsWithOverriddenMembersCause,
messageInheritedMembersConflict,
messageInheritedMembersConflictCause1,
messageInheritedMembersConflictCause2,
messageStaticAndInstanceConflict,
messageStaticAndInstanceConflictCause,
templateCantInferReturnTypeDueToInconsistentOverrides,
+ templateCantInferReturnTypeDueToNoCombinedSignature,
templateCantInferTypeDueToInconsistentOverrides,
+ templateCantInferTypeDueToNoCombinedSignature,
templateCombinedMemberSignatureFailed,
templateDuplicatedDeclaration,
templateDuplicatedDeclarationCause,
@@ -680,165 +682,163 @@
DartType inferredReturnType;
Map<FormalParameterBuilder, DartType> inferredParameterTypes = {};
- for (ClassMember classMember
- in toSet(declaredMember.classBuilder, overriddenMembers)) {
- Member overriddenMember = classMember.getMember(hierarchy);
- Substitution classSubstitution;
- if (classBuilder.cls != overriddenMember.enclosingClass) {
- assert(
- substitutions.containsKey(overriddenMember.enclosingClass),
- "No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${overriddenMember.enclosingClass.name}'. "
- "Substitutions available for: ${substitutions.keys}");
- classSubstitution = substitutions[overriddenMember.enclosingClass];
- debug?.log("${classBuilder.fullNameForErrors} -> "
- "${overriddenMember.enclosingClass.name} $classSubstitution");
- }
- if (overriddenMember is! Procedure) {
- debug?.log("Giving up 1");
- continue;
- }
- Procedure overriddenProcedure = overriddenMember;
- FunctionNode overriddenFunction = overriddenProcedure.function;
-
- List<TypeParameter> overriddenTypeParameters =
- overriddenFunction.typeParameters;
- int typeParameterCount = declaredTypeParameters.length;
- if (typeParameterCount != overriddenTypeParameters.length) {
- debug?.log("Giving up 2");
- continue;
- }
- Substitution methodSubstitution;
- if (typeParameterCount != 0) {
- List<DartType> types = new List<DartType>(typeParameterCount);
- for (int i = 0; i < typeParameterCount; i++) {
- types[i] = new TypeParameterType.forAlphaRenaming(
- overriddenTypeParameters[i], declaredTypeParameters[i]);
- }
- methodSubstitution =
- Substitution.fromPairs(overriddenTypeParameters, types);
- for (int i = 0; i < typeParameterCount; i++) {
- DartType declaredBound = declaredTypeParameters[i].bound;
- DartType overriddenBound = methodSubstitution
- .substituteType(overriddenTypeParameters[i].bound);
- if (!hierarchy.types
- .performNullabilityAwareMutualSubtypesCheck(
- declaredBound, overriddenBound)
- .isSubtypeWhenUsingNullabilities()) {
- debug?.log("Giving up 3");
- continue;
- }
- }
- }
-
- DartType inheritedReturnType = overriddenFunction.returnType;
- if (classSubstitution != null) {
- inheritedReturnType =
- classSubstitution.substituteType(inheritedReturnType);
- }
- if (methodSubstitution != null) {
- inheritedReturnType =
- methodSubstitution.substituteType(inheritedReturnType);
- }
- if (declaredMember.returnType == null &&
- inferredReturnType is! InvalidType) {
- inferredReturnType = mergeTypeInLibrary(
- hierarchy, classBuilder, inferredReturnType, inheritedReturnType);
- if (inferredReturnType == null) {
- // A different type has already been inferred.
+ Set<ClassMember> overriddenMemberSet =
+ toSet(declaredMember.classBuilder, overriddenMembers);
+ if (classBuilder.library.isNonNullableByDefault) {
+ CombinedMemberSignature combinedMemberSignature =
+ new CombinedMemberSignature(
+ hierarchy, classBuilder, overriddenMemberSet.toList(),
+ forSetter: false);
+ FunctionType combinedMemberSignatureType = combinedMemberSignature
+ .getCombinedSignatureTypeInContext(declaredTypeParameters);
+ if (declaredMember.returnType == null) {
+ if (combinedMemberSignatureType == null) {
inferredReturnType = const InvalidType();
reportCantInferReturnType(
classBuilder, declaredMember, hierarchy, overriddenMembers);
+ } else {
+ inferredReturnType = combinedMemberSignatureType.returnType;
}
}
- if (declaredFunction.requiredParameterCount >
- overriddenFunction.requiredParameterCount) {
- debug?.log("Giving up 4");
- continue;
- }
- List<VariableDeclaration> overriddenPositional =
- overriddenFunction.positionalParameters;
- if (declaredPositional.length < overriddenPositional.length) {
- debug?.log("Giving up 5");
- continue;
- }
-
- for (int i = 0; i < overriddenPositional.length; i++) {
- FormalParameterBuilder declaredParameter = declaredMember.formals[i];
- if (declaredParameter.type != null) continue;
-
- VariableDeclaration overriddenParameter = overriddenPositional[i];
- DartType inheritedParameterType = overriddenParameter.type;
- if (classSubstitution != null) {
- inheritedParameterType =
- classSubstitution.substituteType(inheritedParameterType);
- }
- if (methodSubstitution != null) {
- inheritedParameterType =
- methodSubstitution.substituteType(inheritedParameterType);
- }
- if (hierarchy.coreTypes.objectClass.enclosingLibrary
- .isNonNullableByDefault &&
- !declaredMember.classBuilder.library.isNonNullableByDefault &&
- overriddenProcedure == hierarchy.coreTypes.objectEquals) {
- // In legacy code we special case `Object.==` to infer `dynamic`
- // instead `Object!`.
- inheritedParameterType = const DynamicType();
- }
- DartType inferredParameterType =
- inferredParameterTypes[declaredParameter];
- inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
- inferredParameterType, inheritedParameterType);
- if (inferredParameterType == null) {
- // A different type has already been inferred.
- inferredParameterType = const InvalidType();
- reportCantInferParameterType(
- classBuilder, declaredParameter, hierarchy, overriddenMembers);
- }
- inferredParameterTypes[declaredParameter] = inferredParameterType;
- }
-
- List<VariableDeclaration> overriddenNamed =
- overriddenFunction.namedParameters;
- named:
- if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
- if (declaredPositional.length != overriddenPositional.length) {
- debug?.log("Giving up 9");
- break named;
- }
- if (declaredFunction.requiredParameterCount !=
- overriddenFunction.requiredParameterCount) {
- debug?.log("Giving up 10");
- break named;
- }
-
- overriddenNamed = overriddenNamed.toList()
- ..sort(compareNamedParameters);
- int declaredIndex = 0;
- for (int overriddenIndex = 0;
- overriddenIndex < overriddenNamed.length;
- overriddenIndex++) {
- String name = overriddenNamed[overriddenIndex].name;
- for (; declaredIndex < declaredNamed.length; declaredIndex++) {
- if (declaredNamed[declaredIndex].name == name) break;
+ if (declaredMember.formals != null) {
+ for (int i = 0; i < declaredPositional.length; i++) {
+ FormalParameterBuilder declaredParameter =
+ declaredMember.formals[i];
+ if (declaredParameter.type != null) {
+ continue;
}
- if (declaredIndex == declaredNamed.length) {
- debug?.log("Giving up 11");
- break named;
+
+ DartType inferredParameterType;
+ if (combinedMemberSignatureType == null) {
+ inferredParameterType = const InvalidType();
+ reportCantInferParameterType(classBuilder, declaredParameter,
+ hierarchy, overriddenMembers);
+ } else if (i <
+ combinedMemberSignatureType.positionalParameters.length) {
+ inferredParameterType =
+ combinedMemberSignatureType.positionalParameters[i];
}
- FormalParameterBuilder declaredParameter;
- for (int i = declaredPositional.length;
- i < declaredMember.formals.length;
- ++i) {
- if (declaredMember.formals[i].name == name) {
- declaredParameter = declaredMember.formals[i];
- break;
+ inferredParameterTypes[declaredParameter] = inferredParameterType;
+ }
+
+ Map<String, DartType> namedParameterTypes;
+ for (int i = declaredPositional.length;
+ i < declaredMember.formals.length;
+ i++) {
+ FormalParameterBuilder declaredParameter =
+ declaredMember.formals[i];
+ if (declaredParameter.type != null) {
+ continue;
+ }
+
+ DartType inferredParameterType;
+ if (combinedMemberSignatureType == null) {
+ inferredParameterType = const InvalidType();
+ reportCantInferParameterType(classBuilder, declaredParameter,
+ hierarchy, overriddenMembers);
+ } else {
+ if (namedParameterTypes == null) {
+ namedParameterTypes = {};
+ for (NamedType namedType
+ in combinedMemberSignatureType.namedParameters) {
+ namedParameterTypes[namedType.name] = namedType.type;
+ }
+ }
+ inferredParameterType =
+ namedParameterTypes[declaredParameter.name];
+ }
+ inferredParameterTypes[declaredParameter] = inferredParameterType;
+ }
+ }
+ } else {
+ for (ClassMember classMember in overriddenMemberSet) {
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution classSubstitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
+ assert(
+ substitutions.containsKey(overriddenMember.enclosingClass),
+ "No substitution found for '${classBuilder.fullNameForErrors}' "
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ classSubstitution = substitutions[overriddenMember.enclosingClass];
+ debug?.log("${classBuilder.fullNameForErrors} -> "
+ "${overriddenMember.enclosingClass.name} $classSubstitution");
+ }
+ if (overriddenMember is! Procedure) {
+ debug?.log("Giving up 1");
+ continue;
+ }
+ Procedure overriddenProcedure = overriddenMember;
+ FunctionNode overriddenFunction = overriddenProcedure.function;
+
+ List<TypeParameter> overriddenTypeParameters =
+ overriddenFunction.typeParameters;
+ int typeParameterCount = declaredTypeParameters.length;
+ if (typeParameterCount != overriddenTypeParameters.length) {
+ debug?.log("Giving up 2");
+ continue;
+ }
+ Substitution methodSubstitution;
+ if (typeParameterCount != 0) {
+ List<DartType> types = new List<DartType>(typeParameterCount);
+ for (int i = 0; i < typeParameterCount; i++) {
+ types[i] = new TypeParameterType.forAlphaRenaming(
+ overriddenTypeParameters[i], declaredTypeParameters[i]);
+ }
+ methodSubstitution =
+ Substitution.fromPairs(overriddenTypeParameters, types);
+ for (int i = 0; i < typeParameterCount; i++) {
+ DartType declaredBound = declaredTypeParameters[i].bound;
+ DartType overriddenBound = methodSubstitution
+ .substituteType(overriddenTypeParameters[i].bound);
+ if (!hierarchy.types
+ .performNullabilityAwareMutualSubtypesCheck(
+ declaredBound, overriddenBound)
+ .isSubtypeWhenUsingNullabilities()) {
+ debug?.log("Giving up 3");
+ continue;
}
}
- if (declaredParameter.type != null) continue;
- VariableDeclaration overriddenParameter =
- overriddenNamed[overriddenIndex];
+ }
+ DartType inheritedReturnType = overriddenFunction.returnType;
+ if (classSubstitution != null) {
+ inheritedReturnType =
+ classSubstitution.substituteType(inheritedReturnType);
+ }
+ if (methodSubstitution != null) {
+ inheritedReturnType =
+ methodSubstitution.substituteType(inheritedReturnType);
+ }
+ if (declaredMember.returnType == null &&
+ inferredReturnType is! InvalidType) {
+ inferredReturnType = mergeTypeInLibrary(hierarchy, classBuilder,
+ inferredReturnType, inheritedReturnType);
+ if (inferredReturnType == null) {
+ // A different type has already been inferred.
+ inferredReturnType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, overriddenMembers);
+ }
+ }
+ if (declaredFunction.requiredParameterCount >
+ overriddenFunction.requiredParameterCount) {
+ debug?.log("Giving up 4");
+ continue;
+ }
+ List<VariableDeclaration> overriddenPositional =
+ overriddenFunction.positionalParameters;
+ if (declaredPositional.length < overriddenPositional.length) {
+ debug?.log("Giving up 5");
+ continue;
+ }
+
+ for (int i = 0; i < overriddenPositional.length; i++) {
+ FormalParameterBuilder declaredParameter =
+ declaredMember.formals[i];
+ if (declaredParameter.type != null) continue;
+
+ VariableDeclaration overriddenParameter = overriddenPositional[i];
DartType inheritedParameterType = overriddenParameter.type;
if (classSubstitution != null) {
inheritedParameterType =
@@ -848,6 +848,14 @@
inheritedParameterType =
methodSubstitution.substituteType(inheritedParameterType);
}
+ if (hierarchy.coreTypes.objectClass.enclosingLibrary
+ .isNonNullableByDefault &&
+ !declaredMember.classBuilder.library.isNonNullableByDefault &&
+ overriddenProcedure == hierarchy.coreTypes.objectEquals) {
+ // In legacy code we special case `Object.==` to infer `dynamic`
+ // instead `Object!`.
+ inheritedParameterType = const DynamicType();
+ }
DartType inferredParameterType =
inferredParameterTypes[declaredParameter];
inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
@@ -860,6 +868,70 @@
}
inferredParameterTypes[declaredParameter] = inferredParameterType;
}
+
+ List<VariableDeclaration> overriddenNamed =
+ overriddenFunction.namedParameters;
+ named:
+ if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
+ if (declaredPositional.length != overriddenPositional.length) {
+ debug?.log("Giving up 9");
+ break named;
+ }
+ if (declaredFunction.requiredParameterCount !=
+ overriddenFunction.requiredParameterCount) {
+ debug?.log("Giving up 10");
+ break named;
+ }
+
+ overriddenNamed = overriddenNamed.toList()
+ ..sort(compareNamedParameters);
+ int declaredIndex = 0;
+ for (int overriddenIndex = 0;
+ overriddenIndex < overriddenNamed.length;
+ overriddenIndex++) {
+ String name = overriddenNamed[overriddenIndex].name;
+ for (; declaredIndex < declaredNamed.length; declaredIndex++) {
+ if (declaredNamed[declaredIndex].name == name) break;
+ }
+ if (declaredIndex == declaredNamed.length) {
+ debug?.log("Giving up 11");
+ break named;
+ }
+ FormalParameterBuilder declaredParameter;
+ for (int i = declaredPositional.length;
+ i < declaredMember.formals.length;
+ ++i) {
+ if (declaredMember.formals[i].name == name) {
+ declaredParameter = declaredMember.formals[i];
+ break;
+ }
+ }
+ if (declaredParameter.type != null) continue;
+ VariableDeclaration overriddenParameter =
+ overriddenNamed[overriddenIndex];
+
+ DartType inheritedParameterType = overriddenParameter.type;
+ if (classSubstitution != null) {
+ inheritedParameterType =
+ classSubstitution.substituteType(inheritedParameterType);
+ }
+ if (methodSubstitution != null) {
+ inheritedParameterType =
+ methodSubstitution.substituteType(inheritedParameterType);
+ }
+ DartType inferredParameterType =
+ inferredParameterTypes[declaredParameter];
+ inferredParameterType = mergeTypeInLibrary(hierarchy,
+ classBuilder, inferredParameterType, inheritedParameterType);
+ if (inferredParameterType == null) {
+ // A different type has already been inferred.
+ inferredParameterType = const InvalidType();
+ reportCantInferParameterType(classBuilder, declaredParameter,
+ hierarchy, overriddenMembers);
+ }
+ inferredParameterTypes[declaredParameter] = inferredParameterType;
+ }
+ }
}
}
if (declaredMember.returnType == null) {
@@ -1016,69 +1088,115 @@
if (declaredMember.classBuilder == classBuilder &&
declaredMember.returnType == null) {
DartType inferredType;
-
- void inferFrom(ClassMember classMember) {
- if (inferredType is InvalidType) return;
-
- Member overriddenMember = classMember.getMember(hierarchy);
- Substitution substitution;
- if (classBuilder.cls != overriddenMember.enclosingClass) {
- assert(
- substitutions.containsKey(overriddenMember.enclosingClass),
- "No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${overriddenMember.enclosingClass.name}'. "
- "Substitutions available for: ${substitutions.keys}");
- substitution = substitutions[overriddenMember.enclosingClass];
- }
- DartType inheritedType;
- if (overriddenMember is Field) {
- inheritedType = overriddenMember.type;
- assert(inheritedType is! ImplicitFieldType);
- } else if (overriddenMember is Procedure) {
- if (overriddenMember.kind == ProcedureKind.Setter) {
- VariableDeclaration bParameter =
- overriddenMember.function.positionalParameters.single;
- inheritedType = bParameter.type;
- } else if (overriddenMember.kind == ProcedureKind.Getter) {
- inheritedType = overriddenMember.function.returnType;
- } else {
- debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
- return;
- }
- } else {
- debug?.log(
- "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
- return;
- }
- if (substitution != null) {
- inheritedType = substitution.substituteType(inheritedType);
- }
- inferredType = mergeTypeInLibrary(
- hierarchy, classBuilder, inferredType, inheritedType);
-
- if (inferredType == null) {
- // A different type has already been inferred.
- inferredType = const InvalidType();
- reportCantInferReturnType(
- classBuilder, declaredMember, hierarchy, overriddenMembers);
- }
- }
-
overriddenMembers = toSet(classBuilder, overriddenMembers);
- // The getter type must be inferred from getters first.
- for (ClassMember overriddenMember in overriddenMembers) {
- if (!overriddenMember.forSetter) {
- inferFrom(overriddenMember);
- }
- }
- if (inferredType == null) {
- // The getter type must be inferred from setters if no type was
- // inferred from getters.
+ if (classBuilder.library.isNonNullableByDefault) {
+ List<ClassMember> overriddenGetters = [];
+ List<ClassMember> overriddenSetters = [];
for (ClassMember overriddenMember in overriddenMembers) {
if (overriddenMember.forSetter) {
+ overriddenSetters.add(overriddenMember);
+ } else {
+ overriddenGetters.add(overriddenMember);
+ }
+ }
+
+ void inferFrom(List<ClassMember> members, {bool forSetter}) {
+ assert(forSetter != null);
+ CombinedMemberSignature combinedMemberSignature =
+ new CombinedMemberSignature(hierarchy, classBuilder, members,
+ forSetter: forSetter);
+ DartType combinedMemberSignatureType =
+ combinedMemberSignature.combinedMemberSignatureType;
+ if (combinedMemberSignatureType == null) {
+ inferredType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, members);
+ } else {
+ inferredType = combinedMemberSignatureType;
+ }
+ }
+
+ if (overriddenGetters.isNotEmpty) {
+ // 1) The return type of a getter, parameter type of a setter or type
+ // of a field which overrides/implements only one or more getters is
+ // inferred to be the return type of the combined member signature of
+ // said getter in the direct superinterfaces.
+
+ // 2) The return type of a getter which overrides/implements both a
+ // setter and a getter is inferred to be the return type of the
+ // combined member signature of said getter in the direct
+ // superinterfaces.
+ inferFrom(overriddenGetters, forSetter: false);
+ } else {
+ // The return type of a getter, parameter type of a setter or type of
+ // a field which overrides/implements only one or more setters is
+ // inferred to be the parameter type of the combined member signature
+ // of said setter in the direct superinterfaces.
+ inferFrom(overriddenSetters, forSetter: true);
+ }
+ } else {
+ void inferFrom(ClassMember classMember) {
+ if (inferredType is InvalidType) return;
+
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
+ assert(
+ substitutions.containsKey(overriddenMember.enclosingClass),
+ "No substitution found for '${classBuilder.fullNameForErrors}' "
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ substitution = substitutions[overriddenMember.enclosingClass];
+ }
+ DartType inheritedType;
+ if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
+ assert(inheritedType is! ImplicitFieldType);
+ } else if (overriddenMember is Procedure) {
+ if (overriddenMember.kind == ProcedureKind.Setter) {
+ VariableDeclaration bParameter =
+ overriddenMember.function.positionalParameters.single;
+ inheritedType = bParameter.type;
+ } else if (overriddenMember.kind == ProcedureKind.Getter) {
+ inheritedType = overriddenMember.function.returnType;
+ } else {
+ debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+ return;
+ }
+ } else {
+ debug?.log("Giving up (not field/procedure: "
+ "${overriddenMember.runtimeType})");
+ return;
+ }
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
+ }
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
+
+ if (inferredType == null) {
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, overriddenMembers);
+ }
+ }
+
+ // The getter type must be inferred from getters first.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (!overriddenMember.forSetter) {
inferFrom(overriddenMember);
}
}
+ if (inferredType == null) {
+ // The getter type must be inferred from setters if no type was
+ // inferred from getters.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ }
}
inferredType ??= const DynamicType();
@@ -1097,67 +1215,114 @@
if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
DartType inferredType;
- void inferFrom(ClassMember classMember) {
- if (inferredType is InvalidType) return;
-
- Member overriddenMember = classMember.getMember(hierarchy);
- Substitution substitution;
- if (classBuilder.cls != overriddenMember.enclosingClass) {
- assert(
- substitutions.containsKey(overriddenMember.enclosingClass),
- "No substitution found for '${classBuilder.fullNameForErrors}' "
- "as instance of '${overriddenMember.enclosingClass.name}'. "
- "Substitutions available for: ${substitutions.keys}");
- substitution = substitutions[overriddenMember.enclosingClass];
- }
- DartType inheritedType;
- if (overriddenMember is Field) {
- inheritedType = overriddenMember.type;
- assert(inheritedType is! ImplicitFieldType);
- } else if (overriddenMember is Procedure) {
- if (classMember.isSetter) {
- VariableDeclaration bParameter =
- overriddenMember.function.positionalParameters.single;
- inheritedType = bParameter.type;
- } else if (classMember.isGetter) {
- inheritedType = overriddenMember.function.returnType;
+ overriddenMembers = toSet(classBuilder, overriddenMembers);
+ if (classBuilder.library.isNonNullableByDefault) {
+ List<ClassMember> overriddenGetters = [];
+ List<ClassMember> overriddenSetters = [];
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ overriddenSetters.add(overriddenMember);
} else {
- debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+ overriddenGetters.add(overriddenMember);
+ }
+ }
+
+ void inferFrom(List<ClassMember> members, {bool forSetter}) {
+ assert(forSetter != null);
+ CombinedMemberSignature combinedMemberSignature =
+ new CombinedMemberSignature(hierarchy, classBuilder, members,
+ forSetter: forSetter);
+ DartType combinedMemberSignatureType =
+ combinedMemberSignature.combinedMemberSignatureType;
+ if (combinedMemberSignatureType == null) {
+ inferredType = const InvalidType();
+ reportCantInferReturnType(
+ classBuilder, declaredMember, hierarchy, members);
+ } else {
+ inferredType = combinedMemberSignatureType;
+ }
+ }
+
+ if (overriddenSetters.isNotEmpty) {
+ // 1) The return type of a getter, parameter type of a setter or type
+ // of a field which overrides/implements only one or more setters is
+ // inferred to be the parameter type of the combined member signature
+ // of said setter in the direct superinterfaces.
+ //
+ // 2) The parameter type of a setter which overrides/implements both a
+ // setter and a getter is inferred to be the parameter type of the
+ // combined member signature of said setter in the direct
+ // superinterfaces.
+ inferFrom(overriddenSetters, forSetter: true);
+ } else {
+ // The return type of a getter, parameter type of a setter or type of
+ // a field which overrides/implements only one or more getters is
+ // inferred to be the return type of the combined member signature of
+ // said getter in the direct superinterfaces.
+ inferFrom(overriddenGetters, forSetter: false);
+ }
+ } else {
+ void inferFrom(ClassMember classMember) {
+ if (inferredType is InvalidType) return;
+
+ Member overriddenMember = classMember.getMember(hierarchy);
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
+ assert(
+ substitutions.containsKey(overriddenMember.enclosingClass),
+ "No substitution found for '${classBuilder.fullNameForErrors}' "
+ "as instance of '${overriddenMember.enclosingClass.name}'. "
+ "Substitutions available for: ${substitutions.keys}");
+ substitution = substitutions[overriddenMember.enclosingClass];
+ }
+ DartType inheritedType;
+ if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
+ assert(inheritedType is! ImplicitFieldType);
+ } else if (overriddenMember is Procedure) {
+ if (classMember.isSetter) {
+ VariableDeclaration bParameter =
+ overriddenMember.function.positionalParameters.single;
+ inheritedType = bParameter.type;
+ } else if (classMember.isGetter) {
+ inheritedType = overriddenMember.function.returnType;
+ } else {
+ debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+ return;
+ }
+ } else {
+ debug?.log("Giving up (not field/procedure: "
+ "${overriddenMember.runtimeType})");
return;
}
- } else {
- debug?.log(
- "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
- return;
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
+ }
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
+ if (inferredType == null) {
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferParameterType(
+ classBuilder, parameter, hierarchy, overriddenMembers);
+ }
}
- if (substitution != null) {
- inheritedType = substitution.substituteType(inheritedType);
- }
- inferredType = mergeTypeInLibrary(
- hierarchy, classBuilder, inferredType, inheritedType);
- if (inferredType == null) {
- // A different type has already been inferred.
- inferredType = const InvalidType();
- reportCantInferParameterType(
- classBuilder, parameter, hierarchy, overriddenMembers);
- }
- }
- overriddenMembers = toSet(classBuilder, overriddenMembers);
- // The setter type must be inferred from setters first.
- for (ClassMember overriddenMember in overriddenMembers) {
- if (overriddenMember.forSetter) {
- inferFrom(overriddenMember);
- }
- }
- if (inferredType == null) {
- // The setter type must be inferred from getters if no type was
- // inferred from setters.
+ // The setter type must be inferred from setters first.
for (ClassMember overriddenMember in overriddenMembers) {
- if (!overriddenMember.forSetter) {
+ if (overriddenMember.forSetter) {
inferFrom(overriddenMember);
}
}
+ if (inferredType == null) {
+ // The setter type must be inferred from getters if no type was
+ // inferred from setters.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (!overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ }
}
inferredType ??= const DynamicType();
@@ -1214,72 +1379,137 @@
fieldBuilder.type == null) {
DartType inferredType;
- void inferFrom(ClassMember classMember) {
- if (inferredType is InvalidType) return;
-
- Member overriddenMember = classMember.getMember(hierarchy);
- DartType inheritedType;
- if (overriddenMember is Procedure) {
- if (overriddenMember.isSetter) {
- VariableDeclaration parameter =
- overriddenMember.function.positionalParameters.single;
- inheritedType = parameter.type;
- } else if (overriddenMember.isGetter) {
- inheritedType = overriddenMember.function.returnType;
+ overriddenMembers = toSet(classBuilder, overriddenMembers);
+ if (classBuilder.library.isNonNullableByDefault) {
+ List<ClassMember> overriddenGetters = [];
+ List<ClassMember> overriddenSetters = [];
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ overriddenSetters.add(overriddenMember);
+ } else {
+ overriddenGetters.add(overriddenMember);
}
- } else if (overriddenMember is Field) {
- inheritedType = overriddenMember.type;
}
- if (inheritedType == null) {
- debug
- ?.log("Giving up (inheritedType == null)\n${StackTrace.current}");
- return;
+
+ DartType inferFrom(List<ClassMember> members, {bool forSetter}) {
+ assert(forSetter != null);
+ CombinedMemberSignature combinedMemberSignature =
+ new CombinedMemberSignature(hierarchy, classBuilder, members,
+ forSetter: forSetter);
+ return combinedMemberSignature.combinedMemberSignatureType;
}
- Substitution substitution;
- if (classBuilder.cls != overriddenMember.enclosingClass) {
- assert(
- substitutions.containsKey(overriddenMember.enclosingClass),
- "${classBuilder.fullNameForErrors} "
- "${overriddenMember.enclosingClass.name}");
- substitution = substitutions[overriddenMember.enclosingClass];
- debug?.log("${classBuilder.fullNameForErrors} -> "
- "${overriddenMember.enclosingClass.name} $substitution");
+
+ DartType combinedMemberSignatureType;
+ if (fieldBuilder.isAssignable &&
+ overriddenGetters.isNotEmpty &&
+ overriddenSetters.isNotEmpty) {
+ // The type of a non-final field which overrides/implements both a
+ // setter and a getter is inferred to be the parameter type of the
+ // combined member signature of said setter in the direct
+ // superinterfaces, if this type is the same as the return type of the
+ // combined member signature of said getter in the direct
+ // superinterfaces. If the types are not the same then inference fails
+ // with an error.
+ DartType getterType = inferFrom(overriddenGetters, forSetter: false);
+ DartType setterType = inferFrom(overriddenSetters, forSetter: true);
+ if (getterType == setterType) {
+ combinedMemberSignatureType = getterType;
+ }
+ } else if (overriddenGetters.isNotEmpty) {
+ // 1) The return type of a getter, parameter type of a setter or type
+ // of a field which overrides/implements only one or more getters is
+ // inferred to be the return type of the combined member signature of
+ // said getter in the direct superinterfaces.
+ //
+ // 2) The type of a final field which overrides/implements both a
+ // setter and a getter is inferred to be the return type of the
+ // combined member signature of said getter in the direct
+ // superinterfaces.
+ combinedMemberSignatureType =
+ inferFrom(overriddenGetters, forSetter: false);
+ } else {
+ // The return type of a getter, parameter type of a setter or type of
+ // a field which overrides/implements only one or more setters is
+ // inferred to be the parameter type of the combined member signature
+ // of said setter in the direct superinterfaces.
+ combinedMemberSignatureType =
+ inferFrom(overriddenSetters, forSetter: true);
}
- assert(inheritedType is! ImplicitFieldType);
- if (substitution != null) {
- inheritedType = substitution.substituteType(inheritedType);
- }
- inferredType = mergeTypeInLibrary(
- hierarchy, classBuilder, inferredType, inheritedType);
- if (inferredType == null) {
- // A different type has already been inferred.
+
+ if (combinedMemberSignatureType == null) {
inferredType = const InvalidType();
reportCantInferFieldType(
classBuilder, fieldBuilder, overriddenMembers);
- }
- }
-
- overriddenMembers = toSet(classBuilder, overriddenMembers);
- if (fieldBuilder.isAssignable) {
- // The field type must be inferred from both getters and setters.
- for (ClassMember overriddenMember in overriddenMembers) {
- inferFrom(overriddenMember);
+ } else {
+ inferredType = combinedMemberSignatureType;
}
} else {
- // The field type must be inferred from getters first.
- for (ClassMember overriddenMember in overriddenMembers) {
- if (!overriddenMember.forSetter) {
- inferFrom(overriddenMember);
+ void inferFrom(ClassMember classMember) {
+ if (inferredType is InvalidType) return;
+
+ Member overriddenMember = classMember.getMember(hierarchy);
+ DartType inheritedType;
+ if (overriddenMember is Procedure) {
+ if (overriddenMember.isSetter) {
+ VariableDeclaration parameter =
+ overriddenMember.function.positionalParameters.single;
+ inheritedType = parameter.type;
+ } else if (overriddenMember.isGetter) {
+ inheritedType = overriddenMember.function.returnType;
+ }
+ } else if (overriddenMember is Field) {
+ inheritedType = overriddenMember.type;
+ }
+ if (inheritedType == null) {
+ debug?.log(
+ "Giving up (inheritedType == null)\n${StackTrace.current}");
+ return;
+ }
+ Substitution substitution;
+ if (classBuilder.cls != overriddenMember.enclosingClass) {
+ assert(
+ substitutions.containsKey(overriddenMember.enclosingClass),
+ "${classBuilder.fullNameForErrors} "
+ "${overriddenMember.enclosingClass.name}");
+ substitution = substitutions[overriddenMember.enclosingClass];
+ debug?.log("${classBuilder.fullNameForErrors} -> "
+ "${overriddenMember.enclosingClass.name} $substitution");
+ }
+ assert(inheritedType is! ImplicitFieldType);
+ if (substitution != null) {
+ inheritedType = substitution.substituteType(inheritedType);
+ }
+ inferredType = mergeTypeInLibrary(
+ hierarchy, classBuilder, inferredType, inheritedType);
+ if (inferredType == null) {
+ // A different type has already been inferred.
+ inferredType = const InvalidType();
+ reportCantInferFieldType(
+ classBuilder, fieldBuilder, overriddenMembers);
}
}
- if (inferredType == null) {
- // The field type must be inferred from setters if no type was
- // inferred from getters.
+
+ if (fieldBuilder.isAssignable) {
+ // The field type must be inferred from both getters and setters.
for (ClassMember overriddenMember in overriddenMembers) {
- if (overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ } else {
+ // The field type must be inferred from getters first.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (!overriddenMember.forSetter) {
inferFrom(overriddenMember);
}
}
+ if (inferredType == null) {
+ // The field type must be inferred from setters if no type was
+ // inferred from getters.
+ for (ClassMember overriddenMember in overriddenMembers) {
+ if (overriddenMember.forSetter) {
+ inferFrom(overriddenMember);
+ }
+ }
+ }
}
}
@@ -1720,10 +1950,18 @@
void registerOverrideDependency(
ClassMember member, ClassMember overriddenMember) {
if (classBuilder == member.classBuilder && member.isSourceDeclaration) {
- Set<ClassMember> dependencies =
- overrideDependencies[member] ??= <ClassMember>{};
- dependencies.add(overriddenMember);
- member.registerOverrideDependency(overriddenMember);
+ 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);
+ }
}
}
@@ -1973,6 +2211,14 @@
void checkMemberVsSetter(
ClassMember member, ClassMember overriddenMember) {
+ if (overriddenMember.classBuilder == classBuilder &&
+ overriddenMember.hasDeclarations) {
+ for (ClassMember declaration in overriddenMember.declarations) {
+ checkMemberVsSetter(member, declaration);
+ }
+ return;
+ }
+
if (classBuilder is! SourceClassBuilder) return;
if (overriddenMember.isStatic) return;
if (member == overriddenMember) return;
@@ -2961,46 +3207,6 @@
isImplicitlyAbstract == other.isImplicitlyAbstract;
}
- DartType computeMemberType(
- ClassHierarchyBuilder hierarchy, DartType thisType, Member member) {
- DartType type;
- if (member is Procedure) {
- if (member.isGetter) {
- type = member.getterType;
- } else if (member.isSetter) {
- type = member.setterType;
- } else {
- type = member.function
- .computeFunctionType(member.enclosingLibrary.nonNullable);
- }
- } else if (member is Field) {
- type = member.type;
- } else {
- unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
- classBuilder.fileUri);
- }
- InterfaceType instance = hierarchy.getTypeAsInstanceOf(
- thisType,
- member.enclosingClass,
- classBuilder.library.library,
- hierarchy.coreTypes);
- assert(
- instance != null,
- "No instance of $thisType as ${member.enclosingClass} found for "
- "$member.");
- return Substitution.fromInterfaceType(instance).substituteType(type);
- }
-
- bool isMoreSpecific(ClassHierarchyBuilder hierarchy, DartType a, DartType b) {
- if (isSetter) {
- return hierarchy.types
- .isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
- } else {
- return hierarchy.types
- .isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
- }
- }
-
@override
Member getMember(ClassHierarchyBuilder hierarchy) {
if (combinedMemberSignatureResult != null) {
@@ -3010,89 +3216,16 @@
return combinedMemberSignatureResult =
declarations.first.getMember(hierarchy);
}
- ClassMember bestSoFar;
- int bestSoFarIndex;
- Map<DartType, int> mutualSubtypes;
- if (declarations.length == 1) {
- bestSoFar = declarations[0];
- bestSoFarIndex = 0;
- } else {
- DartType thisType = hierarchy.coreTypes.thisInterfaceType(
- classBuilder.cls, classBuilder.library.nonNullable);
- bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
- DartType bestTypeSoFar;
- List<DartType> candidateTypes = new List<DartType>(declarations.length);
- for (int candidateIndex = declarations.length - 1;
- candidateIndex >= 0;
- candidateIndex--) {
- ClassMember candidate = declarations[candidateIndex];
- Member target = candidate.getMember(hierarchy);
- assert(target != null,
- "No member computed for ${candidate} (${candidate.runtimeType})");
- DartType candidateType = computeMemberType(hierarchy, thisType, target);
- if (!isNonNullableByDefault) {
- candidateType = legacyErasure(hierarchy.coreTypes, candidateType);
- }
- candidateTypes[candidateIndex] = candidateType;
- if (bestSoFar == null) {
- bestSoFar = candidate;
- bestTypeSoFar = candidateType;
- bestSoFarIndex = candidateIndex;
- } else {
- if (isMoreSpecific(hierarchy, candidateType, bestTypeSoFar)) {
- debug?.log("Combined Member Signature: ${candidate.fullName} "
- "${candidateType} <: ${bestSoFar.fullName} ${bestTypeSoFar}");
- if (isNonNullableByDefault &&
- isMoreSpecific(hierarchy, bestTypeSoFar, candidateType)) {
- if (mutualSubtypes == null) {
- mutualSubtypes = {
- bestTypeSoFar: bestSoFarIndex,
- candidateType: candidateIndex
- };
- } else {
- mutualSubtypes[candidateType] = candidateIndex;
- }
- } else {
- mutualSubtypes = null;
- }
- bestSoFarIndex = candidateIndex;
- bestSoFar = candidate;
- bestTypeSoFar = candidateType;
- } else {
- debug?.log("Combined Member Signature: "
- "${candidate.fullName} !<: ${bestSoFar.fullName}");
- }
- }
- }
- if (bestSoFar != null) {
- debug?.log("Combined Member Signature bestSoFar: "
- "${bestSoFar.fullName}");
- for (int candidateIndex = 0;
- candidateIndex < declarations.length;
- candidateIndex++) {
- ClassMember candidate = declarations[candidateIndex];
- DartType candidateType = candidateTypes[candidateIndex];
- if (!isMoreSpecific(hierarchy, bestTypeSoFar, candidateType)) {
- debug?.log("Combined Member Signature: "
- "${bestSoFar.fullName} !<: ${candidate.fullName}");
+ CombinedMemberSignature combinedMemberSignature =
+ new CombinedMemberSignature(hierarchy, classBuilder, declarations,
+ forSetter: isSetter);
- if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
- bestSoFar = null;
- bestTypeSoFar = null;
- mutualSubtypes = null;
- }
- break;
- }
- }
- }
- }
-
- if (bestSoFar == null) {
+ if (combinedMemberSignature.canonicalClassMember == null) {
String name = classBuilder.fullNameForErrors;
int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
List<LocatedMessage> context = declarations.map((ClassMember d) {
- return messageDeclaredMemberConflictsWithInheritedMembersCause
+ return messageDeclaredMemberConflictsWithOverriddenMembersCause
.withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
}).toList();
@@ -3109,12 +3242,13 @@
declarations.first.getMember(hierarchy);
}
debug?.log("Combined Member Signature of ${fullNameForErrors}: "
- "${bestSoFar.fullName}");
+ "${combinedMemberSignature.canonicalClassMember.fullName}");
if (modifyKernel) {
ProcedureKind kind = ProcedureKind.Method;
- Member bestMemberSoFar = bestSoFar.getMember(hierarchy);
- if (bestSoFar.isProperty) {
+ Member bestMemberSoFar =
+ combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
+ if (combinedMemberSignature.canonicalClassMember.isProperty) {
kind = isSetter ? ProcedureKind.Setter : ProcedureKind.Getter;
} else if (bestMemberSoFar is Procedure &&
bestMemberSoFar.kind == ProcedureKind.Operator) {
@@ -3122,20 +3256,16 @@
}
debug?.log("Combined Member Signature of ${fullNameForErrors}: new "
- "ForwardingNode($classBuilder, $bestSoFar, $declarations, $kind)");
- Member stub = new ForwardingNode(
- hierarchy,
- classBuilder,
- bestSoFar,
- bestSoFarIndex,
- declarations,
- kind,
- mutualSubtypes?.values?.toSet())
- .finalize();
+ "ForwardingNode($classBuilder, "
+ "${combinedMemberSignature.canonicalClassMember}, "
+ "$declarations, $kind)");
+ Member stub =
+ new ForwardingNode(combinedMemberSignature, kind).finalize();
if (classBuilder.cls == stub.enclosingClass) {
classBuilder.cls.addMember(stub);
SourceLibraryBuilder library = classBuilder.library;
- Member bestMemberSoFar = bestSoFar.getMember(hierarchy);
+ Member bestMemberSoFar =
+ combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
if (bestMemberSoFar is Procedure) {
library.forwardersOrigins..add(stub)..add(bestMemberSoFar);
}
@@ -3147,7 +3277,8 @@
debug?.log(
"Combined Member Signature of ${fullNameForErrors}: picked bestSoFar");
- return combinedMemberSignatureResult = bestSoFar.getMember(hierarchy);
+ return combinedMemberSignatureResult =
+ combinedMemberSignature.canonicalClassMember.getMember(hierarchy);
}
@override
@@ -3246,8 +3377,10 @@
if (modifyKernel) {
// This call will add a body to the abstract method if needed for
// isGenericCovariantImpl checks.
- new ForwardingNode(hierarchy, classBuilder, abstractMember, 1,
- declarations, kind, null)
+ new ForwardingNode(
+ new CombinedMemberSignature.internal(
+ hierarchy, classBuilder, 1, declarations),
+ kind)
.finalize();
}
}
@@ -3326,7 +3459,7 @@
String name = parameter.name;
List<LocatedMessage> context = overriddenMembers
.map((ClassMember overriddenMember) {
- return messageDeclaredMemberConflictsWithInheritedMembersCause
+ return messageDeclaredMemberConflictsWithOverriddenMembersCause
.withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
overriddenMember.fullNameForErrors.length);
})
@@ -3335,7 +3468,9 @@
.toSet()
.toList();
cls.addProblem(
- templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
+ cls.library.isNonNullableByDefault
+ ? templateCantInferTypeDueToNoCombinedSignature.withArguments(name)
+ : templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
parameter.charOffset,
name.length,
wasHandled: true,
@@ -3347,7 +3482,7 @@
String name = member.fullNameForErrors;
List<LocatedMessage> context = overriddenMembers
.map((ClassMember overriddenMember) {
- return messageDeclaredMemberConflictsWithInheritedMembersCause
+ return messageDeclaredMemberConflictsWithOverriddenMembersCause
.withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
overriddenMember.fullNameForErrors.length);
})
@@ -3403,7 +3538,11 @@
// }
// }
cls.addProblem(
- templateCantInferReturnTypeDueToInconsistentOverrides.withArguments(name),
+ cls.library.isNonNullableByDefault
+ ? templateCantInferReturnTypeDueToNoCombinedSignature
+ .withArguments(name)
+ : templateCantInferReturnTypeDueToInconsistentOverrides
+ .withArguments(name),
member.charOffset,
name.length,
wasHandled: true,
@@ -3414,7 +3553,7 @@
Iterable<ClassMember> overriddenMembers) {
List<LocatedMessage> context = overriddenMembers
.map((ClassMember overriddenMember) {
- return messageDeclaredMemberConflictsWithInheritedMembersCause
+ return messageDeclaredMemberConflictsWithOverriddenMembersCause
.withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
overriddenMember.fullNameForErrors.length);
})
@@ -3424,7 +3563,9 @@
.toList();
String name = member.fullNameForErrors;
cls.addProblem(
- templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
+ cls.library.isNonNullableByDefault
+ ? templateCantInferTypeDueToNoCombinedSignature.withArguments(name)
+ : templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
member.charOffset,
name.length,
wasHandled: true,
@@ -3469,3 +3610,300 @@
}
}
}
+
+/// Class used for computing and inspecting the combined member signature for
+/// a set of overridden/inherited members.
+class CombinedMemberSignature {
+ /// The class hierarchy builder used for building this class.
+ final ClassHierarchyBuilder hierarchy;
+
+ /// The target class for the combined member signature.
+ ///
+ /// The [_memberTypes] are computed in terms of each member is inherited into
+ /// [classBuilder].
+ ///
+ /// [classBuilder] is also used for determining whether the combined member
+ /// signature should be computed using nnbd or legacy semantics.
+ final SourceClassBuilder classBuilder;
+
+ /// The list of the members inherited into or overridden in [classBuilder].
+ final List<ClassMember> members;
+
+ /// The index within [members] for the member whose type is the most specific
+ /// among [members]. If `null`, the combined member signature is not defined
+ /// for [members] in [classBuilder].
+ ///
+ /// For the legacy computation, the type of this member defines the combined
+ /// member signature.
+ ///
+ /// For the nnbd computation, this is one of the members whose type define
+ /// the combined member signature, and the indices of the remaining members
+ /// are stored in [_mutualSubtypes].
+ int _canonicalMemberIndex;
+
+ /// For the nnbd computation, this maps each distinct but most specific member
+ /// type to the index of one of the [members] with that type.
+ ///
+ /// If there is only one most specific member type, this is `null`.
+ Map<DartType, int> _mutualSubtypes;
+
+ /// Cache for the types of [members] as inherited into [classBuilder].
+ List<DartType> _memberTypes;
+
+ /// Cache for the this type of [classBuilder].
+ DartType _thisType;
+
+ /// If `true` the combined member signature type has been computed.
+ ///
+ /// Note that the combined member signature type might be undefined in which
+ /// case [_combinedMemberSignatureType] is `null`.
+ bool _isCombinedMemberSignatureTypeComputed = false;
+
+ /// Cache the computed combined member signature type.
+ ///
+ /// If the combined member signature type is undefined this is set to `null`.
+ DartType _combinedMemberSignatureType;
+
+ /// Creates a [CombinedMemberSignature] whose canonical member is already
+ /// defined.
+ CombinedMemberSignature.internal(this.hierarchy, this.classBuilder,
+ this._canonicalMemberIndex, this.members);
+
+ /// Creates a [CombinedMemberSignature] for [members] inherited into
+ /// [classBuilder].
+ ///
+ /// If [forSetter] is `true`, contravariance of the setter types is used to
+ /// compute the most specific member type. Otherwise covariance of the getter
+ /// types or function types is used.
+ CombinedMemberSignature(this.hierarchy, this.classBuilder, this.members,
+ {bool forSetter}) {
+ assert(forSetter != null);
+ ClassMember bestSoFar;
+ int bestSoFarIndex;
+ if (members.length == 1) {
+ bestSoFar = members.first;
+ bestSoFarIndex = 0;
+ } else {
+ bool isNonNullableByDefault = classBuilder.library.isNonNullableByDefault;
+
+ DartType bestTypeSoFar;
+ for (int candidateIndex = members.length - 1;
+ candidateIndex >= 0;
+ candidateIndex--) {
+ ClassMember candidate = members[candidateIndex];
+ DartType candidateType = getMemberType(candidateIndex);
+ if (bestSoFar == null) {
+ bestSoFar = candidate;
+ bestTypeSoFar = candidateType;
+ bestSoFarIndex = candidateIndex;
+ } else {
+ if (_isMoreSpecific(candidateType, bestTypeSoFar, forSetter)) {
+ if (isNonNullableByDefault &&
+ _isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+ if (_mutualSubtypes == null) {
+ _mutualSubtypes = {
+ bestTypeSoFar: bestSoFarIndex,
+ candidateType: candidateIndex
+ };
+ } else {
+ _mutualSubtypes[candidateType] = candidateIndex;
+ }
+ } else {
+ _mutualSubtypes = null;
+ }
+ bestSoFarIndex = candidateIndex;
+ bestSoFar = candidate;
+ bestTypeSoFar = candidateType;
+ }
+ }
+ }
+ if (bestSoFar != null) {
+ for (int candidateIndex = 0;
+ candidateIndex < members.length;
+ candidateIndex++) {
+ DartType candidateType = getMemberType(candidateIndex);
+ if (!_isMoreSpecific(bestTypeSoFar, candidateType, forSetter)) {
+ if (!shouldOverrideProblemBeOverlooked(classBuilder)) {
+ bestSoFar = null;
+ bestSoFarIndex = null;
+ bestTypeSoFar = null;
+ _mutualSubtypes = null;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ _canonicalMemberIndex = bestSoFarIndex;
+ }
+
+ /// The member within [members] type is the most specific among [members].
+ /// If `null`, the combined member signature is not defined for [members] in
+ /// [classBuilder].
+ ///
+ /// For the legacy computation, the type of this member defines the combined
+ /// member signature.
+ ///
+ /// For the nnbd computation, this is one of the members whose type define
+ /// the combined member signature, and the indices of the all members whose
+ /// type define the combined member signature are in [mutualSubtypeIndices].
+ ClassMember get canonicalClassMember =>
+ _canonicalMemberIndex != null ? members[_canonicalMemberIndex] : null;
+
+ /// The index within [members] for the member whose type is the most specific
+ /// among [members]. If `null`, the combined member signature is not defined
+ /// for [members] in [classBuilder].
+ ///
+ /// For the legacy computation, the type of this member defines the combined
+ /// member signature.
+ ///
+ /// For the nnbd computation, this is one of the members whose type define
+ /// the combined member signature, and the indices of the all members whose
+ /// type define the combined member signature are in [mutualSubtypeIndices].
+ int get classMemberIndex => _canonicalMemberIndex;
+
+ /// For the nnbd computation, the indices of the [members] with most specific
+ /// member type.
+ ///
+ /// If there is only one most specific member type, this is `null`.
+ Set<int> get mutualSubtypeIndices => _mutualSubtypes?.values?.toSet();
+
+ /// The this type of [classBuilder].
+ DartType get thisType {
+ return _thisType ??= hierarchy.coreTypes
+ .thisInterfaceType(classBuilder.cls, classBuilder.library.nonNullable);
+ }
+
+ /// Returns type of the [index]th member in [members] as inherited in
+ /// [classBuilder].
+ DartType getMemberType(int index) {
+ _memberTypes ??= new List<DartType>(members.length);
+ DartType candidateType = _memberTypes[index];
+ if (candidateType == null) {
+ ClassMember candidate = members[index];
+ Member target = candidate.getMember(hierarchy);
+ assert(target != null,
+ "No member computed for ${candidate} (${candidate.runtimeType})");
+ candidateType = _computeMemberType(thisType, target);
+ if (!classBuilder.library.isNonNullableByDefault) {
+ candidateType = legacyErasure(hierarchy.coreTypes, candidateType);
+ }
+ _memberTypes[index] = candidateType;
+ }
+ return candidateType;
+ }
+
+ /// Returns the type of the combined member signature, if defined.
+ DartType get combinedMemberSignatureType {
+ if (!_isCombinedMemberSignatureTypeComputed) {
+ _isCombinedMemberSignatureTypeComputed = true;
+ if (_canonicalMemberIndex == null) {
+ return null;
+ }
+ if (classBuilder.library.isNonNullableByDefault) {
+ _combinedMemberSignatureType = getMemberType(_canonicalMemberIndex);
+ if (_mutualSubtypes != null) {
+ _combinedMemberSignatureType =
+ norm(hierarchy.coreTypes, _combinedMemberSignatureType);
+ for (int index in _mutualSubtypes.values) {
+ if (_canonicalMemberIndex != index) {
+ _combinedMemberSignatureType = nnbdTopMerge(
+ hierarchy.coreTypes,
+ _combinedMemberSignatureType,
+ norm(hierarchy.coreTypes, getMemberType(index)));
+ }
+ }
+ }
+ } else {
+ _combinedMemberSignatureType = legacyErasure(
+ hierarchy.coreTypes, getMemberType(_canonicalMemberIndex));
+ }
+ }
+ return _combinedMemberSignatureType;
+ }
+
+ /// Returns the type of the combined member signature, if defined, with
+ /// all method type parameters substituted with [typeParameters].
+ ///
+ /// This is used for inferring types on a declared member from the type of the
+ /// combined member signature.
+ DartType getCombinedSignatureTypeInContext(
+ List<TypeParameter> typeParameters) {
+ DartType type = combinedMemberSignatureType;
+ if (type == null) {
+ return null;
+ }
+ int typeParameterCount = typeParameters.length;
+ if (type is FunctionType) {
+ List<TypeParameter> signatureTypeParameters = type.typeParameters;
+ if (typeParameterCount != signatureTypeParameters.length) {
+ return null;
+ }
+ if (typeParameterCount == 0) {
+ return type;
+ }
+ List<DartType> types = new List<DartType>(typeParameterCount);
+ for (int i = 0; i < typeParameterCount; i++) {
+ types[i] = new TypeParameterType.forAlphaRenaming(
+ signatureTypeParameters[i], typeParameters[i]);
+ }
+ Substitution substitution =
+ Substitution.fromPairs(signatureTypeParameters, types);
+ for (int i = 0; i < typeParameterCount; i++) {
+ DartType typeParameterBound = typeParameters[i].bound;
+ DartType signatureTypeParameterBound =
+ substitution.substituteType(signatureTypeParameters[i].bound);
+ if (!hierarchy.types
+ .performNullabilityAwareMutualSubtypesCheck(
+ typeParameterBound, signatureTypeParameterBound)
+ .isSubtypeWhenUsingNullabilities()) {
+ return null;
+ }
+ }
+ return substitution.substituteType(type.withoutTypeParameters);
+ } else if (typeParameterCount != 0) {
+ return null;
+ }
+ return type;
+ }
+
+ DartType _computeMemberType(DartType thisType, Member member) {
+ DartType type;
+ if (member is Procedure) {
+ if (member.isGetter) {
+ type = member.getterType;
+ } else if (member.isSetter) {
+ type = member.setterType;
+ } else {
+ type = member.function
+ .computeFunctionType(member.enclosingLibrary.nonNullable);
+ }
+ } else if (member is Field) {
+ type = member.type;
+ } else {
+ unhandled("${member.runtimeType}", "$member", classBuilder.charOffset,
+ classBuilder.fileUri);
+ }
+ InterfaceType instance = hierarchy.getTypeAsInstanceOf(
+ thisType,
+ member.enclosingClass,
+ classBuilder.library.library,
+ hierarchy.coreTypes);
+ assert(
+ instance != null,
+ "No instance of $thisType as ${member.enclosingClass} found for "
+ "$member.");
+ return Substitution.fromInterfaceType(instance).substituteType(type);
+ }
+
+ bool _isMoreSpecific(DartType a, DartType b, bool forSetter) {
+ if (forSetter) {
+ return hierarchy.types
+ .isSubtypeOf(b, a, SubtypeCheckMode.withNullabilities);
+ } else {
+ return hierarchy.types
+ .isSubtypeOf(a, b, SubtypeCheckMode.withNullabilities);
+ }
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
index 9daa3e6..08a6f34 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -50,33 +50,31 @@
import 'class_hierarchy_builder.dart';
class ForwardingNode {
- final ClassHierarchyBuilder hierarchy;
+ ClassHierarchyBuilder get hierarchy => _combinedMemberSignature.hierarchy;
- final SourceClassBuilder classBuilder;
+ SourceClassBuilder get classBuilder => _combinedMemberSignature.classBuilder;
- final ClassMember combinedMemberSignatureResult;
+ // TODO(johnniwinther): Use [_combinedMemberSignature] more directly in
+ // the forwarding node computation.
+ final CombinedMemberSignature _combinedMemberSignature;
+
+ ClassMember get combinedMemberSignatureResult =>
+ _combinedMemberSignature.canonicalClassMember;
/// The index of [combinedMemberSignatureResult] in [_candidates].
- final int _combinedMemberIndex;
+ int get _combinedMemberIndex => _combinedMemberSignature.classMemberIndex;
final ProcedureKind kind;
/// A list containing the directly implemented and directly inherited
/// procedures of the class in question.
- final List<ClassMember> _candidates;
+ List<ClassMember> get _candidates => _combinedMemberSignature.members;
/// The indices of the [_candidates] whose types need to be merged to compute
/// the resulting member type.
- final Set<int> _mergeIndices;
+ Set<int> get _mergeIndices => _combinedMemberSignature.mutualSubtypeIndices;
- ForwardingNode(
- this.hierarchy,
- this.classBuilder,
- this.combinedMemberSignatureResult,
- this._combinedMemberIndex,
- this._candidates,
- this.kind,
- this._mergeIndices);
+ ForwardingNode(this._combinedMemberSignature, this.kind);
Name get name => combinedMemberSignatureResult.name;
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 c58a522..0899ab4 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
@@ -492,61 +492,8 @@
}
void checkTypesInOutline(TypeEnvironment typeEnvironment) {
- SourceLibraryBuilder libraryBuilder = this.library;
- Library library = libraryBuilder.library;
- final DartType bottomType = library.isNonNullableByDefault
- ? const NeverType(Nullability.nonNullable)
- : typeEnvironment.nullType;
-
- // Check in bounds of own type variables.
- for (TypeParameter parameter in cls.typeParameters) {
- Set<TypeArgumentIssue> issues = {};
- issues.addAll(findTypeArgumentIssues(
- library,
- parameter.bound,
- typeEnvironment,
- SubtypeCheckMode.ignoringNullabilities,
- bottomType,
- allowSuperBounded: true) ??
- const []);
- if (library.isNonNullableByDefault) {
- issues.addAll(findTypeArgumentIssues(library, parameter.bound,
- typeEnvironment, SubtypeCheckMode.withNullabilities, bottomType,
- allowSuperBounded: true) ??
- const []);
- }
- for (TypeArgumentIssue issue in issues) {
- DartType argument = issue.argument;
- TypeParameter typeParameter = issue.typeParameter;
- if (libraryBuilder.inferredTypes.contains(argument)) {
- // Inference in type expressions in the supertypes boils down to
- // instantiate-to-bound which shouldn't produce anything that breaks
- // the bounds after the non-simplicity checks are done. So, any
- // violation here is the result of non-simple bounds, and the error
- // is reported elsewhere.
- continue;
- }
-
- if (argument is FunctionType && argument.typeParameters.length > 0) {
- libraryBuilder.reportTypeArgumentIssue(
- messageGenericFunctionTypeUsedAsActualTypeArgument,
- fileUri,
- parameter.fileOffset,
- null);
- } else {
- libraryBuilder.reportTypeArgumentIssue(
- templateIncorrectTypeArgument.withArguments(
- argument,
- typeParameter.bound,
- typeParameter.name,
- getGenericTypeName(issue.enclosingType),
- library.isNonNullableByDefault),
- fileUri,
- parameter.fileOffset,
- typeParameter);
- }
- }
- }
+ library.checkBoundsInTypeParameters(
+ typeEnvironment, cls.typeParameters, fileUri);
// Check in supers.
if (cls.supertype != null) {
@@ -561,62 +508,37 @@
}
}
- // Check in members.
- for (Procedure procedure in cls.procedures) {
- checkVarianceInFunction(procedure, typeEnvironment, cls.typeParameters);
- libraryBuilder.checkBoundsInFunctionNode(
- procedure.function, typeEnvironment, fileUri);
- }
- for (Constructor constructor in cls.constructors) {
- libraryBuilder.checkBoundsInFunctionNode(
- constructor.function, typeEnvironment, fileUri);
- }
- for (RedirectingFactoryConstructor redirecting
- in cls.redirectingFactoryConstructors) {
- libraryBuilder.checkBoundsInFunctionNodeParts(
- typeEnvironment, fileUri, redirecting.fileOffset,
- typeParameters: redirecting.typeParameters,
- positionalParameters: redirecting.positionalParameters,
- namedParameters: redirecting.namedParameters);
- }
-
forEach((String name, Builder builder) {
- // Check fields.
if (builder is SourceFieldBuilder) {
+ // Check fields.
checkVarianceInField(builder, typeEnvironment, cls.typeParameters);
- libraryBuilder.checkTypesInField(builder, typeEnvironment);
- }
-
- // Check initializers.
- if (builder is FunctionBuilder &&
- !(builder.isAbstract || builder.isExternal) &&
- builder.formals != null) {
- libraryBuilder.checkInitializersInFormals(
- builder.formals, typeEnvironment);
+ library.checkTypesInField(builder, typeEnvironment);
+ } else if (builder is ProcedureBuilder) {
+ // Check procedures
+ checkVarianceInFunction(
+ builder.procedure, typeEnvironment, cls.typeParameters);
+ library.checkTypesInProcedureBuilder(builder, typeEnvironment);
+ } else {
+ assert(builder is DillMemberBuilder && builder.name == redirectingName,
+ "Unexpected member: $builder.");
}
});
- constructors.local.forEach((String name, MemberBuilder builder) {
+ forEachConstructor((String name, MemberBuilder builder) {
if (builder is ConstructorBuilder) {
- if (!builder.isExternal && builder.formals != null) {
- libraryBuilder.checkInitializersInFormals(
- builder.formals, typeEnvironment);
- }
+ library.checkTypesInConstructorBuilder(builder, typeEnvironment);
} else if (builder is RedirectingFactoryBuilder) {
- // Default values are not required on redirecting factory constructors.
+ library.checkTypesInRedirectingFactoryBuilder(builder, typeEnvironment);
} else if (builder is ProcedureBuilder) {
assert(builder.isFactory, "Unexpected constructor $builder.");
- if (!builder.isExternal && builder.formals != null) {
- libraryBuilder.checkInitializersInFormals(
- builder.formals, typeEnvironment);
- }
+ library.checkTypesInProcedureBuilder(builder, typeEnvironment);
} else {
assert(
// This is a synthesized constructor.
builder is DillMemberBuilder && builder.member is Constructor,
- "Unexpected constructor $builder.");
+ "Unexpected constructor: $builder.");
}
- });
+ }, includeInjectedConstructors: true);
}
void addSyntheticConstructor(SyntheticConstructorBuilder constructorBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 6792c0d..b8d7b3d 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -5,15 +5,18 @@
import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
+import 'package:kernel/type_environment.dart';
import '../../base/common.dart';
import '../builder/builder.dart';
import '../builder/class_builder.dart';
import '../builder/extension_builder.dart';
+import '../builder/field_builder.dart';
import '../builder/library_builder.dart';
import '../builder/member_builder.dart';
import '../builder/metadata_builder.dart';
+import '../builder/procedure_builder.dart';
import '../builder/type_builder.dart';
import '../builder/type_variable_builder.dart';
@@ -61,6 +64,9 @@
typeParameters, onType);
@override
+ SourceLibraryBuilder get library => super.library;
+
+ @override
SourceExtensionBuilder get origin => _origin ?? this;
Extension get extension => isPatch ? origin._extension : _extension;
@@ -231,4 +237,27 @@
});
return count;
}
+
+ void checkTypesInOutline(TypeEnvironment typeEnvironment) {
+ library.checkBoundsInTypeParameters(
+ typeEnvironment, extension.typeParameters, fileUri);
+
+ // Check on clause.
+ if (_extension.onType != null) {
+ library.checkBoundsInType(_extension.onType, typeEnvironment,
+ onType.fileUri, onType.charOffset);
+ }
+
+ forEach((String name, Builder builder) {
+ if (builder is SourceFieldBuilder) {
+ // Check fields.
+ library.checkTypesInField(builder, typeEnvironment);
+ } else if (builder is ProcedureBuilder) {
+ // Check procedures
+ library.checkTypesInProcedureBuilder(builder, typeEnvironment);
+ } else {
+ assert(false, "Unexpected member: $builder.");
+ }
+ });
+ }
}
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 f7492b8..d142b10 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
@@ -3191,6 +3191,63 @@
}
}
+ void checkBoundsInTypeParameters(TypeEnvironment typeEnvironment,
+ List<TypeParameter> typeParameters, Uri fileUri) {
+ final DartType bottomType = library.isNonNullableByDefault
+ ? const NeverType(Nullability.nonNullable)
+ : typeEnvironment.nullType;
+
+ // Check in bounds of own type variables.
+ for (TypeParameter parameter in typeParameters) {
+ Set<TypeArgumentIssue> issues = {};
+ issues.addAll(findTypeArgumentIssues(
+ library,
+ parameter.bound,
+ typeEnvironment,
+ SubtypeCheckMode.ignoringNullabilities,
+ bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ if (library.isNonNullableByDefault) {
+ issues.addAll(findTypeArgumentIssues(library, parameter.bound,
+ typeEnvironment, SubtypeCheckMode.withNullabilities, bottomType,
+ allowSuperBounded: true) ??
+ const []);
+ }
+ for (TypeArgumentIssue issue in issues) {
+ DartType argument = issue.argument;
+ TypeParameter typeParameter = issue.typeParameter;
+ if (inferredTypes.contains(argument)) {
+ // Inference in type expressions in the supertypes boils down to
+ // instantiate-to-bound which shouldn't produce anything that breaks
+ // the bounds after the non-simplicity checks are done. So, any
+ // violation here is the result of non-simple bounds, and the error
+ // is reported elsewhere.
+ continue;
+ }
+
+ if (argument is FunctionType && argument.typeParameters.length > 0) {
+ reportTypeArgumentIssue(
+ messageGenericFunctionTypeUsedAsActualTypeArgument,
+ fileUri,
+ parameter.fileOffset,
+ null);
+ } else {
+ reportTypeArgumentIssue(
+ templateIncorrectTypeArgument.withArguments(
+ argument,
+ typeParameter.bound,
+ typeParameter.name,
+ getGenericTypeName(issue.enclosingType),
+ library.isNonNullableByDefault),
+ fileUri,
+ parameter.fileOffset,
+ typeParameter);
+ }
+ }
+ }
+ }
+
void checkBoundsInFunctionNodeParts(
TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
{List<TypeParameter> typeParameters,
@@ -3265,6 +3322,34 @@
}
}
+ void checkTypesInProcedureBuilder(
+ ProcedureBuilder procedureBuilder, TypeEnvironment typeEnvironment) {
+ checkBoundsInFunctionNode(procedureBuilder.procedure.function,
+ typeEnvironment, procedureBuilder.fileUri);
+ if (procedureBuilder.formals != null &&
+ !(procedureBuilder.isAbstract || procedureBuilder.isExternal)) {
+ checkInitializersInFormals(procedureBuilder.formals, typeEnvironment);
+ }
+ }
+
+ void checkTypesInConstructorBuilder(
+ ConstructorBuilder constructorBuilder, TypeEnvironment typeEnvironment) {
+ checkBoundsInFunctionNode(
+ constructorBuilder.constructor.function, typeEnvironment, fileUri);
+ if (!constructorBuilder.isExternal && constructorBuilder.formals != null) {
+ checkInitializersInFormals(constructorBuilder.formals, typeEnvironment);
+ }
+ }
+
+ void checkTypesInRedirectingFactoryBuilder(
+ RedirectingFactoryBuilder redirectingFactoryBuilder,
+ TypeEnvironment typeEnvironment) {
+ checkBoundsInFunctionNode(redirectingFactoryBuilder.procedure.function,
+ typeEnvironment, redirectingFactoryBuilder.fileUri);
+ // Default values are not required on redirecting factory constructors so
+ // we don't call [checkInitializersInFormals].
+ }
+
void checkBoundsInFunctionNode(
FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri) {
checkBoundsInFunctionNodeParts(
@@ -3493,13 +3578,13 @@
if (declaration is FieldBuilder) {
checkTypesInField(declaration, typeEnvironment);
} else if (declaration is ProcedureBuilder) {
- checkBoundsInFunctionNode(declaration.procedure.function,
- typeEnvironment, declaration.fileUri);
- if (declaration.formals != null) {
- checkInitializersInFormals(declaration.formals, typeEnvironment);
- }
+ checkTypesInProcedureBuilder(declaration, typeEnvironment);
} else if (declaration is SourceClassBuilder) {
declaration.checkTypesInOutline(typeEnvironment);
+ } else if (declaration is SourceExtensionBuilder) {
+ declaration.checkTypesInOutline(typeEnvironment);
+ } else {
+ //assert(false, "Unexpected declaration ${declaration.runtimeType}");
}
}
inferredTypes.clear();
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 7412866..df50caa 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2139,8 +2139,8 @@
template: "This is the inherited member."
severity: CONTEXT
-DeclaredMemberConflictsWithInheritedMembersCause:
- template: "This is one of the inherited members."
+DeclaredMemberConflictsWithOverriddenMembersCause:
+ template: "This is one of the overridden members."
severity: CONTEXT
InheritedMembersConflict:
@@ -3446,14 +3446,46 @@
#num2%12.3 bytes/ms, and
#num3%12.3 ms/libraries.
+CantInferTypeDueToNoCombinedSignature:
+ template: "Can't infer a type for '#name' as the overridden members don't have a combined signature."
+ tip: "Try adding an explicit type."
+ analyzerCode: COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+ configuration: nnbd-strong
+ script: |
+ class A {
+ void method(int a) {}
+ }
+ class B {
+ void method(String a) {}
+ }
+ class C implements A, B {
+ void method(a) {}
+ }
+
+CantInferReturnTypeDueToNoCombinedSignature:
+ template: "Can't infer a return type for '#name' as the overridden members don't have a combined signature."
+ tip: "Try adding an explicit type."
+ analyzerCode: COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+ configuration: nnbd-strong
+ script: |
+ abstract class A {
+ int get getter;
+ }
+ abstract class B {
+ String get getter;
+ }
+ abstract class C implements A, B {
+ get getter;
+ }
+
CantInferTypeDueToInconsistentOverrides:
- template: "Can't infer a type for '#name' as some of the inherited members have different types."
+ template: "Can't infer a type for '#name' as some of the overridden members have different types."
tip: "Try adding an explicit type."
analyzerCode: INVALID_METHOD_OVERRIDE
external: testcases/inference/inconsistent_overrides.dart
CantInferReturnTypeDueToInconsistentOverrides:
- template: "Can't infer a return type for '#name' as some of the inherited members have different types."
+ template: "Can't infer a return type for '#name' as some of the overridden members have different types."
tip: "Try adding an explicit type."
analyzerCode: INVALID_METHOD_OVERRIDE
external: testcases/inference/inconsistent_overrides.dart
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 1f0ca3c..4a2893b 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -529,6 +529,7 @@
initializer's
insertion
inspect
+inspecting
inspection
inspector
inspired
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 47cfd38..62f6492 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -273,6 +273,7 @@
behaved
behaves
behavior
+behavioral
behaviors
behind
being
@@ -844,6 +845,7 @@
diet
differ
difference
+differences
different
differently
dig
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index bef5e7f..b3c7774 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -71,6 +71,11 @@
brand
brave
brown
+bt
+bt3a
+bt3b
+bt4a
+bt4b
btw
builddir
bulk2
@@ -137,6 +142,10 @@
coverages
cp
csi
+ct3a
+ct3b
+ct4a
+ct4b
ctrl
cumulative
cursor
@@ -239,6 +248,15 @@
favors
fi
fibonacci
+field1c
+field2a
+field2b
+field2c
+field3a
+field3b
+field3c
+field4a
+field4b
filesystem
filler
fisk
@@ -280,6 +298,9 @@
gave
gc
gcd
+getter1c
+getter1d
+getter1e
goo
google
graphic
@@ -411,6 +432,7 @@
matters
mds
measured
+method1d
metric
metrics
mf
@@ -549,6 +571,11 @@
selection
sensitive
services
+setter1a
+setter1b
+setter1c
+setter1d
+setter1e
setups
severe
sheets
@@ -604,6 +631,10 @@
supplement
suspension
symbolic
+t3a
+t3b
+t4a
+t4b
t\b\f\u
t\u0008\f\u
tails
diff --git a/pkg/front_end/test/text_representation/data/types_opt_out.dart b/pkg/front_end/test/text_representation/data/types_opt_out.dart
index 5db349b..b302015 100644
--- a/pkg/front_end/test/text_representation/data/types_opt_out.dart
+++ b/pkg/front_end/test/text_representation/data/types_opt_out.dart
@@ -24,7 +24,7 @@
String /*normal|limited.String**/ /*verbose.dart.core::String**/ o) {}
voidType(void /*void*/ o) {}
dynamicType(dynamic /*dynamic*/ o) {}
-neverType(Never /*Never**/ o) {}
+neverType(Never /*normal|limited.Null?*/ /*verbose.dart.core::Null?*/ o) {}
objectType(
Object /*normal|limited.Object**/ /*verbose.dart.core::Object**/ o) {}
genericType1(
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
index 2bbb7e2..8c879e7 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
@@ -2,146 +2,146 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
// var field2 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
// var field2 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
// var field4 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
// var field4 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
// int field6;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
// String field6;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
// int field8;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
// String field8;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the overridden members have different types.
// Try adding an explicit type.
// var field11; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the overridden members.
// T field11;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the overridden members.
// S field11;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
// var field17 = 0;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
// String field17;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
// int field18;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
// var field18 = '';
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
// var field2 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
// var field2 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
// var field4 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
// var field4 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
// int field6;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
// String field6;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
// int field8;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
// String field8;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
// var field17 = 0;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
// String field17;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
// int field18;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
// var field18 = '';
// ^^^^^^^
//
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
index 73fdb87..0400159 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
@@ -2,146 +2,146 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:49:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
// var field2 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
// var field2 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
// var field4 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
// var field4 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
// int field6;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
// String field6;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
// int field8;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
// String field8;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the overridden members have different types.
// Try adding an explicit type.
// var field11; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the overridden members.
// T field11;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the overridden members.
// S field11;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
// var field17 = 0;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
// String field17;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
// int field18;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
// var field18 = '';
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// var field2; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the overridden members.
// var field2 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the overridden members.
// var field2 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the overridden members have different types.
// Try adding an explicit type.
// var field4 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the overridden members.
// var field4 = 0;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the overridden members.
// var field4 = '';
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the overridden members have different types.
// Try adding an explicit type.
// var field6; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the overridden members.
// int field6;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the overridden members.
// String field6;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the overridden members have different types.
// Try adding an explicit type.
// var field8 = 0; // error
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the overridden members.
// int field8;
// ^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the overridden members.
// String field8;
// ^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the overridden members have different types.
// Try adding an explicit type.
// var field17; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the overridden members.
// var field17 = 0;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the overridden members.
// String field17;
// ^^^^^^^
//
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the overridden members have different types.
// Try adding an explicit type.
// var field18; // error
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the overridden members.
// int field18;
// ^^^^^^^
-// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the overridden members.
// var field18 = '';
// ^^^^^^^
//
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
index 9b896a7..ec8f574 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
index 98445c0..35d40fb 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
index 98445c0..35d40fb 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'C'.
// abstract class C implements A, B {}
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
index b7df28f..e77f24e 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
index 66fe78e..194538f 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
index 66fe78e..194538f 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
// Try adding a declaration of 'n' to 'B with C'.
// mixin M on B, C {}
// ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the overridden members.
// int get n => 1;
// ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the overridden members.
// double get n => 2.0;
// ^
//
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
index a943e3a..8035f1d 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart
@@ -51,10 +51,8 @@
set setterFromSetter(value);
- // TODO(johnniwinther): This should be an error.
get getterFromSetter;
- // TODO(johnniwinther): This should be an error.
set setterFromGetter(value);
get getterFromGetterWithSetterConflict;
@@ -81,10 +79,8 @@
set setterFromSetter(value);
- // TODO(johnniwinther): This should be an error.
get getterFromSetter;
- // TODO(johnniwinther): This should be an error.
set setterFromGetter(value);
get getterFromGetterWithSetterConflict;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
index 8bdc4d8..c4a5102 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.outline.expect
@@ -2,50 +2,94 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -106,8 +150,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → core::num*;
- abstract set setterFromGetter(core::num* value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -138,8 +182,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → dynamic;
- abstract set setterFromGetter(dynamic value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
index 2e2d511..81942f2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.expect
@@ -2,50 +2,94 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -110,8 +154,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → core::num*;
- abstract set setterFromGetter(core::num* value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -144,8 +188,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → dynamic;
- abstract set setterFromGetter(dynamic value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
index 2e2d511..81942f2 100644
--- a/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart.strong.transformed.expect
@@ -2,50 +2,94 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:54:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:56:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:78:7: Error: Can't infer a return type for 'getterFromGetter' as some of the overridden members have different types.
// Try adding an explicit type.
// get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the overridden members.
// num get getterFromGetter;
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the overridden members.
// int get getterFromGetter;
// ^^^^^^^^^^^^^^^^
//
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:7: Error: Can't infer a return type for 'getterFromSetter' as some of the overridden members have different types.
+// Try adding an explicit type.
+// get getterFromSetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:10:7: Context: This is one of the overridden members.
+// set getterFromSetter(num value);
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:32:7: Context: This is one of the overridden members.
+// set getterFromSetter(int value);
+// ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set setterFromSetter(value);
// ^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the overridden members.
// set setterFromSetter(num value);
// ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the overridden members.
// set setterFromSetter(int value);
// ^^^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:84:24: Error: Can't infer a type for 'value' as some of the overridden members have different types.
+// Try adding an explicit type.
+// set setterFromGetter(value);
+// ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:12:11: Context: This is one of the overridden members.
+// num get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:26:11: Context: This is one of the overridden members.
+// int get setterFromGetter;
+// ^^^^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
@@ -110,8 +154,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → core::num*;
- abstract set setterFromGetter(core::num* value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
@@ -144,8 +188,8 @@
;
abstract get getterFromGetter() → invalid-type;
abstract set setterFromSetter(invalid-type value) → void;
- abstract get getterFromSetter() → dynamic;
- abstract set setterFromGetter(dynamic value) → void;
+ abstract get getterFromSetter() → invalid-type;
+ abstract set setterFromGetter(invalid-type value) → void;
abstract get getterFromGetterWithSetterConflict() → core::num*;
abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
abstract forwarding-stub get setterFromGetter() → core::int*;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
index 85c8784..bc603fc 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.outline.expect
@@ -18,6 +18,46 @@
// class A<X extends int> {}
// ^
//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// static A<num> fieldOfE; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+// A<num> fooOfE() => null; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void barOfE(A<num> a) {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void bazOfE<Y extends A<num>>() {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
index 87bc7b9..fa633e1b 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.expect
@@ -18,6 +18,46 @@
// class A<X extends int> {}
// ^
//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// static A<num> fieldOfE; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+// A<num> fooOfE() => null; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void barOfE(A<num> a) {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void bazOfE<Y extends A<num>>() {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
index 87bc7b9..fa633e1b 100644
--- a/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart.strong.transformed.expect
@@ -18,6 +18,46 @@
// class A<X extends int> {}
// ^
//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:12:13: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// extension E<X extends A<num>> // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:14:17: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// static A<num> fieldOfE; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:15:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A' in the return type.
+// Try changing type arguments so that they conform to the bounds.
+// A<num> fooOfE() => null; // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:16:22: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void barOfE(A<num> a) {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:17:15: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'X' on 'A'.
+// Try changing type arguments so that they conform to the bounds.
+// void bazOfE<Y extends A<num>>() {} // Error.
+// ^
+// pkg/front_end/testcases/general/well_boundness_checks_in_outline.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends int> {}
+// ^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
index 2f1de22..39b351a 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index 2d16975..537432c 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
index 2d16975..537432c 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
@@ -2,47 +2,47 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:18:7: Error: Can't infer a return type for 'field1' as some of the overridden members have different types.
// Try adding an explicit type.
// get field1 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field1(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the overridden members.
// dynamic field1;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the overridden members.
// int field1;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the overridden members have different types.
// Try adding an explicit type.
// get field2 => null;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
-// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the overridden members have different types.
// Try adding an explicit type.
// set field2(value) {}
// ^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the overridden members.
// int field2;
// ^^^^^^
-// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the overridden members.
// dynamic field2;
// ^^^^^^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
index e5c3a99..9a21f6c 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index f3a5049..28c663f 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
index f3a5049..28c663f 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
index ddd90c3..43ee8e9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 3214028..d3047a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
index 3214028..d3047a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the overridden members have different types.
// Try adding an explicit type.
// get a => null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the overridden members.
// final I1 a = null;
// ^
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the overridden members.
// final I2 a = null;
// ^
//
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
index 14cea21..b735a9b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
@@ -2,69 +2,69 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
// A h(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
// A h(A x, {I y}) {}
// ^
//
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
index 3a01350..dedc39b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
@@ -2,69 +2,69 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
// A h(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
// A h(A x, {I y}) {}
// ^
//
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
index 3a01350..dedc39b 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
@@ -2,69 +2,69 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:3: Error: Can't infer a return type for 'f' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// f(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the overridden members.
// A f(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the overridden members.
// I f(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// g(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the overridden members.
// A g(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the overridden members.
// A g(I x, {I y}) {}
// ^
//
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// h(x, {y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the overridden members.
// A h(A x, {A y}) {}
// ^
-// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the overridden members.
// A h(A x, {I y}) {}
// ^
//
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
index f6d6dda..28cd597 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
@@ -2,36 +2,36 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 5b91cfd..044f2fd 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -2,36 +2,36 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
index 5b91cfd..044f2fd 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
@@ -2,36 +2,36 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the overridden members.
// double get x;
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
index 1385117..0ebb072 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
// void set x(double value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index c0bc8d0..8ae0ce1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
// void set x(double value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
index c0bc8d0..8ae0ce1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the overridden members.
// void set x(double value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
index bd38552..d9e8e4e 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
// A get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
// void set x(B value);
// ^
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// var y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
// B get y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
// void set y(A value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
index 8fae470..3bfa8c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
// A get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
// void set x(B value);
// ^
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// var y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
// B get y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
// void set y(A value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
index 8fae470..3bfa8c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:16:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the overridden members.
// A get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the overridden members.
// void set x(B value);
// ^
//
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the overridden members have different types.
// Try adding an explicit type.
// var y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the overridden members.
// B get y;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the overridden members.
// void set y(A value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
index e02792c..c38c16a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
// void set x(num value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index c89eeb0..37df60c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
// void set x(num value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
index c89eeb0..37df60c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the overridden members.
// int get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the overridden members.
// void set x(num value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
index 25b44a1..0d41588 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
// void set x(int value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
index bd65763..ae57d36 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
// void set x(int value);
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
index bd65763..ae57d36 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:19:7: Error: Can't infer a type for 'x' as some of the overridden members have different types.
// Try adding an explicit type.
// var x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the overridden members.
// num get x;
// ^
-// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the overridden members.
// void set x(int value);
// ^
//
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
index 3fd4ae8..b7305d8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart
@@ -23,17 +23,17 @@
abstract late int lateInstanceField;
- external abstract int externalInstanceField;
+ external abstract int externalInstanceField1;
- external abstract final int externalFinalInstanceField;
+ external abstract final int externalFinalInstanceField1;
- external abstract covariant num externalCovariantInstanceField;
+ external abstract covariant num externalCovariantInstanceField1;
- abstract external int externalInstanceField;
+ abstract external int externalInstanceField2;
- abstract external final int externalFinalInstanceField;
+ abstract external final int externalFinalInstanceField2;
- abstract external covariant num externalCovariantInstanceField;
+ abstract external covariant num externalCovariantInstanceField2;
external abstract late int externalLateInstanceField;
}
@@ -54,8 +54,8 @@
extension Extension on A {
abstract int extensionInstanceField;
abstract final int finalExtensionInstanceField;
- abstract static int extensionStaticField;
- abstract static final int finalExtensionStaticField;
+ abstract static int extensionStaticField = 0;
+ abstract static final int finalExtensionStaticField = 0;
}
main() {}
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
index 6bc5231..799f3a0 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.outline.expect
@@ -34,55 +34,34 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract int externalInstanceField;
+// external abstract int externalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract final int externalFinalInstanceField;
+// external abstract final int externalFinalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract covariant num externalCovariantInstanceField;
+// external abstract covariant num externalCovariantInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external int externalInstanceField;
+// abstract external int externalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-// abstract external int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-// external abstract int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external final int externalFinalInstanceField;
+// abstract external final int externalFinalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-// abstract external final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-// external abstract final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external covariant num externalCovariantInstanceField;
+// abstract external covariant num externalCovariantInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-// abstract external covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-// external abstract covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
// external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -193,11 +172,16 @@
abstract set initializedField1(core::int #externalFieldValue) → void;
abstract get initializedField2() → core::int;
abstract set initializedField2(core::int #externalFieldValue) → void;
- external get externalInstanceField() → core::int;
- external set externalInstanceField(core::int #externalFieldValue) → void;
- external get externalFinalInstanceField() → core::int;
- external get externalCovariantInstanceField() → core::num;
- external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField1() → core::int;
+ external set externalInstanceField1(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField1() → core::int;
+ external get externalCovariantInstanceField1() → core::num;
+ external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField2() → core::int;
+ external set externalInstanceField2(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField2() → core::int;
+ external get externalCovariantInstanceField2() → core::num;
+ external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
external get externalLateInstanceField() → core::int;
external set externalLateInstanceField(core::int #externalFieldValue) → void;
}
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.expect
@@ -34,55 +34,34 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract int externalInstanceField;
+// external abstract int externalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract final int externalFinalInstanceField;
+// external abstract final int externalFinalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract covariant num externalCovariantInstanceField;
+// external abstract covariant num externalCovariantInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external int externalInstanceField;
+// abstract external int externalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-// abstract external int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-// external abstract int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external final int externalFinalInstanceField;
+// abstract external final int externalFinalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-// abstract external final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-// external abstract final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external covariant num externalCovariantInstanceField;
+// abstract external covariant num externalCovariantInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-// abstract external covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-// external abstract covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
// external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
abstract set initializedField1(core::int #externalFieldValue) → void;
abstract get initializedField2() → core::int;
abstract set initializedField2(core::int #externalFieldValue) → void;
- external get externalInstanceField() → core::int;
- external set externalInstanceField(core::int #externalFieldValue) → void;
- external get externalFinalInstanceField() → core::int;
- external get externalCovariantInstanceField() → core::num;
- external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField1() → core::int;
+ external set externalInstanceField1(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField1() → core::int;
+ external get externalCovariantInstanceField1() → core::num;
+ external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField2() → core::int;
+ external set externalInstanceField2(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField2() → core::int;
+ external get externalCovariantInstanceField2() → core::num;
+ external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
external get externalLateInstanceField() → core::int;
external set externalLateInstanceField(core::int #externalFieldValue) → void;
}
@@ -252,8 +236,8 @@
static field core::int topLevelField;
static final field core::int finalTopLevelField = 0;
static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
static abstract get Extension|extensionInstanceField() → core::int;
static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.strong.transformed.expect
@@ -34,55 +34,34 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract int externalInstanceField;
+// external abstract int externalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract final int externalFinalInstanceField;
+// external abstract final int externalFinalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract covariant num externalCovariantInstanceField;
+// external abstract covariant num externalCovariantInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external int externalInstanceField;
+// abstract external int externalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-// abstract external int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-// external abstract int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external final int externalFinalInstanceField;
+// abstract external final int externalFinalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-// abstract external final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-// external abstract final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external covariant num externalCovariantInstanceField;
+// abstract external covariant num externalCovariantInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-// abstract external covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-// external abstract covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
// external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
abstract set initializedField1(core::int #externalFieldValue) → void;
abstract get initializedField2() → core::int;
abstract set initializedField2(core::int #externalFieldValue) → void;
- external get externalInstanceField() → core::int;
- external set externalInstanceField(core::int #externalFieldValue) → void;
- external get externalFinalInstanceField() → core::int;
- external get externalCovariantInstanceField() → core::num;
- external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField1() → core::int;
+ external set externalInstanceField1(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField1() → core::int;
+ external get externalCovariantInstanceField1() → core::num;
+ external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField2() → core::int;
+ external set externalInstanceField2(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField2() → core::int;
+ external get externalCovariantInstanceField2() → core::num;
+ external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
external get externalLateInstanceField() → core::int;
external set externalLateInstanceField(core::int #externalFieldValue) → void;
}
@@ -252,8 +236,8 @@
static field core::int topLevelField;
static final field core::int finalTopLevelField = 0;
static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
static abstract get Extension|extensionInstanceField() → core::int;
static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
index 8ad6f00..69a99ab 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.textual_outline.expect
@@ -10,12 +10,12 @@
abstract static final int finalStaticField;
abstract late int ;
lateInstanceField;
- external abstract int externalInstanceField;
- external abstract final int externalFinalInstanceField;
- external abstract covariant num externalCovariantInstanceField;
- abstract external int externalInstanceField;
- abstract external final int externalFinalInstanceField;
- abstract external covariant num externalCovariantInstanceField;
+ external abstract int externalInstanceField1;
+ external abstract final int externalFinalInstanceField1;
+ external abstract covariant num externalCovariantInstanceField1;
+ abstract external int externalInstanceField2;
+ abstract external final int externalFinalInstanceField2;
+ abstract external covariant num externalCovariantInstanceField2;
external abstract late int ;
externalLateInstanceField;
}
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.expect
@@ -34,55 +34,34 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract int externalInstanceField;
+// external abstract int externalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract final int externalFinalInstanceField;
+// external abstract final int externalFinalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract covariant num externalCovariantInstanceField;
+// external abstract covariant num externalCovariantInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external int externalInstanceField;
+// abstract external int externalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-// abstract external int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-// external abstract int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external final int externalFinalInstanceField;
+// abstract external final int externalFinalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-// abstract external final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-// external abstract final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external covariant num externalCovariantInstanceField;
+// abstract external covariant num externalCovariantInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-// abstract external covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-// external abstract covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
// external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
abstract set initializedField1(core::int #externalFieldValue) → void;
abstract get initializedField2() → core::int;
abstract set initializedField2(core::int #externalFieldValue) → void;
- external get externalInstanceField() → core::int;
- external set externalInstanceField(core::int #externalFieldValue) → void;
- external get externalFinalInstanceField() → core::int;
- external get externalCovariantInstanceField() → core::num;
- external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField1() → core::int;
+ external set externalInstanceField1(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField1() → core::int;
+ external get externalCovariantInstanceField1() → core::num;
+ external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField2() → core::int;
+ external set externalInstanceField2(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField2() → core::int;
+ external get externalCovariantInstanceField2() → core::num;
+ external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
external get externalLateInstanceField() → core::int;
external set externalLateInstanceField(core::int #externalFieldValue) → void;
}
@@ -252,8 +236,8 @@
static field core::int topLevelField;
static final field core::int finalTopLevelField = 0;
static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
static abstract get Extension|extensionInstanceField() → core::int;
static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
index fa28c87..a4118b8 100644
--- a/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/abstract_field_errors.dart.weak.transformed.expect
@@ -34,55 +34,34 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract int externalInstanceField;
+// external abstract int externalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract final int externalFinalInstanceField;
+// external abstract final int externalFinalInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// external abstract covariant num externalCovariantInstanceField;
+// external abstract covariant num externalCovariantInstanceField1;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external int externalInstanceField;
+// abstract external int externalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:32:25: Error: 'externalInstanceField' is already declared in this scope.
-// abstract external int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:26:25: Context: Previous declaration of 'externalInstanceField'.
-// external abstract int externalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external final int externalFinalInstanceField;
+// abstract external final int externalFinalInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:34:31: Error: 'externalFinalInstanceField' is already declared in this scope.
-// abstract external final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:28:31: Context: Previous declaration of 'externalFinalInstanceField'.
-// external abstract final int externalFinalInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:3: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
-// abstract external covariant num externalCovariantInstanceField;
+// abstract external covariant num externalCovariantInstanceField2;
// ^^^^^^^^
//
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:36:35: Error: 'externalCovariantInstanceField' is already declared in this scope.
-// abstract external covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:30:35: Context: Previous declaration of 'externalCovariantInstanceField'.
-// external abstract covariant num externalCovariantInstanceField;
-// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:38:12: Error: Fields can't be declared both 'abstract' and 'external'.
// Try removing the 'abstract' or 'external' keyword.
// external abstract late int externalLateInstanceField;
@@ -140,22 +119,22 @@
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:23: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:57:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static int extensionStaticField;
+// abstract static int extensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:29: Error: Extension fields can't be declared 'abstract'.
// Try removing the 'abstract' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:58:3: Error: Static fields can't be declared 'abstract'.
// Try removing the 'abstract' or 'static' keyword.
-// abstract static final int finalExtensionStaticField;
+// abstract static final int finalExtensionStaticField = 0;
// ^^^^^^^^
//
// pkg/front_end/testcases/nnbd/abstract_field_errors.dart:5:14: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
@@ -225,11 +204,16 @@
abstract set initializedField1(core::int #externalFieldValue) → void;
abstract get initializedField2() → core::int;
abstract set initializedField2(core::int #externalFieldValue) → void;
- external get externalInstanceField() → core::int;
- external set externalInstanceField(core::int #externalFieldValue) → void;
- external get externalFinalInstanceField() → core::int;
- external get externalCovariantInstanceField() → core::num;
- external set externalCovariantInstanceField(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField1() → core::int;
+ external set externalInstanceField1(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField1() → core::int;
+ external get externalCovariantInstanceField1() → core::num;
+ external set externalCovariantInstanceField1(covariant core::num #externalFieldValue) → void;
+ external get externalInstanceField2() → core::int;
+ external set externalInstanceField2(core::int #externalFieldValue) → void;
+ external get externalFinalInstanceField2() → core::int;
+ external get externalCovariantInstanceField2() → core::num;
+ external set externalCovariantInstanceField2(covariant core::num #externalFieldValue) → void;
external get externalLateInstanceField() → core::int;
external set externalLateInstanceField(core::int #externalFieldValue) → void;
}
@@ -252,8 +236,8 @@
static field core::int topLevelField;
static final field core::int finalTopLevelField = 0;
static const field core::int constField = #C1;
-static field core::int Extension|extensionStaticField;
-static final field core::int Extension|finalExtensionStaticField;
+static field core::int Extension|extensionStaticField = 0;
+static final field core::int Extension|finalExtensionStaticField = 0;
static abstract get Extension|extensionInstanceField() → core::int;
static abstract set Extension|extensionInstanceField(core::int #externalFieldValue) → void;
static abstract get Extension|finalExtensionInstanceField() → core::int;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart b/pkg/front_end/testcases/nnbd/issue43211.dart
new file mode 100644
index 0000000..f04a817
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart
@@ -0,0 +1,54 @@
+// 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.
+
+class A<X extends A<X>?> {}
+
+class D<X extends num> {}
+
+extension Extension1<X extends A<X>?> on A<X> {
+ void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+ A<Y>? c;
+ A<A<Null>>? d;
+ }
+
+ void method2<Y extends String>(D<Y> a, D<String>? b) {
+ D<Y>? c;
+ D<String>? d;
+ }
+}
+
+extension ext2<X extends A<Null>?> on A<X> {}
+
+class B<X extends A<Null>?> implements A<X> {
+ void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+ A<Y>? c;
+ A<A<Null>>? d;
+ }
+
+ void method2<Y extends String>(D<Y> a, D<String>? b) {
+ D<Y>? c;
+ D<String>? d;
+ }
+}
+
+class C {
+ factory C.redirect(A<A<Null>>? a) = C.internal;
+
+ factory C.fact(A<A<Null>>? a) {
+ A<A<Null>>? b;
+ D<String>? c;
+ return new C.internal(a);
+ }
+
+ C.internal(_) {
+ A<A<Null>>? a;
+ D<String>? b;
+ }
+}
+
+test() {
+ var a = new A<Null>();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
new file mode 100644
index 0000000..f9ad8e5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
@@ -0,0 +1,151 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.redirect(A<A<Null>>? a) = C.internal;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.fact(A<A<Null>>? a) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::D<self::D::X>
+ ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+ synthetic constructor •() → self::B<self::B::X%>
+ ;
+ method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+ ;
+ method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
+ ;
+}
+class C extends core::Object {
+ static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+ constructor internal(dynamic _) → self::C
+ ;
+ static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+ let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+ static factory fact(self::A<self::A<core::Null?>>? a) → self::C
+ ;
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+ method method1 = self::Extension1|method1;
+ tearoff method1 = self::Extension1|get#method1;
+ method method2 = self::Extension1|method2;
+ tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+ ;
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+ return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
+ ;
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+ return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
new file mode 100644
index 0000000..127779c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.redirect(A<A<Null>>? a) = C.internal;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.fact(A<A<Null>>? a) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? a;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::D<self::D::X>
+ : super core::Object::•()
+ ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+ synthetic constructor •() → self::B<self::B::X%>
+ : super core::Object::•()
+ ;
+ method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::B::method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+ }
+ method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::B::method2::Y>? c;
+ self::D<core::String>? d;
+ }
+}
+class C extends core::Object {
+ static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+ constructor internal(dynamic _) → self::C
+ : super core::Object::•() {
+ self::A<self::A<core::Null?>>? a;
+ self::D<core::String>? b;
+ }
+ static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+ let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+ static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+ self::A<self::A<core::Null?>>? b;
+ self::D<core::String>? c;
+ return new self::C::internal(a);
+ }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+ method method1 = self::Extension1|method1;
+ tearoff method1 = self::Extension1|get#method1;
+ method method2 = self::Extension1|method2;
+ tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::Extension1|method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+ return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::Extension1|method2::Y>? c;
+ self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+ return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+ self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
new file mode 100644
index 0000000..10f7711
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.redirect(A<A<Null>>? a) = C.internal;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.fact(A<A<Null>>? a) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? a;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::D<self::D::X>
+ : super core::Object::•()
+ ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+ synthetic constructor •() → self::B<self::B::X%>
+ : super core::Object::•()
+ ;
+ method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::B::method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+ }
+ method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::B::method2::Y>? c;
+ self::D<core::String>? d;
+ }
+}
+class C extends core::Object {
+ static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+ constructor internal(dynamic _) → self::C
+ : super core::Object::•() {
+ self::A<self::A<core::Null?>>? a;
+ self::D<core::String>? b;
+ }
+ static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+ let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
+ static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+ self::A<self::A<core::Null?>>? b;
+ self::D<core::String>? c;
+ return new self::C::internal(a);
+ }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+ method method1 = self::Extension1|method1;
+ tearoff method1 = self::Extension1|get#method1;
+ method method2 = self::Extension1|method2;
+ tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::Extension1|method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+ return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::Extension1|method2::Y>? c;
+ self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+ return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+ self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect
new file mode 100644
index 0000000..f38556f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+class A<X extends A<X>?> {}
+class D<X extends num> {}
+extension Extension1<X extends A<X>?> (){}
+on A<X> (){}
+extension ext2<X extends A<Null>?> (){}
+on A<X> (){}
+class B<X extends A<Null>?> implements A<X> {
+ void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {}
+ void method2<Y extends String>(D<Y> a, D<String>? b) {}
+}
+class C {
+ factory C.redirect(A<A<Null>>? a) = C.internal;
+ factory C.fact(A<A<Null>>? a) {}
+ C.internal(_) {}
+}
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
new file mode 100644
index 0000000..127779c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.redirect(A<A<Null>>? a) = C.internal;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.fact(A<A<Null>>? a) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? a;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::D<self::D::X>
+ : super core::Object::•()
+ ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+ synthetic constructor •() → self::B<self::B::X%>
+ : super core::Object::•()
+ ;
+ method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::B::method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+ }
+ method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::B::method2::Y>? c;
+ self::D<core::String>? d;
+ }
+}
+class C extends core::Object {
+ static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+ constructor internal(dynamic _) → self::C
+ : super core::Object::•() {
+ self::A<self::A<core::Null?>>? a;
+ self::D<core::String>? b;
+ }
+ static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+ let dynamic #redirecting_factory = self::C::internal in invalid-expression;
+ static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+ self::A<self::A<core::Null?>>? b;
+ self::D<core::String>? c;
+ return new self::C::internal(a);
+ }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+ method method1 = self::Extension1|method1;
+ tearoff method1 = self::Extension1|get#method1;
+ method method2 = self::Extension1|method2;
+ tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::Extension1|method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+ return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::Extension1|method2::Y>? c;
+ self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+ return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+ self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
new file mode 100644
index 0000000..10f7711
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -0,0 +1,261 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:10:53: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Y>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:15:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:21:39: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// extension ext2<X extends A<Null>?> on A<X> {}
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:23:7: Error: Type argument 'X/*1*/' doesn't conform to the bound 'A<X/*2*/>?' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// - 'X/*1*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// - 'X/*2*/' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// class B<X extends A<Null>?> implements A<X> {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:41: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:24:56: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// void method1<Y extends A<Null>?>(A<Y> a, A<A<Null>>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:39: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:29:53: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// void method2<Y extends String>(D<Y> a, D<String>? b) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:36:34: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.redirect(A<A<Null>>? a) = C.internal;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:38:30: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// factory C.fact(A<A<Null>>? a) {
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:12:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:16:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:17:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:25:11: Error: Type argument 'Y' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:26:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:30:11: Error: Type argument 'Y' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<Y>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:31:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? d;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:39:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:40:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? c;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:45:17: Error: Type argument 'A<Null>' doesn't conform to the bound 'A<X>?' of the type variable 'X' on 'A'.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue43211.dart'.
+// Try changing type arguments so that they conform to the bounds.
+// A<A<Null>>? a;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
+// class A<X extends A<X>?> {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue43211.dart:46:16: Error: Type argument 'String' doesn't conform to the bound 'num' of the type variable 'X' on 'D'.
+// Try changing type arguments so that they conform to the bounds.
+// D<String>? b;
+// ^
+// pkg/front_end/testcases/nnbd/issue43211.dart:7:9: Context: This is the type variable whose bound isn't conformed to.
+// class D<X extends num> {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<X extends self::A<self::A::X%>? = self::A<dynamic>?> extends core::Object {
+ synthetic constructor •() → self::A<self::A::X%>
+ : super core::Object::•()
+ ;
+}
+class D<X extends core::num = core::num> extends core::Object {
+ synthetic constructor •() → self::D<self::D::X>
+ : super core::Object::•()
+ ;
+}
+class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+ synthetic constructor •() → self::B<self::B::X%>
+ : super core::Object::•()
+ ;
+ method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::B::method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+ }
+ method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::B::method2::Y>? c;
+ self::D<core::String>? d;
+ }
+}
+class C extends core::Object {
+ static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
+ constructor internal(dynamic _) → self::C
+ : super core::Object::•() {
+ self::A<self::A<core::Null?>>? a;
+ self::D<core::String>? b;
+ }
+ static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+ let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
+ static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
+ self::A<self::A<core::Null?>>? b;
+ self::D<core::String>? c;
+ return new self::C::internal(a);
+ }
+}
+extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
+ method method1 = self::Extension1|method1;
+ tearoff method1 = self::Extension1|get#method1;
+ method method2 = self::Extension1|method2;
+ tearoff method2 = self::Extension1|get#method2;
+}
+extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+}
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+ self::A<self::Extension1|method1::Y%>? c;
+ self::A<self::A<core::Null?>>? d;
+}
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
+ return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
+ self::D<self::Extension1|method2::Y>? c;
+ self::D<core::String>? d;
+}
+static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
+ return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
+static method test() → dynamic {
+ self::A<core::Null?> a = new self::A::•<core::Null?>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
index 057a76f..296454f 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
@@ -14,6 +14,10 @@
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+// static int staticFieldOfE; // Error.
+// ^^^^^^^^^^^^^^
+//
import self as self;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
@@ -14,6 +14,10 @@
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+// static int staticFieldOfE; // Error.
+// ^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// A.foo();
// ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
@@ -14,6 +14,10 @@
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+// static int staticFieldOfE; // Error.
+// ^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// A.foo();
// ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -14,6 +14,10 @@
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+// static int staticFieldOfE; // Error.
+// ^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// A.foo();
// ^
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index a318c48..344ba8c 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -14,6 +14,10 @@
// static int staticFieldOfM; // Error.
// ^^^^^^^^^^^^^^
//
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:34:14: Error: Field 'staticFieldOfE' should be initialized because its type 'int' doesn't allow null.
+// static int staticFieldOfE; // Error.
+// ^^^^^^^^^^^^^^
+//
// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:12:3: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
// A.foo();
// ^
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart b/pkg/front_end/testcases/nnbd/override_inference.dart
new file mode 100644
index 0000000..c62bd15
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart
@@ -0,0 +1,156 @@
+// 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';
+
+abstract class A<AT> {
+ String method1a(Object x);
+ Object method1b(String x);
+ void method1c(int x);
+ String method1d();
+ void method2a(Object? x);
+ void method2b(dynamic x);
+ void method3a<AT3a>(AT3a x);
+ void method3b<AT3b>(AT3b x);
+ void method4a<AT4a>(AT4a x, AT y);
+ void method4b<AT4b>(AT4b x, AT y);
+ void method5a(int x, num y);
+ void method5b(int x, num y);
+ void method6a({int x, num y});
+ void method6b({num y, int x});
+ Object? method7a(Object? o, {Object? named}) {}
+
+ Object get getter1a;
+ String get getter1b;
+ String get getter1c;
+ set getter1d(String x);
+ int get getter1e;
+ set getter1e(int x);
+
+ void set setter1a(Object x);
+ void set setter1b(String x);
+ void set setter1c(String x);
+ String get setter1d;
+ int get setter1e;
+ set setter1e(int x);
+
+ int? get field1a;
+ num? get field1b;
+ int? get field1c;
+
+ void set field2a(int? value);
+ void set field2b(num? value);
+ void set field2c(int? value);
+
+ int? get field3a;
+ num? get field3b;
+ int? get field3c;
+
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+
+ num? get field4a;
+ num? get field4b;
+ void set field4b(Object? value);
+}
+
+abstract class B<BT> {
+ Object method1a(String x);
+ String method1b(Object x);
+ void method1c(String x);
+ int method1d();
+ void method2a(dynamic x);
+ void method2b(Object? x);
+ void method3a<BT3a>(BT3a x);
+ void method3b<BT3b>(BT3b x);
+ void method4a<BT4a>(BT4a x, BT y);
+ void method4b<BT4b>(BT4b x, BT y);
+ void method5a(num x, int y);
+ void method5b(num x, int y);
+ void method6a({Object x, num y});
+ void method6b({int x, Object y});
+ FutureOr method7a(FutureOr o, {FutureOr named});
+
+ String get getter1a;
+ Object get getter1b;
+ int get getter1c;
+ set getter1d(Object x);
+ num get getter1e;
+ set getter1e(Object x);
+
+ void set setter1a(String x);
+ void set setter1b(Object x);
+ void set setter1c(int x);
+ Object get setter1d;
+ num get setter1e;
+ set setter1e(Object x);
+
+ num? get field1a;
+ int? get field1b;
+ double? get field1c;
+
+ void set field2a(num? value);
+ void set field2b(int? value);
+ void set field2c(double? value);
+
+ num? get field3a;
+ int? get field3b;
+ double? get field3c;
+
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+
+ void set field4a(num? value);
+ num? get field4b;
+ void set field4b(Object? value);
+}
+
+abstract class C implements A<int>, B<num> {
+ method1a(x);
+ method1b(x);
+ void method1c(x); // error
+ method1d(); // error
+ void method2a(x);
+ void method2b(x);
+ void method3a<CT3a>(x);
+ void method3b<CT3b>(x, [y]);
+ void method4a<CT4a>(x, y);
+ void method4b<CT4b>(x, y, [z]);
+ void method5a(x, y); // error
+ void method5b(num x, num y, [z]); // error
+ void method6a({x, y});
+ void method6b({x, y, z});
+ method7a(o, {named});
+
+ get getter1a;
+ get getter1b;
+ get getter1c; // error
+ get getter1d;
+ get getter1e;
+
+ void set setter1a(x);
+ void set setter1b(x);
+ void set setter1c(x); // error
+ void set setter1d(x);
+ void set setter1e(x);
+
+ final field1a = null;
+ final field1b = null;
+ final field1c = null; // error
+
+ final field2a = null;
+ final field2b = null;
+ final field2c = null; // error
+
+ final field3a = null;
+ final field3b = null;
+ final field3c = null; // error
+
+ var field4a = null;
+ var field4b = null; // error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
new file mode 100644
index 0000000..5e9a2cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.outline.expect
@@ -0,0 +1,291 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method1c(x); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+// void method1c(int x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+// void method1c(String x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// method1d(); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+// String method1d();
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+// int method1d();
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5b(num x, num y, [z]); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+// void method5b(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+// void method5b(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// get getter1c; // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+// String get getter1c;
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+// int get getter1c;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field1c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+// int? get field1c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+// double? get field1c;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field2c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field3c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+// int? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+// double? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// var field4b = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void set setter1c(x); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+// void set setter1c(String x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+// void set setter1c(int x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::AT%>
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::String x) → core::Object;
+ abstract method method1c(core::int x) → void;
+ abstract method method1d() → core::String;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(dynamic x) → void;
+ abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+ abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+ abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method5a(core::int x, core::num y) → void;
+ abstract method method5b(core::int x, core::num y) → void;
+ abstract method method6a({core::int x, core::num y}) → void;
+ abstract method method6b({core::num y, core::int x}) → void;
+ method method7a(core::Object? o, {core::Object? named}) → core::Object?
+ ;
+ abstract get getter1a() → core::Object;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → core::String;
+ abstract set getter1d(core::String x) → void;
+ abstract get getter1e() → core::int;
+ abstract set getter1e(core::int x) → void;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::String x) → void;
+ abstract set setter1c(core::String x) → void;
+ abstract get setter1d() → core::String;
+ abstract get setter1e() → core::int;
+ abstract set setter1e(core::int x) → void;
+ abstract get field1a() → core::int?;
+ abstract get field1b() → core::num?;
+ abstract get field1c() → core::int?;
+ abstract set field2a(core::int? value) → void;
+ abstract set field2b(core::num? value) → void;
+ abstract set field2c(core::int? value) → void;
+ abstract get field3a() → core::int?;
+ abstract get field3b() → core::num?;
+ abstract get field3c() → core::int?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract get field4a() → core::num?;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::B<self::B::BT%>
+ ;
+ abstract method method1a(core::String x) → core::Object;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(core::String x) → void;
+ abstract method method1d() → core::int;
+ abstract method method2a(dynamic x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+ abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+ abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method5a(core::num x, core::int y) → void;
+ abstract method method5b(core::num x, core::int y) → void;
+ abstract method method6a({core::Object x, core::num y}) → void;
+ abstract method method6b({core::int x, core::Object y}) → void;
+ abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named}) → FutureOr<dynamic>;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::Object;
+ abstract get getter1c() → core::int;
+ abstract set getter1d(core::Object x) → void;
+ abstract get getter1e() → core::num;
+ abstract set getter1e(core::Object x) → void;
+ abstract set setter1a(core::String x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(core::int x) → void;
+ abstract get setter1d() → core::Object;
+ abstract get setter1e() → core::num;
+ abstract set setter1e(core::Object x) → void;
+ abstract get field1a() → core::num?;
+ abstract get field1b() → core::int?;
+ abstract get field1c() → core::double?;
+ abstract set field2a(core::num? value) → void;
+ abstract set field2b(core::int? value) → void;
+ abstract set field2c(core::double? value) → void;
+ abstract get field3a() → core::num?;
+ abstract get field3b() → core::int?;
+ abstract get field3c() → core::double?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract set field4a(core::num? value) → void;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+ final field core::int? field1a;
+ final field core::int? field1b;
+ final field invalid-type field1c;
+ final field core::num? field2a;
+ final field core::num? field2b;
+ final field invalid-type field2c;
+ final field core::int? field3a;
+ final field core::int? field3b;
+ final field invalid-type field3c;
+ field core::num? field4a;
+ field invalid-type field4b;
+ synthetic constructor •() → self::C
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(invalid-type x) → void;
+ abstract method method1d() → invalid-type;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+ abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y]) → void;
+ abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+ abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z]) → void;
+ abstract method method5a(invalid-type x, invalid-type y) → void;
+ abstract method method5b(core::num x, core::num y, [invalid-type z]) → void;
+ abstract method method6a({core::Object x, core::num y}) → void;
+ abstract method method6b({core::int x, core::Object y, dynamic z}) → void;
+ abstract method method7a(core::Object? o, {core::Object? named}) → core::Object?;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → invalid-type;
+ abstract get getter1d() → core::Object;
+ abstract get getter1e() → core::int;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(invalid-type x) → void;
+ abstract set setter1d(core::String x) → void;
+ abstract set setter1e(core::Object x) → void;
+ abstract forwarding-stub set getter1d(core::Object x) → void;
+ abstract forwarding-stub set getter1e(core::Object x) → void;
+ abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method1c(x); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+// void method1c(int x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+// void method1c(String x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// method1d(); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+// String method1d();
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+// int method1d();
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5b(num x, num y, [z]); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+// void method5b(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+// void method5b(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// get getter1c; // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+// String get getter1c;
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+// int get getter1c;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field1c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+// int? get field1c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+// double? get field1c;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field2c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field3c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+// int? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+// double? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// var field4b = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void set setter1c(x); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+// void set setter1c(String x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+// void set setter1c(int x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::AT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::String x) → core::Object;
+ abstract method method1c(core::int x) → void;
+ abstract method method1d() → core::String;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(dynamic x) → void;
+ abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+ abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+ abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method5a(core::int x, core::num y) → void;
+ abstract method method5b(core::int x, core::num y) → void;
+ abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+ method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+ abstract get getter1a() → core::Object;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → core::String;
+ abstract set getter1d(core::String x) → void;
+ abstract get getter1e() → core::int;
+ abstract set getter1e(core::int x) → void;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::String x) → void;
+ abstract set setter1c(core::String x) → void;
+ abstract get setter1d() → core::String;
+ abstract get setter1e() → core::int;
+ abstract set setter1e(core::int x) → void;
+ abstract get field1a() → core::int?;
+ abstract get field1b() → core::num?;
+ abstract get field1c() → core::int?;
+ abstract set field2a(core::int? value) → void;
+ abstract set field2b(core::num? value) → void;
+ abstract set field2c(core::int? value) → void;
+ abstract get field3a() → core::int?;
+ abstract get field3b() → core::num?;
+ abstract get field3c() → core::int?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract get field4a() → core::num?;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::B<self::B::BT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::String x) → core::Object;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(core::String x) → void;
+ abstract method method1d() → core::int;
+ abstract method method2a(dynamic x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+ abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+ abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method5a(core::num x, core::int y) → void;
+ abstract method method5b(core::num x, core::int y) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+ abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::Object;
+ abstract get getter1c() → core::int;
+ abstract set getter1d(core::Object x) → void;
+ abstract get getter1e() → core::num;
+ abstract set getter1e(core::Object x) → void;
+ abstract set setter1a(core::String x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(core::int x) → void;
+ abstract get setter1d() → core::Object;
+ abstract get setter1e() → core::num;
+ abstract set setter1e(core::Object x) → void;
+ abstract get field1a() → core::num?;
+ abstract get field1b() → core::int?;
+ abstract get field1c() → core::double?;
+ abstract set field2a(core::num? value) → void;
+ abstract set field2b(core::int? value) → void;
+ abstract set field2c(core::double? value) → void;
+ abstract get field3a() → core::num?;
+ abstract get field3b() → core::int?;
+ abstract get field3c() → core::double?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract set field4a(core::num? value) → void;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+ final field core::int? field1a = null;
+ final field core::int? field1b = null;
+ final field invalid-type field1c = null;
+ final field core::num? field2a = null;
+ final field core::num? field2b = null;
+ final field invalid-type field2c = null;
+ final field core::int? field3a = null;
+ final field core::int? field3b = null;
+ final field invalid-type field3c = null;
+ field core::num? field4a = null;
+ field invalid-type field4b = null;
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(invalid-type x) → void;
+ abstract method method1d() → invalid-type;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+ abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+ abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+ abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+ abstract method method5a(invalid-type x, invalid-type y) → void;
+ abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+ abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → invalid-type;
+ abstract get getter1d() → core::Object;
+ abstract get getter1e() → core::int;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(invalid-type x) → void;
+ abstract set setter1d(core::String x) → void;
+ abstract set setter1e(core::Object x) → void;
+ abstract forwarding-stub set getter1d(core::Object x) → void;
+ abstract forwarding-stub set getter1e(core::Object x) → void;
+ abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.strong.transformed.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method1c(x); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+// void method1c(int x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+// void method1c(String x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// method1d(); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+// String method1d();
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+// int method1d();
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5b(num x, num y, [z]); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+// void method5b(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+// void method5b(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// get getter1c; // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+// String get getter1c;
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+// int get getter1c;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field1c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+// int? get field1c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+// double? get field1c;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field2c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field3c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+// int? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+// double? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// var field4b = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void set setter1c(x); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+// void set setter1c(String x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+// void set setter1c(int x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::AT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::String x) → core::Object;
+ abstract method method1c(core::int x) → void;
+ abstract method method1d() → core::String;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(dynamic x) → void;
+ abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+ abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+ abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method5a(core::int x, core::num y) → void;
+ abstract method method5b(core::int x, core::num y) → void;
+ abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+ method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+ abstract get getter1a() → core::Object;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → core::String;
+ abstract set getter1d(core::String x) → void;
+ abstract get getter1e() → core::int;
+ abstract set getter1e(core::int x) → void;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::String x) → void;
+ abstract set setter1c(core::String x) → void;
+ abstract get setter1d() → core::String;
+ abstract get setter1e() → core::int;
+ abstract set setter1e(core::int x) → void;
+ abstract get field1a() → core::int?;
+ abstract get field1b() → core::num?;
+ abstract get field1c() → core::int?;
+ abstract set field2a(core::int? value) → void;
+ abstract set field2b(core::num? value) → void;
+ abstract set field2c(core::int? value) → void;
+ abstract get field3a() → core::int?;
+ abstract get field3b() → core::num?;
+ abstract get field3c() → core::int?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract get field4a() → core::num?;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::B<self::B::BT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::String x) → core::Object;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(core::String x) → void;
+ abstract method method1d() → core::int;
+ abstract method method2a(dynamic x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+ abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+ abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method5a(core::num x, core::int y) → void;
+ abstract method method5b(core::num x, core::int y) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+ abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::Object;
+ abstract get getter1c() → core::int;
+ abstract set getter1d(core::Object x) → void;
+ abstract get getter1e() → core::num;
+ abstract set getter1e(core::Object x) → void;
+ abstract set setter1a(core::String x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(core::int x) → void;
+ abstract get setter1d() → core::Object;
+ abstract get setter1e() → core::num;
+ abstract set setter1e(core::Object x) → void;
+ abstract get field1a() → core::num?;
+ abstract get field1b() → core::int?;
+ abstract get field1c() → core::double?;
+ abstract set field2a(core::num? value) → void;
+ abstract set field2b(core::int? value) → void;
+ abstract set field2c(core::double? value) → void;
+ abstract get field3a() → core::num?;
+ abstract get field3b() → core::int?;
+ abstract get field3c() → core::double?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract set field4a(core::num? value) → void;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+ final field core::int? field1a = null;
+ final field core::int? field1b = null;
+ final field invalid-type field1c = null;
+ final field core::num? field2a = null;
+ final field core::num? field2b = null;
+ final field invalid-type field2c = null;
+ final field core::int? field3a = null;
+ final field core::int? field3b = null;
+ final field invalid-type field3c = null;
+ field core::num? field4a = null;
+ field invalid-type field4b = null;
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(invalid-type x) → void;
+ abstract method method1d() → invalid-type;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+ abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+ abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+ abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+ abstract method method5a(invalid-type x, invalid-type y) → void;
+ abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+ abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → invalid-type;
+ abstract get getter1d() → core::Object;
+ abstract get getter1e() → core::int;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(invalid-type x) → void;
+ abstract set setter1d(core::String x) → void;
+ abstract set setter1e(core::Object x) → void;
+ abstract forwarding-stub set getter1d(core::Object x) → void;
+ abstract forwarding-stub set getter1e(core::Object x) → void;
+ abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect
new file mode 100644
index 0000000..2a10caa
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline.expect
@@ -0,0 +1,132 @@
+import 'dart:async';
+
+abstract class A<AT> {
+ String method1a(Object x);
+ Object method1b(String x);
+ void method1c(int x);
+ String method1d();
+ void method2a(Object? x);
+ void method2b(dynamic x);
+ void method3a<AT3a>(AT3a x);
+ void method3b<AT3b>(AT3b x);
+ void method4a<AT4a>(AT4a x, AT y);
+ void method4b<AT4b>(AT4b x, AT y);
+ void method5a(int x, num y);
+ void method5b(int x, num y);
+ void method6a({int x, num y});
+ void method6b({num y, int x});
+ Object? method7a(Object? o, {Object? named}) {}
+ Object get getter1a;
+ String get getter1b;
+ String get getter1c;
+ set getter1d(String x);
+ int get getter1e;
+ set getter1e(int x);
+ void set setter1a(Object x);
+ void set setter1b(String x);
+ void set setter1c(String x);
+ String get setter1d;
+ int get setter1e;
+ set setter1e(int x);
+ int? get field1a;
+ num? get field1b;
+ int? get field1c;
+ void set field2a(int? value);
+ void set field2b(num? value);
+ void set field2c(int? value);
+ int? get field3a;
+ num? get field3b;
+ int? get field3c;
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+ num? get field4a;
+ num? get field4b;
+ void set field4b(Object? value);
+}
+
+abstract class B<BT> {
+ Object method1a(String x);
+ String method1b(Object x);
+ void method1c(String x);
+ int method1d();
+ void method2a(dynamic x);
+ void method2b(Object? x);
+ void method3a<BT3a>(BT3a x);
+ void method3b<BT3b>(BT3b x);
+ void method4a<BT4a>(BT4a x, BT y);
+ void method4b<BT4b>(BT4b x, BT y);
+ void method5a(num x, int y);
+ void method5b(num x, int y);
+ void method6a({Object x, num y});
+ void method6b({int x, Object y});
+ FutureOr method7a(FutureOr o, {FutureOr named});
+ String get getter1a;
+ Object get getter1b;
+ int get getter1c;
+ set getter1d(Object x);
+ num get getter1e;
+ set getter1e(Object x);
+ void set setter1a(String x);
+ void set setter1b(Object x);
+ void set setter1c(int x);
+ Object get setter1d;
+ num get setter1e;
+ set setter1e(Object x);
+ num? get field1a;
+ int? get field1b;
+ double? get field1c;
+ void set field2a(num? value);
+ void set field2b(int? value);
+ void set field2c(double? value);
+ num? get field3a;
+ int? get field3b;
+ double? get field3c;
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+ void set field4a(num? value);
+ num? get field4b;
+ void set field4b(Object? value);
+}
+
+abstract class C implements A<int>, B<num> {
+ method1a(x);
+ method1b(x);
+ void method1c(x);
+ method1d();
+ void method2a(x);
+ void method2b(x);
+ void method3a<CT3a>(x);
+ void method3b<CT3b>(x, [y]);
+ void method4a<CT4a>(x, y);
+ void method4b<CT4b>(x, y, [z]);
+ void method5a(x, y);
+ void method5b(num x, num y, [z]);
+ void method6a({x, y});
+ void method6b({x, y, z});
+ method7a(o, {named});
+ get getter1a;
+ get getter1b;
+ get getter1c;
+ get getter1d;
+ get getter1e;
+ void set setter1a(x);
+ void set setter1b(x);
+ void set setter1c(x);
+ void set setter1d(x);
+ void set setter1e(x);
+ final field1a = null;
+ final field1b = null;
+ final field1c = null;
+ final field2a = null;
+ final field2b = null;
+ final field2c = null;
+ final field3a = null;
+ final field3b = null;
+ final field3c = null;
+ var field4a = null;
+ var field4b = null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..ef0f7cf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.textual_outline_modelled.expect
@@ -0,0 +1,132 @@
+import 'dart:async';
+
+abstract class A<AT> {
+ Object? method7a(Object? o, {Object? named}) {}
+ Object get getter1a;
+ Object method1b(String x);
+ String get getter1b;
+ String get getter1c;
+ String get setter1d;
+ String method1a(Object x);
+ String method1d();
+ int? get field1a;
+ int? get field1c;
+ int? get field3a;
+ int? get field3c;
+ int get getter1e;
+ int get setter1e;
+ num? get field1b;
+ num? get field3b;
+ num? get field4a;
+ num? get field4b;
+ set getter1d(String x);
+ set getter1e(int x);
+ set setter1e(int x);
+ void method1c(int x);
+ void method2a(Object? x);
+ void method2b(dynamic x);
+ void method3a<AT3a>(AT3a x);
+ void method3b<AT3b>(AT3b x);
+ void method4a<AT4a>(AT4a x, AT y);
+ void method4b<AT4b>(AT4b x, AT y);
+ void method5a(int x, num y);
+ void method5b(int x, num y);
+ void method6a({int x, num y});
+ void method6b({num y, int x});
+ void set field2a(int? value);
+ void set field2b(num? value);
+ void set field2c(int? value);
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+ void set field4b(Object? value);
+ void set setter1a(Object x);
+ void set setter1b(String x);
+ void set setter1c(String x);
+}
+
+abstract class B<BT> {
+ FutureOr method7a(FutureOr o, {FutureOr named});
+ Object get getter1b;
+ Object get setter1d;
+ Object method1a(String x);
+ String get getter1a;
+ String method1b(Object x);
+ double? get field1c;
+ double? get field3c;
+ int? get field1b;
+ int? get field3b;
+ int get getter1c;
+ int method1d();
+ num? get field1a;
+ num? get field3a;
+ num? get field4b;
+ num get getter1e;
+ num get setter1e;
+ set getter1d(Object x);
+ set getter1e(Object x);
+ set setter1e(Object x);
+ void method1c(String x);
+ void method2a(dynamic x);
+ void method2b(Object? x);
+ void method3a<BT3a>(BT3a x);
+ void method3b<BT3b>(BT3b x);
+ void method4a<BT4a>(BT4a x, BT y);
+ void method4b<BT4b>(BT4b x, BT y);
+ void method5a(num x, int y);
+ void method5b(num x, int y);
+ void method6a({Object x, num y});
+ void method6b({int x, Object y});
+ void set field2a(num? value);
+ void set field2b(int? value);
+ void set field2c(double? value);
+ void set field3a(Object? value);
+ void set field3b(Object? value);
+ void set field3c(Object? value);
+ void set field4a(num? value);
+ void set field4b(Object? value);
+ void set setter1a(String x);
+ void set setter1b(Object x);
+ void set setter1c(int x);
+}
+
+abstract class C implements A<int>, B<num> {
+ final field1a = null;
+ final field1b = null;
+ final field1c = null;
+ final field2a = null;
+ final field2b = null;
+ final field2c = null;
+ final field3a = null;
+ final field3b = null;
+ final field3c = null;
+ get getter1a;
+ get getter1b;
+ get getter1c;
+ get getter1d;
+ get getter1e;
+ method1a(x);
+ method1b(x);
+ method1d();
+ method7a(o, {named});
+ var field4a = null;
+ var field4b = null;
+ void method1c(x);
+ void method2a(x);
+ void method2b(x);
+ void method3a<CT3a>(x);
+ void method3b<CT3b>(x, [y]);
+ void method4a<CT4a>(x, y);
+ void method4b<CT4b>(x, y, [z]);
+ void method5a(x, y);
+ void method5b(num x, num y, [z]);
+ void method6a({x, y});
+ void method6b({x, y, z});
+ void set setter1a(x);
+ void set setter1b(x);
+ void set setter1c(x);
+ void set setter1d(x);
+ void set setter1e(x);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method1c(x); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+// void method1c(int x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+// void method1c(String x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// method1d(); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+// String method1d();
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+// int method1d();
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5b(num x, num y, [z]); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+// void method5b(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+// void method5b(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// get getter1c; // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+// String get getter1c;
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+// int get getter1c;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field1c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+// int? get field1c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+// double? get field1c;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field2c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field3c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+// int? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+// double? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// var field4b = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void set setter1c(x); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+// void set setter1c(String x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+// void set setter1c(int x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::AT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::String x) → core::Object;
+ abstract method method1c(core::int x) → void;
+ abstract method method1d() → core::String;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(dynamic x) → void;
+ abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+ abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+ abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method5a(core::int x, core::num y) → void;
+ abstract method method5b(core::int x, core::num y) → void;
+ abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+ method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+ abstract get getter1a() → core::Object;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → core::String;
+ abstract set getter1d(core::String x) → void;
+ abstract get getter1e() → core::int;
+ abstract set getter1e(core::int x) → void;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::String x) → void;
+ abstract set setter1c(core::String x) → void;
+ abstract get setter1d() → core::String;
+ abstract get setter1e() → core::int;
+ abstract set setter1e(core::int x) → void;
+ abstract get field1a() → core::int?;
+ abstract get field1b() → core::num?;
+ abstract get field1c() → core::int?;
+ abstract set field2a(core::int? value) → void;
+ abstract set field2b(core::num? value) → void;
+ abstract set field2c(core::int? value) → void;
+ abstract get field3a() → core::int?;
+ abstract get field3b() → core::num?;
+ abstract get field3c() → core::int?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract get field4a() → core::num?;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::B<self::B::BT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::String x) → core::Object;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(core::String x) → void;
+ abstract method method1d() → core::int;
+ abstract method method2a(dynamic x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+ abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+ abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method5a(core::num x, core::int y) → void;
+ abstract method method5b(core::num x, core::int y) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+ abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::Object;
+ abstract get getter1c() → core::int;
+ abstract set getter1d(core::Object x) → void;
+ abstract get getter1e() → core::num;
+ abstract set getter1e(core::Object x) → void;
+ abstract set setter1a(core::String x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(core::int x) → void;
+ abstract get setter1d() → core::Object;
+ abstract get setter1e() → core::num;
+ abstract set setter1e(core::Object x) → void;
+ abstract get field1a() → core::num?;
+ abstract get field1b() → core::int?;
+ abstract get field1c() → core::double?;
+ abstract set field2a(core::num? value) → void;
+ abstract set field2b(core::int? value) → void;
+ abstract set field2c(core::double? value) → void;
+ abstract get field3a() → core::num?;
+ abstract get field3b() → core::int?;
+ abstract get field3c() → core::double?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract set field4a(core::num? value) → void;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+ final field core::int? field1a = null;
+ final field core::int? field1b = null;
+ final field invalid-type field1c = null;
+ final field core::num? field2a = null;
+ final field core::num? field2b = null;
+ final field invalid-type field2c = null;
+ final field core::int? field3a = null;
+ final field core::int? field3b = null;
+ final field invalid-type field3c = null;
+ field core::num? field4a = null;
+ field invalid-type field4b = null;
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(invalid-type x) → void;
+ abstract method method1d() → invalid-type;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+ abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+ abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+ abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+ abstract method method5a(invalid-type x, invalid-type y) → void;
+ abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+ abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → invalid-type;
+ abstract get getter1d() → core::Object;
+ abstract get getter1e() → core::int;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(invalid-type x) → void;
+ abstract set setter1d(core::String x) → void;
+ abstract set setter1e(core::Object x) → void;
+ abstract forwarding-stub set getter1d(core::Object x) → void;
+ abstract forwarding-stub set getter1e(core::Object x) → void;
+ abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
new file mode 100644
index 0000000..71e2237
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/override_inference.dart.weak.transformed.expect
@@ -0,0 +1,296 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:114:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method1c(x); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:10:8: Context: This is one of the overridden members.
+// void method1c(int x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:62:8: Context: This is one of the overridden members.
+// void method1c(String x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:115:3: Error: Can't infer a return type for 'method1d' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// method1d(); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:11:10: Context: This is one of the overridden members.
+// String method1d();
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:63:7: Context: This is one of the overridden members.
+// int method1d();
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:17: Error: Can't infer a type for 'x' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:122:20: Error: Can't infer a type for 'y' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5a(x, y); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:18:8: Context: This is one of the overridden members.
+// void method5a(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:70:8: Context: This is one of the overridden members.
+// void method5a(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:123:32: Error: Can't infer a type for 'z' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void method5b(num x, num y, [z]); // error
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:19:8: Context: This is one of the overridden members.
+// void method5b(int x, num y);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:71:8: Context: This is one of the overridden members.
+// void method5b(num x, int y);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:130:7: Error: Can't infer a return type for 'getter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// get getter1c; // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:26:14: Context: This is one of the overridden members.
+// String get getter1c;
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:78:11: Context: This is one of the overridden members.
+// int get getter1c;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:142:9: Error: Can't infer a type for 'field1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field1c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:40:12: Context: This is one of the overridden members.
+// int? get field1c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:92:15: Context: This is one of the overridden members.
+// double? get field1c;
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:146:9: Error: Can't infer a type for 'field2c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field2c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:150:9: Error: Can't infer a type for 'field3c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// final field3c = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:48:12: Context: This is one of the overridden members.
+// int? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:100:15: Context: This is one of the overridden members.
+// double? get field3c;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:52:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:104:12: Context: This is one of the overridden members.
+// void set field3c(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:153:7: Error: Can't infer a type for 'field4b' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// var field4b = null; // error
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:55:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:107:12: Context: This is one of the overridden members.
+// num? get field4b;
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:56:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:108:12: Context: This is one of the overridden members.
+// void set field4b(Object? value);
+// ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:136:12: Error: Can't infer a return type for 'setter1c' as the overridden members don't have a combined signature.
+// Try adding an explicit type.
+// void set setter1c(x); // error
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:33:12: Context: This is one of the overridden members.
+// void set setter1c(String x);
+// ^^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:85:12: Context: This is one of the overridden members.
+// void set setter1c(int x);
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/override_inference.dart:111:16: Error: Class 'C' inherits multiple members named 'field2c' with incompatible signatures.
+// Try adding a declaration of 'field2c' to 'C'.
+// abstract class C implements A<int>, B<num> {
+// ^
+// pkg/front_end/testcases/nnbd/override_inference.dart:44:12: Context: This is one of the overridden members.
+// void set field2c(int? value);
+// ^^^^^^^
+// pkg/front_end/testcases/nnbd/override_inference.dart:96:12: Context: This is one of the overridden members.
+// void set field2c(double? value);
+// ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+abstract class A<AT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::A<self::A::AT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::String x) → core::Object;
+ abstract method method1c(core::int x) → void;
+ abstract method method1d() → core::String;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(dynamic x) → void;
+ abstract method method3a<AT3a extends core::Object? = dynamic>(self::A::method3a::AT3a% x) → void;
+ abstract method method3b<AT3b extends core::Object? = dynamic>(self::A::method3b::AT3b% x) → void;
+ abstract method method4a<AT4a extends core::Object? = dynamic>(self::A::method4a::AT4a% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method4b<AT4b extends core::Object? = dynamic>(self::A::method4b::AT4b% x, generic-covariant-impl self::A::AT% y) → void;
+ abstract method method5a(core::int x, core::num y) → void;
+ abstract method method5b(core::int x, core::num y) → void;
+ abstract method method6a({core::int x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::num y = #C1, core::int x = #C1}) → void;
+ method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object? {}
+ abstract get getter1a() → core::Object;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → core::String;
+ abstract set getter1d(core::String x) → void;
+ abstract get getter1e() → core::int;
+ abstract set getter1e(core::int x) → void;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::String x) → void;
+ abstract set setter1c(core::String x) → void;
+ abstract get setter1d() → core::String;
+ abstract get setter1e() → core::int;
+ abstract set setter1e(core::int x) → void;
+ abstract get field1a() → core::int?;
+ abstract get field1b() → core::num?;
+ abstract get field1c() → core::int?;
+ abstract set field2a(core::int? value) → void;
+ abstract set field2b(core::num? value) → void;
+ abstract set field2c(core::int? value) → void;
+ abstract get field3a() → core::int?;
+ abstract get field3b() → core::num?;
+ abstract get field3c() → core::int?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract get field4a() → core::num?;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class B<BT extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → self::B<self::B::BT%>
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::String x) → core::Object;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(core::String x) → void;
+ abstract method method1d() → core::int;
+ abstract method method2a(dynamic x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<BT3a extends core::Object? = dynamic>(self::B::method3a::BT3a% x) → void;
+ abstract method method3b<BT3b extends core::Object? = dynamic>(self::B::method3b::BT3b% x) → void;
+ abstract method method4a<BT4a extends core::Object? = dynamic>(self::B::method4a::BT4a% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method4b<BT4b extends core::Object? = dynamic>(self::B::method4b::BT4b% x, generic-covariant-impl self::B::BT% y) → void;
+ abstract method method5a(core::num x, core::int y) → void;
+ abstract method method5b(core::num x, core::int y) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1}) → void;
+ abstract method method7a(FutureOr<dynamic>o, {FutureOr<dynamic>named = #C1}) → FutureOr<dynamic>;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::Object;
+ abstract get getter1c() → core::int;
+ abstract set getter1d(core::Object x) → void;
+ abstract get getter1e() → core::num;
+ abstract set getter1e(core::Object x) → void;
+ abstract set setter1a(core::String x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(core::int x) → void;
+ abstract get setter1d() → core::Object;
+ abstract get setter1e() → core::num;
+ abstract set setter1e(core::Object x) → void;
+ abstract get field1a() → core::num?;
+ abstract get field1b() → core::int?;
+ abstract get field1c() → core::double?;
+ abstract set field2a(core::num? value) → void;
+ abstract set field2b(core::int? value) → void;
+ abstract set field2c(core::double? value) → void;
+ abstract get field3a() → core::num?;
+ abstract get field3b() → core::int?;
+ abstract get field3c() → core::double?;
+ abstract set field3a(core::Object? value) → void;
+ abstract set field3b(core::Object? value) → void;
+ abstract set field3c(core::Object? value) → void;
+ abstract set field4a(core::num? value) → void;
+ abstract get field4b() → core::num?;
+ abstract set field4b(core::Object? value) → void;
+}
+abstract class C extends core::Object implements self::A<core::int>, self::B<core::num> {
+ final field core::int? field1a = null;
+ final field core::int? field1b = null;
+ final field invalid-type field1c = null;
+ final field core::num? field2a = null;
+ final field core::num? field2b = null;
+ final field invalid-type field2c = null;
+ final field core::int? field3a = null;
+ final field core::int? field3b = null;
+ final field invalid-type field3c = null;
+ field core::num? field4a = null;
+ field invalid-type field4b = null;
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ abstract method method1a(core::Object x) → core::String;
+ abstract method method1b(core::Object x) → core::String;
+ abstract method method1c(invalid-type x) → void;
+ abstract method method1d() → invalid-type;
+ abstract method method2a(core::Object? x) → void;
+ abstract method method2b(core::Object? x) → void;
+ abstract method method3a<CT3a extends core::Object? = dynamic>(self::C::method3a::CT3a% x) → void;
+ abstract method method3b<CT3b extends core::Object? = dynamic>(self::C::method3b::CT3b% x, [dynamic y = #C1]) → void;
+ abstract method method4a<CT4a extends core::Object? = dynamic>(self::C::method4a::CT4a% x, generic-covariant-impl core::num y) → void;
+ abstract method method4b<CT4b extends core::Object? = dynamic>(self::C::method4b::CT4b% x, generic-covariant-impl core::num y, [dynamic z = #C1]) → void;
+ abstract method method5a(invalid-type x, invalid-type y) → void;
+ abstract method method5b(core::num x, core::num y, [invalid-type z = #C1]) → void;
+ abstract method method6a({core::Object x = #C1, core::num y = #C1}) → void;
+ abstract method method6b({core::int x = #C1, core::Object y = #C1, dynamic z = #C1}) → void;
+ abstract method method7a(core::Object? o, {core::Object? named = #C1}) → core::Object?;
+ abstract get getter1a() → core::String;
+ abstract get getter1b() → core::String;
+ abstract get getter1c() → invalid-type;
+ abstract get getter1d() → core::Object;
+ abstract get getter1e() → core::int;
+ abstract set setter1a(core::Object x) → void;
+ abstract set setter1b(core::Object x) → void;
+ abstract set setter1c(invalid-type x) → void;
+ abstract set setter1d(core::String x) → void;
+ abstract set setter1e(core::Object x) → void;
+ abstract forwarding-stub set getter1d(core::Object x) → void;
+ abstract forwarding-stub set getter1e(core::Object x) → void;
+ abstract forwarding-stub set field2a(core::num? value) → void;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
index 9036823..6a9e27e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.outline.expect
@@ -34,10 +34,6 @@
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-// ^
-//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.expect
@@ -36,10 +36,6 @@
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-// ^
-//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.strong.transformed.expect
@@ -36,10 +36,6 @@
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-// ^
-//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
@@ -36,10 +36,6 @@
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-// ^
-//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
index 0c2e596..9762f48 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
@@ -36,10 +36,6 @@
// void method([int i]) {}
// ^
//
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
-// external void patchedMethod([int i]);
-// ^
-//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
index 48c54ae..c941a64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
@@ -12,7 +12,7 @@
iss::takesNever(null);
iss::takesNever(nil);
iss::takesTakesNull(#C1);
- iss::f = (Never* x) → core::Null? {};
+ iss::f = (core::Null? x) → core::Null? {};
}
library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
index 48c54ae..c941a64 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
@@ -12,7 +12,7 @@
iss::takesNever(null);
iss::takesNever(nil);
iss::takesTakesNull(#C1);
- iss::f = (Never* x) → core::Null? {};
+ iss::f = (core::Null? x) → core::Null? {};
}
library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
index 1d9981b..4f30ec5 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart
@@ -9,7 +9,17 @@
Never optOutNever;
var inferredOptOutNever = optInNever;
+genericMethod<T>() {}
+
+class GenericClass<T> {}
+
main() {
+ optInNever = optOutNever;
+
+ Type typeNever = Never;
+ genericMethod<Never>();
+ new GenericClass<Never>();
+
Never localNever = null;
Null localNull = null;
var inferredLocalNever = optInNever;
@@ -62,6 +72,15 @@
throws(() => optInNever = throwing());
throws(() => inferredOptOutNever = throwing());
throws(() => inferredLocalNever = throwing());
+
+ var boundedGenericClass = new BoundedGenericClass();
+ throws(() {
+ var boundedGenericMethodResult1 = boundedGenericMethod1();
+ });
+ var boundedGenericMethodResult2 = boundedGenericMethod2();
+
+ dynamic dyn = null;
+ optInNever = dyn;
}
class B extends A {
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
index 0630e92..fc4c4c0 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline.expect
@@ -3,6 +3,10 @@
Never optOutNever;
var inferredOptOutNever = optInNever;
+genericMethod<T>() {}
+
+class GenericClass<T> {}
+
main() {}
class B extends A {
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
index 26f5017..c9f7109 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.textual_outline_modelled.expect
@@ -25,6 +25,9 @@
void set nullProperty(Never value) {}
}
+class GenericClass<T> {}
+
+genericMethod<T>() {}
main() {}
throws(void Function() f) {}
var inferredOptOutNever = optInNever;
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 1977f90..4852b17 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -1,10 +1,25 @@
library;
import self as self;
-import "never_opt_out_lib.dart" as nev;
import "dart:core" as core;
+import "never_opt_out_lib.dart" as nev;
import "org-dartlang-testcase:///never_opt_out_lib.dart";
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+ : super core::Object::•()
+ ;
+ 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 nev::A {
field core::Null? neverField = null;
field core::Null? nullField = null;
@@ -33,21 +48,21 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class C extends nev::A {
- field Never* neverField = null;
- field Never* nullField = null;
+ field core::Null? neverField = null;
+ field core::Null? nullField = null;
synthetic constructor •() → self::C*
: super nev::A::•()
;
- method neverMethod(Never* value) → Never*
+ method neverMethod(core::Null? value) → core::Null?
return value;
- get neverProperty() → Never*
+ get neverProperty() → core::Null?
return null;
- set neverProperty(Never* value) → void {}
- method nullMethod(Never* value) → Never*
+ set neverProperty(core::Null? value) → void {}
+ method nullMethod(core::Null? value) → core::Null?
return value;
- get nullProperty() → Never*
+ get nullProperty() → core::Null?
return null;
- set nullProperty(Never* value) → void {}
+ set nullProperty(core::Null? 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
@@ -59,10 +74,15 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
-static field Never* optOutNever;
+static field core::Null? optOutNever;
static field dynamic inferredOptOutNever = nev::optInNever;
+static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
static method main() → dynamic {
- Never* localNever = null;
+ nev::optInNever = self::optOutNever;
+ core::Type* typeNever = core::Null?;
+ self::genericMethod<core::Null?>();
+ new self::GenericClass::•<core::Null?>();
+ core::Null? localNever = null;
core::Null? localNull = null;
dynamic inferredLocalNever = nev::optInNever;
localNever = localNever;
@@ -89,14 +109,14 @@
localNull = localNull;
self::inferredOptOutNever = localNull;
inferredLocalNever = localNull;
- localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
- self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+ localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+ self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
self::inferredOptOutNever = self::inferredOptOutNever;
inferredLocalNever = self::inferredOptOutNever;
- localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
- self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+ localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+ self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
self::inferredOptOutNever = inferredLocalNever;
@@ -107,6 +127,13 @@
self::throws(() → core::Null? => nev::optInNever = nev::throwing());
self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
+ nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
+ self::throws(() → core::Null? {
+ dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+ });
+ core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+ dynamic dyn = null;
+ nev::optInNever = dyn as{TypeError,ForDynamic} Never;
}
static method throws(() →* void f) → dynamic {
try {
@@ -122,7 +149,6 @@
import self as nev;
import "dart:core" as core;
import "dart:_internal" as _in;
-import "never_opt_out.dart" as self;
import "org-dartlang-testcase:///never_opt_out.dart";
@@ -143,6 +169,15 @@
return null;
set nullProperty(core::Null? value) → void {}
}
-static field Never optInNever = self::optOutNever;
+class BoundedGenericClass<T extends Never = Never> extends core::Object {
+ synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
+ : super core::Object::•()
+ ;
+}
+late static field Never optInNever;
static method throwing() → Never
return throw "Never!";
+static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+ return throw "Should never return";
+static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+ return <nev::boundedGenericMethod2::T>[];
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index 1977f90..9428bc8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -1,10 +1,25 @@
library;
import self as self;
-import "never_opt_out_lib.dart" as nev;
import "dart:core" as core;
+import "never_opt_out_lib.dart" as nev;
import "org-dartlang-testcase:///never_opt_out_lib.dart";
+class GenericClass<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
+ : super core::Object::•()
+ ;
+ 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 nev::A {
field core::Null? neverField = null;
field core::Null? nullField = null;
@@ -33,21 +48,21 @@
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class C extends nev::A {
- field Never* neverField = null;
- field Never* nullField = null;
+ field core::Null? neverField = null;
+ field core::Null? nullField = null;
synthetic constructor •() → self::C*
: super nev::A::•()
;
- method neverMethod(Never* value) → Never*
+ method neverMethod(core::Null? value) → core::Null?
return value;
- get neverProperty() → Never*
+ get neverProperty() → core::Null?
return null;
- set neverProperty(Never* value) → void {}
- method nullMethod(Never* value) → Never*
+ set neverProperty(core::Null? value) → void {}
+ method nullMethod(core::Null? value) → core::Null?
return value;
- get nullProperty() → Never*
+ get nullProperty() → core::Null?
return null;
- set nullProperty(Never* value) → void {}
+ set nullProperty(core::Null? 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
@@ -59,10 +74,15 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
-static field Never* optOutNever;
+static field core::Null? optOutNever;
static field dynamic inferredOptOutNever = nev::optInNever;
+static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
static method main() → dynamic {
- Never* localNever = null;
+ nev::optInNever = self::optOutNever;
+ core::Type* typeNever = core::Null?;
+ self::genericMethod<core::Null?>();
+ new self::GenericClass::•<core::Null?>();
+ core::Null? localNever = null;
core::Null? localNull = null;
dynamic inferredLocalNever = nev::optInNever;
localNever = localNever;
@@ -89,14 +109,14 @@
localNull = localNull;
self::inferredOptOutNever = localNull;
inferredLocalNever = localNull;
- localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
- self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
+ localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+ self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
self::inferredOptOutNever = self::inferredOptOutNever;
inferredLocalNever = self::inferredOptOutNever;
- localNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
- self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
+ localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+ self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
self::inferredOptOutNever = inferredLocalNever;
@@ -107,6 +127,13 @@
self::throws(() → core::Null? => nev::optInNever = nev::throwing());
self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
+ nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
+ self::throws(() → core::Null? {
+ dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+ });
+ core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+ dynamic dyn = null;
+ nev::optInNever = dyn as{TypeError,ForDynamic} Never;
}
static method throws(() →* void f) → dynamic {
try {
@@ -122,7 +149,6 @@
import self as nev;
import "dart:core" as core;
import "dart:_internal" as _in;
-import "never_opt_out.dart" as self;
import "org-dartlang-testcase:///never_opt_out.dart";
@@ -143,6 +169,20 @@
return null;
set nullProperty(core::Null? value) → void {}
}
-static field Never optInNever = self::optOutNever;
+class BoundedGenericClass<T extends Never = Never> extends core::Object {
+ synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
+ : super core::Object::•()
+ ;
+}
+late static field Never optInNever;
static method throwing() → Never
return throw "Never!";
+static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
+ return throw "Should never return";
+static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
+ return <nev::boundedGenericMethod2::T>[];
+
+
+Extra constant evaluation status:
+Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null?)
+Extra constant evaluation: evaluated: 136, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
index a519e50..b2f225b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart
@@ -6,7 +6,7 @@
Never throwing() => throw 'Never!';
-Never optInNever = optOutNever;
+late Never optInNever;
class A {
Never neverField = throw "Should not reach here";
@@ -19,3 +19,9 @@
Null get nullProperty => null;
void set nullProperty(Null value) {}
}
+
+class BoundedGenericClass<T extends Never> {}
+
+T boundedGenericMethod1<T extends Never>() => throw "Should never return";
+
+List<T> boundedGenericMethod2<T extends Never>() => <T>[];
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index d26a0c2..b53cc5e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -178,6 +178,7 @@
nnbd/issue41349: FormatterCrash
nnbd/issue41597: FormatterCrash
nnbd/issue42967: FormatterCrash
+nnbd/issue43211: FormatterCrash
nnbd/issue43278: FormatterCrash
nnbd/issue43354: FormatterCrash
nnbd/late: FormatterCrash
diff --git a/tests/language/inference/inconsistent_inheritance_test.dart b/tests/language/inference/inconsistent_inheritance_test.dart
index 8ff26eb..beff18f 100644
--- a/tests/language/inference/inconsistent_inheritance_test.dart
+++ b/tests/language/inference/inconsistent_inheritance_test.dart
@@ -4,10 +4,14 @@
class A {
void f(Object x) {}
+
+ void g(Object x, String y) {}
}
class B {
void f(String x) {}
+
+ void g(String x, Object y) {}
}
class C extends A implements B {
@@ -19,6 +23,16 @@
// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'String'.
}
+
+ // No combined signature.
+ void g(x, y) {
+ // ^
+ // [analyzer] COMPILE_TIME_ERROR.NO_COMBINED_SUPER_SIGNATURE
+ // ^
+ // [cfe] Can't infer a type for 'x' as the overridden members don't have a combined signature.
+ // ^
+ // [cfe] Can't infer a type for 'y' as the overridden members don't have a combined signature.
+ }
}
void main() {}
diff --git a/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart b/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
index 7a18cec..a59bdd2 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_nnbd.dart
@@ -28,7 +28,7 @@
static late String error;
- get throwingGetter => throw error;
+ get throwingGetter => throw 'Null access';
C(this.instanceField);
}
@@ -36,20 +36,17 @@
class D extends C {
D(int field) : super(field);
- void ifNullAssignSuper(int f()) {
- super.instanceField ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceField` returns null (rather than calling `f`).
+ int ifNullAssignSuper(int f()) {
+ return super.instanceField ??= f(); // ignore: dead_null_aware_expression
}
- void ifNullAssignSuper_nullableSetter(int f()) {
- super.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceGetterSetter` returns null (rather than calling
- // `f`).
+ int ifNullAssignSuper_nullableSetter(int f()) {
+ return super.instanceGetterSetter ??=
+ f(); // ignore: dead_null_aware_expression
}
- void ifNullAssignSuperIndex(int f()) {
- super[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `super[0]` returns null (rather than calling `f`).
+ int ifNullAssignSuperIndex(int f()) {
+ return super[0] ??= f(); // ignore: dead_null_aware_expression
}
}
@@ -86,241 +83,217 @@
late Never topLevelNever;
-void neverParameter(Never n) {
- // Should throw before getting here.
+int neverParameter(Never n) {
+ return 42;
}
-void neverInitializingFormal(Never n) {
- // Should throw before getting here.
+int neverInitializingFormal(Never n) {
+ return 42;
}
-void isPromoteToNever(int i) {
- if (i is int) return;
- // Should throw if `i` is null.
+bool isPromoteToNever(int i) {
+ if (i is int) return true;
+ return false;
}
-void isPromoteToNever_noIf(int i) {
- i is int;
- // Should throw if `i` is null.
+bool isPromoteToNever_noIf(int i) {
+ return i is int;
}
-void isNotPromoteToNever(int i) {
+bool isNotPromoteToNever(int i) {
if (i is! int) {
- // Should throw if `i` is null.
+ return true;
}
+ return false;
}
-void isNotPromoteToNever_noIf(int i) {
- i is! int;
+bool isNotPromoteToNever_noIf(int i) {
+ return i is! int;
}
-void equalNullPromoteToNever(int f()) {
- if (f() == null) { // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+int equalNullPromoteToNever(int f()) {
+ if (f() == null) {
+ // ignore: unnecessary_null_comparison
+ return 42;
}
+ return 0;
}
-void equalNullPromoteToNever_noIf(int f()) {
+int equalNullPromoteToNever_noIf(int f()) {
f() == null; // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+ return 42;
}
-void notEqualNullPromoteToNever(int f()) {
- if (f() != null) return; // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+int notEqualNullPromoteToNever(int f()) {
+ if (f() != null) return 0; // ignore: unnecessary_null_comparison
+ return 42;
}
-void notEqualNullPromoteToNever_noIf(int f()) {
+int notEqualNullPromoteToNever_noIf(int f()) {
f() != null; // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+ return 42;
}
-void nullEqualPromoteToNever(int f()) {
- if (null == f()) { // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+int nullEqualPromoteToNever(int f()) {
+ if (null == f()) {
+ // ignore: unnecessary_null_comparison
+ return 42;
}
+ return 0;
}
-void nullEqualPromoteToNever_noIf(int f()) {
+int nullEqualPromoteToNever_noIf(int f()) {
null == f(); // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+ return 42;
}
-void nullNotEqualPromoteToNever(int f()) {
- if (null != f()) return; // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+int nullNotEqualPromoteToNever(int f()) {
+ if (null != f()) return 0; // ignore: unnecessary_null_comparison
+ return 42;
}
-void nullNotEqualPromoteToNever_noIf(int f()) {
+int nullNotEqualPromoteToNever_noIf(int f()) {
null != f(); // ignore: unnecessary_null_comparison
- // Should throw if `f` returns null.
+ return 42;
}
int unnecessaryIfNull(int f(), int g()) {
return f() ?? g(); // ignore: dead_null_aware_expression
- // Should throw if `f` returns null (rather than calling `g`).
}
-void ifNullAssignLocal(int local, int f()) {
- local ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `local` returns null (rather than calling `f`).
+int ifNullAssignLocal(int local, int f()) {
+ return local ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignStatic(int f()) {
- C.staticField ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `staticField` returns null (rather than calling `f`).
+int ifNullAssignStatic(int f()) {
+ return C.staticField ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignStaticGetter_nullableSetter(int f()) {
- C.staticGetterSetter ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `staticGetterSetter` returns null (rather than calling
- // `f`).
+int ifNullAssignStaticGetter_nullableSetter(int f()) {
+ return C.staticGetterSetter ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignField(C c, int f()) {
- c.instanceField ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceField` returns null (rather than calling `f`).
+int ifNullAssignField(C c, int f()) {
+ return c.instanceField ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignGetter_nullableSetter(C c, int f()) {
- c.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceGetterSetter` returns null (rather than calling
- // `f`).
+int ifNullAssignGetter_nullableSetter(C c, int f()) {
+ return c.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignGetter_implicitExtension(E e, int f()) {
- e.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceGetterSetter` returns null (rather than calling
- // `f`).
+int ifNullAssignGetter_implicitExtension(E e, int f()) {
+ return e.instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignGetter_explicitExtension(E e, int f()) {
- EExt(e).instanceGetterSetter ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceGetterSetter` returns null (rather than calling
- // `f`).
+int ifNullAssignGetter_explicitExtension(E e, int f()) {
+ return EExt(e).instanceGetterSetter ??=
+ f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignIndex(List<int> x, int f()) {
- x[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `x[0]` returns null (rather than calling `f`).
+int ifNullAssignIndex(List<int> x, int f()) {
+ return x[0] ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignIndex_nullAware(List<int>? x, int f()) {
- x?[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `x[0]` returns null (rather than calling `f`).
+int? ifNullAssignIndex_nullAware(List<int>? x, int f()) {
+ return x?[0] ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignIndex_nullableSetter(C x, int f()) {
- x[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `x[0]` returns null (rather than calling `f`).
+int ifNullAssignIndex_nullableSetter(C x, int f()) {
+ return x[0] ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignIndex_implicitExtension(E x, int f()) {
- x[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `x[0]` returns null (rather than calling `f`).
+int ifNullAssignIndex_implicitExtension(E x, int f()) {
+ return x[0] ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignIndex_explicitExtension(E x, int f()) {
- EExt(x)[0] ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `x[0]` returns null (rather than calling `f`).
+int ifNullAssignIndex_explicitExtension(E x, int f()) {
+ return EExt(x)[0] ??= f(); // ignore: dead_null_aware_expression
}
-void ifNullAssignSuper(D d, int f()) {
- d.ifNullAssignSuper(f);
+int ifNullAssignSuper(D d, int f()) {
+ return d.ifNullAssignSuper(f);
}
-void ifNullAssignSuper_nullableSetter(D d, int f()) {
- d.ifNullAssignSuper_nullableSetter(f);
+int ifNullAssignSuper_nullableSetter(D d, int f()) {
+ return d.ifNullAssignSuper_nullableSetter(f);
}
-void ifNullAssignSuperIndex(D d, int f()) {
- d.ifNullAssignSuperIndex(f);
+int ifNullAssignSuperIndex(D d, int f()) {
+ return d.ifNullAssignSuperIndex(f);
}
int? ifNullAssignNullAwareField(C? c, int f()) {
return c?.instanceField ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `instanceField` returns null (rather than calling `f`).
}
-void ifNullAssignNullAwareStatic(int f()) {
- C?.staticField ??= f(); // ignore: dead_null_aware_expression
- // Should throw if `staticField` returns null (rather than calling `f`).
+int ifNullAssignNullAwareStatic(int f()) {
+ return C?.staticField ??= f(); // ignore: dead_null_aware_expression
}
-void unnecessaryNullAwareAccess(int f(), String error) {
- f()?.gcd(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess(int f()) {
+ f()?.gcd(throw 'Null access'); // ignore: invalid_null_aware_operator
}
-void unnecessaryNullAwareAccess_cascaded(int f(), String error) {
- f()?..gcd(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded(int f()) {
+ f()?..gcd(throw 'Null access'); // ignore: invalid_null_aware_operator
}
-void unnecessaryNullAwareAccess_methodOnObject(int f(), String error) {
- f()?.toString().compareTo(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_methodOnObject(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?.toString().compareTo(throw 'Null access');
}
-void unnecessaryNullAwareAccess_cascaded_methodOnObject(int f(), String error) {
- f()?..toString().compareTo(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded_methodOnObject(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?..toString().compareTo(throw 'Null access');
}
-void unnecessaryNullAwareAccess_methodOnExtension(int f(), String error) {
- f()?.extendedMethod(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_methodOnExtension(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?.extendedMethod(throw 'Null access');
}
-void unnecessaryNullAwareAccess_cascaded_methodOnExtension(
- int f(), String error) {
- f()?..extendedMethod(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded_methodOnExtension(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?..extendedMethod(throw 'Null access');
}
-void unnecessaryNullAwareAccess_methodOnExtension_explicit(
- int f(), String error) {
- IntQExt(f())?.extendedMethod(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_methodOnExtension_explicit(int f()) {
+ // ignore: invalid_null_aware_operator
+ IntQExt(f())?.extendedMethod(throw 'Null access');
}
-void unnecessaryNullAwareAccess_getter(C f(), String error) {
- C.error = error;
+void unnecessaryNullAwareAccess_getter(C f()) {
f()?.throwingGetter; // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
}
-void unnecessaryNullAwareAccess_cascaded_getter(C f(), String error) {
- C.error = error;
+void unnecessaryNullAwareAccess_cascaded_getter(C f()) {
f()?..throwingGetter; // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
}
-void unnecessaryNullAwareAccess_getterOnObject(int f(), String error) {
- f()?.hashCode.remainder(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_getterOnObject(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?.hashCode.remainder(throw 'Null access');
}
-void unnecessaryNullAwareAccess_cascaded_getterOnObject(int f(), String error) {
- f()?..hashCode.remainder(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded_getterOnObject(int f()) {
+// ignore: invalid_null_aware_operator
+ f()?..hashCode.remainder(throw 'Null access');
}
-void unnecessaryNullAwareAccess_getterOnExtension(int f(), String error) {
- f()?.extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_getterOnExtension(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?.extendedGetter.remainder(throw 'Null access');
}
-void unnecessaryNullAwareAccess_cascaded_getterOnExtension(
- int f(), String error) {
- f()?..extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_cascaded_getterOnExtension(int f()) {
+ // ignore: invalid_null_aware_operator
+ f()?..extendedGetter.remainder(throw 'Null access');
}
-void unnecessaryNullAwareAccess_getterOnExtension_explicit(
- int f(), String error) {
- IntQExt(f())?.extendedGetter.remainder(throw error); // ignore: invalid_null_aware_operator
- // Should throw if `f` returns null.
+void unnecessaryNullAwareAccess_getterOnExtension_explicit(int f()) {
+ // ignore: invalid_null_aware_operator
+ IntQExt(f())?.extendedGetter.remainder(throw 'Null access');
}
void getterReturnsNever(A a) {
@@ -353,14 +326,14 @@
// Should throw if `method` completes normally.
}
-void switchOnBool(bool b) {
+int switchOnBool(bool b) {
switch (b) {
case true:
- return;
+ return 0;
case false:
- return;
+ return 1;
}
- // Should throw if the implicit `default` branch is taken.
+ return 42;
}
void switchOnEnum(Hand hand) {
diff --git a/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart b/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
index d3f2d71..810a435 100644
--- a/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
+++ b/tests/language/nnbd/flow_analysis/never_runtime_check_test.dart
@@ -22,221 +22,72 @@
}
main() {
- Expect.throws(() {
- neverParameter(null);
- });
+ Expect.equals(42, neverParameter(null));
- Expect.throws(() {
- NeverField().n = null;
- });
+ var neverField = NeverField.initializingFormal(null);
+ // Write.
+ Expect.equals(null, neverField.n = null);
+ // Read.
+ Expect.equals(null, neverField.n);
- Expect.throws(() {
- // Write.
- topLevelNever = null;
- });
+ // Write.
+ Expect.equals(null, topLevelNever = null);
+ // Read.
+ Expect.equals(null, topLevelNever);
- Expect.throws(() {
- // Read.
- topLevelNever;
- });
+ Expect.isFalse(isPromoteToNever(null));
+ Expect.isFalse(isPromoteToNever_noIf(null));
+ Expect.isTrue(isNotPromoteToNever(null));
+ Expect.isTrue(isNotPromoteToNever_noIf(null));
+ Expect.equals(42, equalNullPromoteToNever(() => null));
+ Expect.equals(42, equalNullPromoteToNever_noIf(() => null));
+ Expect.equals(42, notEqualNullPromoteToNever(() => null));
+ Expect.equals(42, notEqualNullPromoteToNever_noIf(() => null));
+ Expect.equals(42, nullEqualPromoteToNever(() => null));
+ Expect.equals(42, nullEqualPromoteToNever_noIf(() => null));
+ Expect.equals(42, nullNotEqualPromoteToNever(() => null));
+ Expect.equals(42, nullNotEqualPromoteToNever_noIf(() => null));
+ Expect.equals(42, unnecessaryIfNull(() => null, () => 42));
+ Expect.equals(42, ifNullAssignLocal(null, () => 42));
- Expect.throws(() {
- NeverField.initializingFormal(null);
- });
+ // Write.
+ Expect.equals(null, C.staticField = null);
- Expect.throws(() {
- isPromoteToNever(null);
- });
+ // Read.
+ Expect.equals(null, C.staticField);
- Expect.throws(() {
- isPromoteToNever_noIf(null);
- });
+ Expect.equals(42, ifNullAssignStatic(() => 42));
+ Expect.equals(42, ifNullAssignStaticGetter_nullableSetter(() => 42));
+ Expect.equals(42, ifNullAssignField(C(null), () => 42));
+ Expect.equals(42, ifNullAssignGetter_nullableSetter(C(null), () => 42));
+ Expect.equals(42, ifNullAssignGetter_implicitExtension(E(null), () => 42));
+ Expect.equals(42, ifNullAssignGetter_explicitExtension(E(null), () => 42));
+ Expect.equals(42, ifNullAssignIndex(<int>[null], () => 42));
+ Expect.equals(42, ifNullAssignIndex_nullAware(<int>[null], () => 42));
+ Expect.equals(42, ifNullAssignIndex_nullableSetter(C(null), () => 42));
+ Expect.equals(42, ifNullAssignIndex_implicitExtension(E(null), () => 42));
+ Expect.equals(42, ifNullAssignIndex_explicitExtension(E(null), () => 42));
+ Expect.equals(42, ifNullAssignSuper(D(null), () => 42));
+ Expect.equals(42, ifNullAssignSuper_nullableSetter(D(null), () => 42));
+ Expect.equals(42, ifNullAssignSuperIndex(D(null), () => 42));
+ Expect.equals(42, ifNullAssignNullAwareField(C(null), () => 42));
+ Expect.equals(null, ifNullAssignNullAwareField(null, () => 42));
+ Expect.equals(42, ifNullAssignNullAwareStatic(() => 42));
- Expect.throws(() {
- isNotPromoteToNever(null);
- });
-
- Expect.throws(() {
- isNotPromoteToNever_noIf(null);
- });
-
- Expect.throws(() {
- equalNullPromoteToNever(() => null);
- });
-
- Expect.throws(() {
- equalNullPromoteToNever_noIf(() => null);
- });
-
- Expect.throws(() {
- notEqualNullPromoteToNever(() => null);
- });
-
- Expect.throws(() {
- notEqualNullPromoteToNever_noIf(() => null);
- });
-
- Expect.throws(() {
- nullEqualPromoteToNever(() => null);
- });
-
- Expect.throws(() {
- nullEqualPromoteToNever_noIf(() => null);
- });
-
- Expect.throws(() {
- nullNotEqualPromoteToNever(() => null);
- });
-
- Expect.throws(() {
- nullNotEqualPromoteToNever_noIf(() => null);
- });
-
- Expect.throws(() {
- unnecessaryIfNull(() => null, () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignLocal(null, () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- C.staticField = null;
- Expect.throws(() {
- ifNullAssignStatic(() => throw "should not reach");
- }, (error) => error != "should not reach");
-
- C.staticField = null;
- Expect.throws(() {
- ifNullAssignStaticGetter_nullableSetter(() => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignField(C(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignGetter_nullableSetter(C(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignGetter_implicitExtension(
- E(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignGetter_explicitExtension(
- E(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignIndex(<int>[null], () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignIndex_nullAware(<int>[null], () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignIndex_nullableSetter(C(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignIndex_implicitExtension(
- E(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignIndex_explicitExtension(
- E(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignSuper(D(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignSuper_nullableSetter(D(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignSuperIndex(D(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- ifNullAssignNullAwareField(C(null), () => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.equals(
- ifNullAssignNullAwareField(null, () => throw "should not reach"), null);
-
- C.staticField = null;
- Expect.throws(() {
- ifNullAssignNullAwareStatic(() => throw "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_methodOnObject(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded_methodOnObject(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_methodOnExtension(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded_methodOnExtension(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_methodOnExtension_explicit(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_getter(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded_getter(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_getterOnObject(() => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded_getterOnObject(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_getterOnExtension(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_cascaded_getterOnExtension(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
-
- Expect.throws(() {
- unnecessaryNullAwareAccess_getterOnExtension_explicit(
- () => null, "should not reach");
- }, (error) => error != "should not reach");
+ unnecessaryNullAwareAccess(() => null);
+ unnecessaryNullAwareAccess_methodOnObject(() => null);
+ unnecessaryNullAwareAccess_cascaded_methodOnObject(() => null);
+ unnecessaryNullAwareAccess_methodOnExtension(() => null);
+ unnecessaryNullAwareAccess_cascaded_methodOnExtension(() => null);
+ unnecessaryNullAwareAccess_methodOnExtension_explicit(() => null);
+ unnecessaryNullAwareAccess_getter(() => null);
+ unnecessaryNullAwareAccess_cascaded(() => null);
+ unnecessaryNullAwareAccess_cascaded_getter(() => null);
+ unnecessaryNullAwareAccess_getterOnObject(() => null);
+ unnecessaryNullAwareAccess_cascaded_getterOnObject(() => null);
+ unnecessaryNullAwareAccess_getterOnExtension(() => null);
+ unnecessaryNullAwareAccess_cascaded_getterOnExtension(() => null);
+ unnecessaryNullAwareAccess_getterOnExtension_explicit(() => null);
Expect.throws(() {
getterReturnsNever(AImpl());
@@ -262,11 +113,22 @@
returnsNeverInVariable(AImpl());
});
- Expect.throws(() {
- switchOnBool(null);
- });
+ Expect.equals(42, switchOnBool(null));
Expect.throws(() {
switchOnEnum(null);
});
}
+
+bool isCalled;
+
+registerCallAndReturnNull() {
+ isCalled = true;
+ return null;
+}
+
+expectCall(void Function() f) {
+ isCalled = false;
+ f();
+ Expect.isTrue(isCalled);
+}
diff --git a/tests/language/null_aware/prefix_not_shortening_test.dart b/tests/language/null_aware/prefix_not_shortening_test.dart
new file mode 100644
index 0000000..20ef1af
--- /dev/null
+++ b/tests/language/null_aware/prefix_not_shortening_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+class C {
+ C e() => this;
+ C operator -() => this;
+ C operator ~() => this;
+}
+
+void main() {
+ final C? c = new C();
+ /**/ -c?.e();
+ // ^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+ // ^
+ // [cfe] Operator 'unary-' cannot be called on 'C?' because it is potentially null.
+
+ /**/ ~c?.e();
+ // ^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
+ // ^
+ // [cfe] Operator '~' cannot be called on 'C?' because it is potentially null.
+}
diff --git a/tests/language/operator/invalid_operators_test.dart b/tests/language/operator/invalid_operators_test.dart
index 52eae80..badafb5 100644
--- a/tests/language/operator/invalid_operators_test.dart
+++ b/tests/language/operator/invalid_operators_test.dart
@@ -572,13 +572,15 @@
operator ==<T>(a) => true;
// ^^
// [analyzer] COMPILE_TIME_ERROR.INVALID_OVERRIDE
- // [cfe] Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
+ // [cfe] Can't infer a return type for '==' as the overridden members don't have a combined signature.
// ^
- // [cfe] The return type of the method 'Operators7.==' is 'dynamic', which does not match the return type, 'bool', of the overridden method, 'Object.=='.
+ // [cfe] Declared type variables of 'Operators7.==' doesn't match those on overridden method 'Object.=='.
// ^^^
// [analyzer] SYNTACTIC_ERROR.TYPE_PARAMETERS_ON_OPERATOR
// ^
// [cfe] Types parameters aren't allowed when defining an operator.
+ // ^
+ // [cfe] Can't infer a type for 'a' as the overridden members don't have a combined signature.
operator ><T>(a) => true;
// ^^^
// [analyzer] SYNTACTIC_ERROR.TYPE_PARAMETERS_ON_OPERATOR
@@ -675,7 +677,7 @@
/*space*/ int operator []=(a, b) => 1;
// ^^^
// [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_OPERATOR
- // [cfe] unspecified
+ // [cfe] The return type of the operator []= must be 'void'.
}
main() {}
diff --git a/tools/VERSION b/tools/VERSION
index 178e41b..b4ac9ab 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 201
+PRERELEASE 202
PRERELEASE_PATCH 0
\ No newline at end of file