Version 2.10.0-2.0.dev
Merge commit 'ca743398c2145c8147f5e6cbaba1416d8643b66e' into dev
diff --git a/DEPS b/DEPS
index 85f2bd0..c9fc55e 100644
--- a/DEPS
+++ b/DEPS
@@ -44,11 +44,11 @@
# co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
# hashes. It requires access to the dart-build-access group, which EngProd
# has.
- "co19_rev": "d79951e06e443213243e54c2c32694b79a221b65",
- "co19_2_rev": "620c1148c8b7a3d7f74afacf348c46f109eb64f2",
+ "co19_rev": "86c948fbe7c8a9e74f572038f2ec70dfce7f20b0",
+ "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
# The internal benchmarks to use. See go/dart-benchmarks-internal
- "benchmarks_internal_rev": "0e59a6bc3ee912273865b87709cdb698be358e30",
+ "benchmarks_internal_rev": "9bc9e373b3d3cacdd7aba906caea77075c6cd2e3",
"checkout_benchmarks_internal": False,
# As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
@@ -79,7 +79,7 @@
"collection_rev": "583693680fc067e34ca5b72503df25e8b80579f9",
"convert_rev": "49bde5b371eb5c2c8e721557cf762f17c75e49fc",
"crypto_rev": "7422fb2f6584fe1839eb30bc4ca56e9f9760b801",
- "csslib_rev": "bf372d4fdc6dfa232ad93f77a0a3de0891edd04c",
+ "csslib_rev": "451448a9ac03f87a8d0377fc0b411d8c388a6cb4",
"dart2js_info_tag" : "0.6.0",
# Note: Updates to dart_style have to be coordinated with the infrastructure
@@ -97,7 +97,7 @@
"dart_style_tag": "1.3.6", # Please see the note above before updating.
"chromedriver_tag": "83.0.4103.39",
- "dartdoc_tag" : "v0.32.2",
+ "dartdoc_rev" : "6d5396c2b4bc415ab9cb3d8212b87ecffd90a272",
"ffi_rev": "454ab0f9ea6bd06942a983238d8a6818b1357edb",
"fixnum_rev": "300c3f025e94a72b7b6770e15f76a4de15f77668",
"glob_rev": "e9f4e6b7ae8abe5071461cf8f47191bb19cf7ef6",
@@ -116,7 +116,7 @@
"linter_tag": "0.1.117",
"logging_rev": "9561ba016ae607747ae69b846c0e10958ca58ed4",
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
- "markdown_rev": "dd150bb64c5f3b41d31f20f399ae2a855f7f8c00",
+ "markdown_rev": "acaddfe74217f62498b5cf0cf5429efa6a700be3",
"matcher_rev": "9cae8faa7868bf3a88a7ba45eb0bd128e66ac515",
"mime_rev": "179b5e6a88f4b63f36dc1b8fcbc1e83e5e0cd3a7",
"mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
@@ -326,7 +326,7 @@
Var("dart_root") + "/third_party/pkg/dart2js_info":
Var("dart_git") + "dart2js_info.git" + "@" + Var("dart2js_info_tag"),
Var("dart_root") + "/third_party/pkg/dartdoc":
- Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_tag"),
+ Var("dart_git") + "dartdoc.git" + "@" + Var("dartdoc_rev"),
Var("dart_root") + "/third_party/pkg/ffi":
Var("dart_git") + "ffi.git" + "@" + Var("ffi_rev"),
Var("dart_root") + "/third_party/pkg/fixnum":
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 276b71e..61e97af 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -2308,95 +2308,6 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryExport =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""A library with name '#name' is exported more than once.""",
- withArguments: _withArgumentsDuplicatedLibraryExport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExport =
- const Code<Message Function(String name)>(
- "DuplicatedLibraryExport", templateDuplicatedLibraryExport,
- analyzerCodes: <String>["EXPORT_DUPLICATED_LIBRARY_NAMED"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExport(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeDuplicatedLibraryExport,
- message: """A library with name '${name}' is exported more than once.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateDuplicatedLibraryExportContext =
- const Template<Message Function(String name)>(
- messageTemplate: r"""'#name' is also exported here.""",
- withArguments: _withArgumentsDuplicatedLibraryExportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryExportContext =
- const Code<Message Function(String name)>("DuplicatedLibraryExportContext",
- templateDuplicatedLibraryExportContext,
- severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryExportContext(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeDuplicatedLibraryExportContext,
- message: """'${name}' is also exported here.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateDuplicatedLibraryImport =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""A library with name '#name' is imported more than once.""",
- withArguments: _withArgumentsDuplicatedLibraryImport);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImport =
- const Code<Message Function(String name)>(
- "DuplicatedLibraryImport", templateDuplicatedLibraryImport,
- analyzerCodes: <String>["IMPORT_DUPLICATED_LIBRARY_NAMED"],
- severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImport(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeDuplicatedLibraryImport,
- message: """A library with name '${name}' is imported more than once.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
- templateDuplicatedLibraryImportContext =
- const Template<Message Function(String name)>(
- messageTemplate: r"""'#name' is also imported here.""",
- withArguments: _withArgumentsDuplicatedLibraryImportContext);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDuplicatedLibraryImportContext =
- const Code<Message Function(String name)>("DuplicatedLibraryImportContext",
- templateDuplicatedLibraryImportContext,
- severity: Severity.context);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDuplicatedLibraryImportContext(String name) {
- if (name.isEmpty) throw 'No name provided';
- name = demangleMixinApplicationName(name);
- return new Message(codeDuplicatedLibraryImportContext,
- message: """'${name}' is also imported here.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(Token token)> templateDuplicatedModifier =
const Template<Message Function(Token token)>(
messageTemplate: r"""The modifier '#lexeme' was already specified.""",
@@ -6380,14 +6291,6 @@
message: r"""Can only use type variables in instance methods.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeNonNullAwareSpreadIsNull = messageNonNullAwareSpreadIsNull;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageNonNullAwareSpreadIsNull = const MessageCode(
- "NonNullAwareSpreadIsNull",
- message: r"""Can't spread a value with static type Null.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)>
templateNonNullableLateDefinitelyAssignedError =
const Template<Message Function(String name)>(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
index ec8e355..d05ecbc 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/type_info_impl.dart
@@ -486,10 +486,10 @@
final List<Token> typeVariableEndGroups = <Token>[];
for (Link<Token> t = typeVariableStarters; t.isNotEmpty; t = t.tail) {
+ parser.listener.beginFunctionType(start);
typeVariableEndGroups.add(
computeTypeParamOrArg(t.head, /* inDeclaration = */ true)
.parseVariables(t.head, parser));
- parser.listener.beginFunctionType(start);
}
if (gftHasReturnType == false) {
diff --git a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
index 8b68c68..04ae6f3 100644
--- a/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/testing/id_testing.dart
@@ -726,6 +726,14 @@
}
}
+String getTestName(FileSystemEntity entity) {
+ if (entity is Directory) {
+ return entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
+ } else {
+ return entity.uri.pathSegments.last;
+ }
+}
+
/// Check code for all tests in [dataDir] using [runTest].
Future<void> runTests<T>(Directory dataDir,
{List<String> args: const <String>[],
@@ -766,16 +774,14 @@
!entity.path.endsWith('~') && !entity.path.endsWith('marker.options'))
.toList();
if (shards > 1) {
+ entities.sort((a, b) => getTestName(a).compareTo(getTestName(b)));
int start = entities.length * shardIndex ~/ shards;
int end = entities.length * (shardIndex + 1) ~/ shards;
entities = entities.sublist(start, end);
}
int testCount = 0;
for (FileSystemEntity entity in entities) {
- String name = entity.uri.pathSegments.last;
- if (entity is Directory) {
- name = entity.uri.pathSegments[entity.uri.pathSegments.length - 2];
- }
+ String name = getTestName(entity);
if (args.isNotEmpty && !args.contains(name) && !continued) continue;
if (shouldContinue) continued = true;
testCount++;
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 309cbd8..a9414fd 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -655,7 +655,7 @@
/// Return `true` if the new relevance computations should be used when
/// computing code completion suggestions.
- bool useNewRelevance = false;
+ bool useNewRelevance = true;
/// The set of enabled features.
FeatureSet featureSet = FeatureSet();
diff --git a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
index 7fc3e1e..d15e724 100644
--- a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
@@ -65,7 +65,7 @@
static void fixNamedConstructorTypeArgs(DartFixRegistrar registrar,
DartFixListener listener, EditDartfixParams params) {
registrar.registerErrorTask(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
FixErrorTask(listener));
}
}
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 24504db..6e075f6 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -827,6 +827,7 @@
// Temporary flags.
//
parser.addFlag(USE_NEW_RELEVANCE,
+ defaultsTo: true,
help: 'Use the new relevance computation for code completion.');
return parser;
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index ee307b7..ec4e330 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -10,7 +10,12 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/dart/add_override.dart';
import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
import 'package:analysis_server/src/services/correction/dart/remove_const.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_empty_else.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_initializer.dart';
+import 'package:analysis_server/src/services/correction/dart/remove_type_annotation.dart';
import 'package:analysis_server/src/services/correction/dart/remove_unnecessary_new.dart';
import 'package:analysis_server/src/services/correction/dart/replace_cascade_with_dot.dart';
import 'package:analysis_server/src/services/correction/dart/replace_colon_with_equals.dart';
@@ -29,8 +34,16 @@
/// generators used for non-lint diagnostics are in the [nonLintProducerMap].
static const Map<String, ProducerGenerator> lintProducerMap = {
LintNames.annotate_overrides: AddOverride.newInstance,
+ LintNames.avoid_annotating_with_dynamic: RemoveTypeAnnotation.newInstance,
+ LintNames.avoid_empty_else: RemoveEmptyElse.newInstance,
+ LintNames.avoid_init_to_null: RemoveInitializer.newInstance,
+ LintNames.avoid_redundant_argument_values: RemoveArgument.newInstance,
+ LintNames.avoid_return_types_on_setters: RemoveTypeAnnotation.newInstance,
LintNames.avoid_single_cascade_in_expression_statements:
ReplaceCascadeWithDot.newInstance,
+ LintNames.avoid_types_on_closure_parameters:
+ RemoveTypeAnnotation.newInstance,
+ LintNames.prefer_contains: ConvertToContains.newInstance,
LintNames.prefer_equal_for_default_values:
ReplaceColonWithEquals.newInstance,
LintNames.slash_for_doc_comments: ConvertDocumentationIntoLine.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
index f04a6c3..48ae964 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_explicit_cast.dart
@@ -27,6 +27,10 @@
var fromType = target.staticType;
DartType toType;
var parent = target.parent;
+ if (parent is CascadeExpression && target == parent.target) {
+ target = parent;
+ parent = target.parent;
+ }
if (parent is AssignmentExpression && target == parent.rightHandSide) {
toType = parent.leftHandSide.staticType;
} else if (parent is VariableDeclaration && target == parent.initializer) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
index 2474392..065deff 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_required_argument.dart
@@ -27,7 +27,7 @@
Element targetElement;
ArgumentList argumentList;
- if (node is SimpleIdentifier) {
+ if (node is SimpleIdentifier || node is ConstructorName) {
var invocation = node.parent;
if (invocation is MethodInvocation) {
targetElement = invocation.methodName.staticElement;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
index bbcf86e..b07fa5c 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_empty_constructor_body.dart
@@ -4,6 +4,7 @@
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -15,8 +16,12 @@
@override
Future<void> compute(ChangeBuilder builder) async {
await builder.addDartFileEdit(file, (builder) {
- builder.addSimpleReplacement(
- utils.getLinesRange(range.node(node.parent)), ';');
+ if (node is Block && node.parent is BlockFunctionBody) {
+ builder.addSimpleReplacement(
+ utils.getLinesRange(range.node(node.parent)),
+ ';',
+ );
+ }
});
}
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
index ca557b5..62037ee 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused_parameter.dart
@@ -40,8 +40,13 @@
// The parameter to be removed and the following parameter are not
// of the same kind, so there is a delimiter between them that we
// can't delete.
- builder.addDeletion(
- range.startStart(parameter, parameterList.leftDelimiter));
+ var leftDelimiter = parameterList.leftDelimiter;
+ if (leftDelimiter != null) {
+ builder.addDeletion(range.startStart(parameter, leftDelimiter));
+ } else {
+ // Invalid code `C(foo, bar = 1)`.
+ builder.addDeletion(range.startStart(parameter, following));
+ }
} else {
// The parameter to be removed and the following parameter are of
// the same kind, so there is no delimiter between them.
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index b9c3497..332b3f5 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -14,8 +14,11 @@
/// Return true if this [errorCode] is likely to have a fix associated with it.
bool hasFix(ErrorCode errorCode) =>
- errorCode == CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN ||
+ errorCode == CompileTimeErrorCode.CAST_TO_NON_TYPE ||
errorCode == CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER ||
+ errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE ||
+ errorCode == CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER ||
+ errorCode == CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION ||
errorCode == CompileTimeErrorCode.NEW_WITH_UNDEFINED_CONSTRUCTOR ||
errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE ||
@@ -29,7 +32,7 @@
errorCode ==
CompileTimeErrorCode
.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS ||
- errorCode == CompileTimeErrorCode.CAST_TO_NON_TYPE ||
+ errorCode == CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT ||
errorCode == CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME ||
errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED ||
errorCode == CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 ||
@@ -44,8 +47,13 @@
errorCode == CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT ||
errorCode == CompileTimeErrorCode.PART_OF_NON_PART ||
errorCode == CompileTimeErrorCode.UNDEFINED_ANNOTATION ||
+ errorCode == CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN ||
errorCode ==
CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT ||
+ errorCode == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
+ errorCode == CompileTimeErrorCode.UNDEFINED_GETTER ||
+ errorCode == CompileTimeErrorCode.UNDEFINED_METHOD ||
+ errorCode == CompileTimeErrorCode.UNDEFINED_SETTER ||
errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST ||
errorCode == CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED ||
errorCode == HintCode.CAN_BE_NULL_AFTER_NULL_AWARE ||
@@ -60,14 +68,6 @@
errorCode == ParserErrorCode.EXPECTED_TOKEN ||
errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS ||
errorCode == ParserErrorCode.VAR_AS_TYPE_NAME ||
- errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE ||
- errorCode == StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER ||
- errorCode == StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION ||
- errorCode == StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT ||
- errorCode == StaticTypeWarningCode.UNDEFINED_FUNCTION ||
- errorCode == StaticTypeWarningCode.UNDEFINED_GETTER ||
- errorCode == StaticTypeWarningCode.UNDEFINED_METHOD ||
- errorCode == StaticTypeWarningCode.UNDEFINED_SETTER ||
errorCode == CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER ||
(errorCode is LintCode &&
(errorCode.name == LintNames.always_require_non_null_named_parameters ||
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 90f10f5..b971b29 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -528,6 +528,9 @@
CompileTimeErrorCode.NON_TYPE_IN_CATCH_CLAUSE: [
ImportLibrary.forType,
],
+ CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT: [
+ ImportLibrary.forType,
+ ],
CompileTimeErrorCode.NOT_A_TYPE: [
ImportLibrary.forType,
],
@@ -544,12 +547,25 @@
CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT: [
AddSuperConstructorInvocation.newInstance,
],
+ CompileTimeErrorCode.UNDEFINED_FUNCTION: [
+ ImportLibrary.forExtension,
+ ImportLibrary.forFunction,
+ ImportLibrary.forType,
+ ],
+ CompileTimeErrorCode.UNDEFINED_GETTER: [
+ ImportLibrary.forTopLevelVariable,
+ ImportLibrary.forType,
+ ],
CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
ImportLibrary.forExtension,
ImportLibrary.forFunction,
ImportLibrary.forTopLevelVariable,
ImportLibrary.forType,
],
+ CompileTimeErrorCode.UNDEFINED_METHOD: [
+ ImportLibrary.forFunction,
+ ImportLibrary.forType,
+ ],
CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
ChangeArgumentName.newInstance,
],
@@ -562,22 +578,6 @@
HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE: [
ImportLibrary.dartAsync,
],
- StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: [
- ImportLibrary.forType,
- ],
- StaticTypeWarningCode.UNDEFINED_FUNCTION: [
- ImportLibrary.forExtension,
- ImportLibrary.forFunction,
- ImportLibrary.forType,
- ],
- StaticTypeWarningCode.UNDEFINED_GETTER: [
- ImportLibrary.forTopLevelVariable,
- ImportLibrary.forType,
- ],
- StaticTypeWarningCode.UNDEFINED_METHOD: [
- ImportLibrary.forFunction,
- ImportLibrary.forType,
- ],
};
/// A map from error codes to a list of generators used to create the
@@ -651,6 +651,9 @@
CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS: [
AddFieldFormalParameters.newInstance,
],
+ CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE: [
+ ReplaceReturnTypeFuture.newInstance,
+ ],
CompileTimeErrorCode.IMPLEMENTS_NON_CLASS: [
ChangeTo.classOrMixin,
CreateClass.newInstance,
@@ -658,6 +661,9 @@
CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD: [
CreateField.newInstance,
],
+ CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: [
+ ChangeToStaticAccess.newInstance,
+ ],
CompileTimeErrorCode.INTEGER_LITERAL_IMPRECISE_AS_DOUBLE: [
ChangeToNearestPreciseValue.newInstance,
],
@@ -665,6 +671,13 @@
ChangeTo.annotation,
CreateClass.newInstance,
],
+ CompileTimeErrorCode.INVALID_ASSIGNMENT: [
+ AddExplicitCast.newInstance,
+ ChangeTypeAnnotation.newInstance,
+ ],
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION: [
+ RemoveParenthesesInGetterInvocation.newInstance,
+ ],
CompileTimeErrorCode.MISSING_DEFAULT_VALUE_FOR_PARAMETER: [
AddRequiredKeyword.newInstance,
],
@@ -707,6 +720,13 @@
CreateNoSuchMethod.newInstance,
MakeClassAbstract.newInstance,
],
+ CompileTimeErrorCode.NON_BOOL_CONDITION: [
+ AddNeNull.newInstance,
+ ],
+ CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT: [
+ CreateClass.newInstance,
+ CreateMixin.newInstance,
+ ],
CompileTimeErrorCode.NOT_A_TYPE: [
ChangeTo.classOrMixin,
CreateClass.newInstance,
@@ -756,6 +776,20 @@
ChangeTo.getterOrSetter,
CreateSetter.newInstance,
],
+ CompileTimeErrorCode.UNDEFINED_FUNCTION: [
+ ChangeTo.function,
+ CreateClass.newInstance,
+ CreateFunction.newInstance,
+ ],
+ CompileTimeErrorCode.UNDEFINED_GETTER: [
+ ChangeTo.getterOrSetter,
+ CreateClass.newInstance,
+ CreateField.newInstance,
+ CreateGetter.newInstance,
+ CreateLocalVariable.newInstance,
+ CreateMethodOrFunction.newInstance,
+ CreateMixin.newInstance,
+ ],
CompileTimeErrorCode.UNDEFINED_IDENTIFIER: [
ChangeTo.getterOrSetter,
CreateClass.newInstance,
@@ -769,11 +803,28 @@
CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT: [
AddAsync.newInstance,
],
+ CompileTimeErrorCode.UNDEFINED_METHOD: [
+ ChangeTo.method,
+ CreateClass.newInstance,
+ CreateFunction.newInstance,
+ CreateMethod.method,
+ ],
CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
AddMissingParameterNamed.newInstance,
ConvertFlutterChild.newInstance,
ConvertFlutterChildren.newInstance,
],
+ CompileTimeErrorCode.UNDEFINED_SETTER: [
+ ChangeTo.getterOrSetter,
+ CreateField.newInstance,
+ CreateSetter.newInstance,
+ ],
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER: [
+ // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
+ // method or setter. The existing _addFix methods would need to be
+ // updated so that only the appropriate subset is generated.
+ QualifyReference.newInstance,
+ ],
CompileTimeErrorCode
.UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE: [
// TODO(brianwilkerson) Consider adding fixes to create a field, getter,
@@ -784,6 +835,10 @@
CompileTimeErrorCode.URI_DOES_NOT_EXIST: [
CreateFile.newInstance,
],
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+ MoveTypeArgumentsToClass.newInstance,
+ RemoveTypeArguments.newInstance,
+ ],
HintCode.CAN_BE_NULL_AFTER_NULL_AWARE: [
ReplaceWithNullAware.newInstance,
@@ -943,61 +998,6 @@
ParserErrorCode.VAR_AS_TYPE_NAME: [
ReplaceVarWithDynamic.newInstance,
],
- StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE: [
- ReplaceReturnTypeFuture.newInstance,
- ],
- StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER: [
- ChangeToStaticAccess.newInstance,
- ],
- StaticTypeWarningCode.INVALID_ASSIGNMENT: [
- AddExplicitCast.newInstance,
- ChangeTypeAnnotation.newInstance,
- ],
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION: [
- RemoveParenthesesInGetterInvocation.newInstance,
- ],
- StaticTypeWarningCode.NON_BOOL_CONDITION: [
- AddNeNull.newInstance,
- ],
- StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT: [
- CreateClass.newInstance,
- CreateMixin.newInstance,
- ],
- StaticTypeWarningCode.UNDEFINED_FUNCTION: [
- ChangeTo.function,
- CreateClass.newInstance,
- CreateFunction.newInstance,
- ],
- StaticTypeWarningCode.UNDEFINED_GETTER: [
- ChangeTo.getterOrSetter,
- CreateClass.newInstance,
- CreateField.newInstance,
- CreateGetter.newInstance,
- CreateLocalVariable.newInstance,
- CreateMethodOrFunction.newInstance,
- CreateMixin.newInstance,
- ],
- StaticTypeWarningCode.UNDEFINED_METHOD: [
- ChangeTo.method,
- CreateClass.newInstance,
- CreateFunction.newInstance,
- CreateMethod.method,
- ],
- StaticTypeWarningCode.UNDEFINED_SETTER: [
- ChangeTo.getterOrSetter,
- CreateField.newInstance,
- CreateSetter.newInstance,
- ],
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
- MoveTypeArgumentsToClass.newInstance,
- RemoveTypeArguments.newInstance,
- ],
- StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER: [
- // TODO(brianwilkerson) Consider adding fixes to create a field, getter,
- // method or setter. The existing _addFix methods would need to be
- // updated so that only the appropriate subset is generated.
- QualifyReference.newInstance,
- ],
StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION: [
RemoveDeadIfNull.newInstance,
],
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index 2311453..5ee0b8a 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -587,7 +587,6 @@
.relevance));
}
- @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/38796')
Future<void> test_project_suggestionRelevance_constructorsAndTypes() async {
await addProjectFile('lib/a.dart', r'''
class A { }
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 51e813f..59af0c1 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -1544,7 +1544,7 @@
]);
AnalysisError invalid_assignment_error =
- AnalysisError(null, 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+ AnalysisError(null, 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
['x'],
['y']
]);
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 35894eb..d9bd015 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -590,12 +590,15 @@
}
Future<void> test_invocation_sdk_relevancy_on() {
- addTestFile('main() {Map m; m.^}');
- return getSuggestions().then((_) {
- // Assert that the CommonUsageComputer is working
- expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
- isTrue);
- });
+ if (!server.options.useNewRelevance) {
+ addTestFile('main() {Map m; m.^}');
+ return getSuggestions().then((_) {
+ // Assert that the CommonUsageComputer is working
+ expect(
+ suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+ isTrue);
+ });
+ }
}
Future<void> test_invocation_withTrailingStmt() {
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 424b3d0..81f936f 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -70,7 +70,9 @@
fail('expected $expectationText, but found\n $completions');
}
expect(cs.kind, equals(kind));
- expect(cs.relevance, equals(relevance));
+ if (!server.options.useNewRelevance) {
+ expect(cs.relevance, equals(relevance));
+ }
expect(cs.selectionOffset, selectionOffset ?? completion.length);
expect(cs.selectionLength, equals(0));
expect(cs.isDeprecated, equals(isDeprecated));
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 805b561..8053be5 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -253,7 +253,57 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ if (server.options.useNewRelevance) {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+ {
+ "tag": "ElementKind.PREFIX",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.FUNCTION",
+ "relevanceBoost": 2
+ },
+ {
+ "tag": "ElementKind.METHOD",
+ "relevanceBoost": 4
+ },
+ {
+ "tag": "ElementKind.ENUM",
+ "relevanceBoost": 9
+ },
+ {
+ "tag": "ElementKind.CLASS",
+ "relevanceBoost": 28
+ },
+ {
+ "tag": "ElementKind.LOCAL_VARIABLE",
+ "relevanceBoost": 40
+ },
+ {
+ "tag": "ElementKind.CONSTRUCTOR",
+ "relevanceBoost": 53
+ },
+ {
+ "tag": "ElementKind.FIELD",
+ "relevanceBoost": 68
+ },
+ {
+ "tag": "ElementKind.PARAMETER",
+ "relevanceBoost": 100
+ },
+ {
+ "tag": "package:test/a.dart::MyEnum",
+ "relevanceBoost": 250
+ }
+]
+''');
+ } else {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
[
{
"tag": "package:test/a.dart::MyEnum",
@@ -261,6 +311,7 @@
}
]
''');
+ }
}
Future<void> test_relevanceTags_location_argumentList_named() async {
@@ -277,7 +328,57 @@
testCode.indexOf('); // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ if (server.options.useNewRelevance) {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+ {
+ "tag": "ElementKind.PREFIX",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.FUNCTION",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.METHOD",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+ "relevanceBoost": 3
+ },
+ {
+ "tag": "ElementKind.ENUM",
+ "relevanceBoost": 5
+ },
+ {
+ "tag": "ElementKind.CLASS",
+ "relevanceBoost": 20
+ },
+ {
+ "tag": "ElementKind.LOCAL_VARIABLE",
+ "relevanceBoost": 30
+ },
+ {
+ "tag": "ElementKind.FIELD",
+ "relevanceBoost": 41
+ },
+ {
+ "tag": "ElementKind.PARAMETER",
+ "relevanceBoost": 56
+ },
+ {
+ "tag": "ElementKind.CONSTRUCTOR",
+ "relevanceBoost": 100
+ },
+ {
+ "tag": "dart:core::String",
+ "relevanceBoost": 10
+ }
+]
+''');
+ } else {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
[
{
"tag": "dart:core::String",
@@ -285,6 +386,7 @@
}
]
''');
+ }
}
Future<void> test_relevanceTags_location_argumentList_positional() async {
@@ -301,7 +403,65 @@
testCode.indexOf('); // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ if (server.options.useNewRelevance) {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+ {
+ "tag": "ElementKind.MIXIN",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.TYPE_PARAMETER",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.PREFIX",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.ENUM",
+ "relevanceBoost": 3
+ },
+ {
+ "tag": "ElementKind.METHOD",
+ "relevanceBoost": 4
+ },
+ {
+ "tag": "ElementKind.FUNCTION",
+ "relevanceBoost": 9
+ },
+ {
+ "tag": "ElementKind.CLASS",
+ "relevanceBoost": 13
+ },
+ {
+ "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+ "relevanceBoost": 18
+ },
+ {
+ "tag": "ElementKind.CONSTRUCTOR",
+ "relevanceBoost": 27
+ },
+ {
+ "tag": "ElementKind.FIELD",
+ "relevanceBoost": 42
+ },
+ {
+ "tag": "ElementKind.LOCAL_VARIABLE",
+ "relevanceBoost": 60
+ },
+ {
+ "tag": "ElementKind.PARAMETER",
+ "relevanceBoost": 100
+ },
+ {
+ "tag": "dart:core::double",
+ "relevanceBoost": 10
+ }
+]
+''');
+ } else {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
[
{
"tag": "dart:core::double",
@@ -309,6 +469,7 @@
}
]
''');
+ }
}
Future<void> test_relevanceTags_location_assignment() async {
@@ -324,7 +485,57 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ if (server.options.useNewRelevance) {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+ {
+ "tag": "ElementKind.PREFIX",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.FUNCTION",
+ "relevanceBoost": 2
+ },
+ {
+ "tag": "ElementKind.METHOD",
+ "relevanceBoost": 4
+ },
+ {
+ "tag": "ElementKind.ENUM",
+ "relevanceBoost": 9
+ },
+ {
+ "tag": "ElementKind.CLASS",
+ "relevanceBoost": 28
+ },
+ {
+ "tag": "ElementKind.LOCAL_VARIABLE",
+ "relevanceBoost": 40
+ },
+ {
+ "tag": "ElementKind.CONSTRUCTOR",
+ "relevanceBoost": 53
+ },
+ {
+ "tag": "ElementKind.FIELD",
+ "relevanceBoost": 68
+ },
+ {
+ "tag": "ElementKind.PARAMETER",
+ "relevanceBoost": 100
+ },
+ {
+ "tag": "dart:core::int",
+ "relevanceBoost": 10
+ }
+]
+''');
+ } else {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
[
{
"tag": "dart:core::int",
@@ -332,6 +543,7 @@
}
]
''');
+ }
}
Future<void> test_relevanceTags_location_initializer() async {
@@ -344,7 +556,65 @@
testCode.indexOf(' // ref'),
);
- assertJsonText(results.includedSuggestionRelevanceTags, r'''
+ if (server.options.useNewRelevance) {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
+[
+ {
+ "tag": "ElementKind.MIXIN",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.TYPE_PARAMETER",
+ "relevanceBoost": 0
+ },
+ {
+ "tag": "ElementKind.PREFIX",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.ENUM",
+ "relevanceBoost": 1
+ },
+ {
+ "tag": "ElementKind.METHOD",
+ "relevanceBoost": 4
+ },
+ {
+ "tag": "ElementKind.TOP_LEVEL_VARIABLE",
+ "relevanceBoost": 6
+ },
+ {
+ "tag": "ElementKind.FUNCTION",
+ "relevanceBoost": 16
+ },
+ {
+ "tag": "ElementKind.PARAMETER",
+ "relevanceBoost": 26
+ },
+ {
+ "tag": "ElementKind.FIELD",
+ "relevanceBoost": 35
+ },
+ {
+ "tag": "ElementKind.CLASS",
+ "relevanceBoost": 56
+ },
+ {
+ "tag": "ElementKind.LOCAL_VARIABLE",
+ "relevanceBoost": 68
+ },
+ {
+ "tag": "ElementKind.CONSTRUCTOR",
+ "relevanceBoost": 100
+ },
+ {
+ "tag": "dart:core::int",
+ "relevanceBoost": 10
+ }
+]
+''');
+ } else {
+ assertJsonText(results.includedSuggestionRelevanceTags, r'''
[
{
"tag": "dart:core::int",
@@ -352,6 +622,7 @@
}
]
''');
+ }
}
Future<void> test_relevanceTags_location_listLiteral() async {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
index 1f84c34..cdcb95c 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
@@ -64,7 +64,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(A a) {
B b, b2;
b = a as B;
@@ -106,7 +106,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(List<A> a) {
List<B> b, b2;
b = a.where((e) => e is B).cast<B>().toList();
@@ -148,7 +148,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(Map<A, B> a) {
Map<B, A> b, b2;
b = a.cast<B, A>();
@@ -196,7 +196,7 @@
}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(A a) {
B b, b2;
b = (a..m()) as B;
@@ -240,7 +240,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(Set<A> a) {
Set<B> b, b2;
b = a.cast<B>();
@@ -291,7 +291,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(A a) {
B b = a as B;
B b2 = a as B;
@@ -329,7 +329,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(List<A> a) {
List<B> b = a.where((e) => e is B).cast<B>().toList();
List<B> b2 = a.where((e) => e is B).cast<B>().toList();
@@ -367,7 +367,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(Map<A, B> a) {
Map<B, A> b = a.cast<B, A>();
Map<B, A> b2 = a.cast<B, A>();
@@ -411,7 +411,7 @@
}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(A a) {
B b = (a..m()) as B;
B b2 = (a..m()) as B;
@@ -451,7 +451,7 @@
class A {}
class B {}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.INVALID_ASSIGNMENT, '''
f(Set<A> a) {
Set<B> b = a.cast<B>();
Set<B> b2 = a.cast<B>();
@@ -469,7 +469,7 @@
''');
await assertNoFix(
errorFilter: (e) {
- return e.errorCode == StaticTypeWarningCode.INVALID_ASSIGNMENT;
+ return e.errorCode == CompileTimeErrorCode.INVALID_ASSIGNMENT;
},
);
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
index 49a5dcf..11b0ee0 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -19,7 +19,7 @@
@override
FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
- Future<void> test_cons_flutter_children() async {
+ Future<void> test_constructor_flutter_children() async {
addFlutterPackage();
addMetaPackage();
await resolveTestUnit('''
@@ -48,7 +48,7 @@
''');
}
- Future<void> test_cons_flutter_hasTrailingComma() async {
+ Future<void> test_constructor_flutter_hasTrailingComma() async {
addFlutterPackage();
addMetaPackage();
await resolveTestUnit('''
@@ -77,7 +77,35 @@
''');
}
- Future<void> test_cons_single() async {
+ Future<void> test_constructor_named() async {
+ addMetaPackage();
+ await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+class A {
+ A.named({@required int a}) {}
+}
+
+void f() {
+ A a = new A.named();
+ print(a);
+}
+''');
+ await assertHasFix('''
+import 'package:meta/meta.dart';
+
+class A {
+ A.named({@required int a}) {}
+}
+
+void f() {
+ A a = new A.named(a: null);
+ print(a);
+}
+''');
+ }
+
+ Future<void> test_constructor_single() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
@@ -104,7 +132,7 @@
''');
}
- Future<void> test_cons_single_closure() async {
+ Future<void> test_constructor_single_closure() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
@@ -133,7 +161,7 @@
''');
}
- Future<void> test_cons_single_closure_2() async {
+ Future<void> test_constructor_single_closure2() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
@@ -162,7 +190,7 @@
''');
}
- Future<void> test_cons_single_closure_3() async {
+ Future<void> test_constructor_single_closure3() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
@@ -191,7 +219,7 @@
''');
}
- Future<void> test_cons_single_closure_4() async {
+ Future<void> test_constructor_single_closure4() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
@@ -220,7 +248,7 @@
''');
}
- Future<void> test_cons_single_list() async {
+ Future<void> test_constructor_single_list() async {
addMetaPackage();
addSource('/home/test/lib/a.dart', r'''
import 'package:meta/meta.dart';
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
index a844e27..657adcc 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
@@ -48,7 +48,7 @@
}
}
''');
- await assertHasFixAllFix(StaticTypeWarningCode.NON_BOOL_CONDITION, '''
+ await assertHasFixAllFix(CompileTimeErrorCode.NON_BOOL_CONDITION, '''
main(String p, String q) {
if (p != null) {
print(p);
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
new file mode 100644
index 0000000..5e7445b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_contains_test.dart
@@ -0,0 +1,41 @@
+// 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 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConvertToContainsTest);
+ });
+}
+
+@reflectiveTest
+class ConvertToContainsTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.prefer_contains;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+bool f(List<int> list, int value) {
+ return -1 != list.indexOf(value);
+}
+
+bool f2(List<int> list, int value) {
+ return 0 > list.indexOf(value);
+}
+''');
+ await assertHasFix('''
+bool f(List<int> list, int value) {
+ return list.contains(value);
+}
+
+bool f2(List<int> list, int value) {
+ return !list.contains(value);
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
new file mode 100644
index 0000000..d246cd8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_argument_test.dart
@@ -0,0 +1,41 @@
+// 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 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveArgumentTest);
+ });
+}
+
+@reflectiveTest
+class RemoveArgumentTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_redundant_argument_values;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+void f({bool valWithDefault = true, bool val}) {}
+void f2({bool valWithDefault = true, bool val}) {}
+
+void main() {
+ f(valWithDefault: true);
+ f2(valWithDefault: true, val: false);
+}
+''');
+ await assertHasFix('''
+void f({bool valWithDefault = true, bool val}) {}
+void f2({bool valWithDefault = true, bool val}) {}
+
+void main() {
+ f();
+ f2(val: false);
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
new file mode 100644
index 0000000..faf94fc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_empty_else_test.dart
@@ -0,0 +1,50 @@
+// 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 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveUnnecessaryElseTest);
+ });
+}
+
+@reflectiveTest
+class RemoveUnnecessaryElseTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_empty_else;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+void f(bool cond) {
+ if (cond) {
+ //
+ }
+ else ;
+}
+
+void f2(bool cond) {
+ if (cond) {
+ //
+ } else ;
+}
+''');
+ await assertHasFix('''
+void f(bool cond) {
+ if (cond) {
+ //
+ }
+}
+
+void f2(bool cond) {
+ if (cond) {
+ //
+ }
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
new file mode 100644
index 0000000..446ec84
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_initializer_test.dart
@@ -0,0 +1,41 @@
+// 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 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveInitializerTest);
+ });
+}
+
+@reflectiveTest
+class RemoveInitializerTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_init_to_null;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+class T {
+ int x = null;
+}
+
+class T2 {
+ int x = null;
+}
+''');
+ await assertHasFix('''
+class T {
+ int x;
+}
+
+class T2 {
+ int x;
+}
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
new file mode 100644
index 0000000..55d013f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/remove_type_annotation_test.dart
@@ -0,0 +1,77 @@
+// 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 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(RemoveDynamicTypeAnnotationTest);
+ defineReflectiveTests(RemoveSetterReturnTypeAnnotationTest);
+ defineReflectiveTests(RemoveTypeAnnotationOnClosureParamsTest);
+ });
+}
+
+@reflectiveTest
+class RemoveDynamicTypeAnnotationTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_annotating_with_dynamic;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+f(void foo(dynamic x)) {
+ return null;
+}
+
+f2({dynamic defaultValue}) {
+ return null;
+}
+''');
+ await assertHasFix('''
+f(void foo(x)) {
+ return null;
+}
+
+f2({defaultValue}) {
+ return null;
+}
+''');
+ }
+}
+
+@reflectiveTest
+class RemoveSetterReturnTypeAnnotationTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_return_types_on_setters;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+void set s(int s) {}
+void set s2(int s2) {}
+''');
+ await assertHasFix('''
+set s(int s) {}
+set s2(int s2) {}
+''');
+ }
+}
+
+@reflectiveTest
+class RemoveTypeAnnotationOnClosureParamsTest extends BulkFixProcessorTest {
+ @override
+ String get lintCode => LintNames.avoid_types_on_closure_parameters;
+
+ Future<void> test_singleFile() async {
+ await resolveTestUnit('''
+var x = ({Future<int> defaultValue}) => null;
+var y = (Future<int> defaultValue) => null;
+''');
+ await assertHasFix('''
+var x = ({defaultValue}) => null;
+var y = (defaultValue) => null;
+''');
+ }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 77d9e26..e2f2972 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -7,6 +7,11 @@
import 'add_override_test.dart' as add_override;
import 'convert_documentation_into_line_test.dart'
as convert_documentation_into_line;
+import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'remove_argument_test.dart' as remove_argument;
+import 'remove_empty_else_test.dart' as remove_empty_else;
+import 'remove_initializer_test.dart' as remove_initializer;
+import 'remove_type_annotation_test.dart' as remove_type_annotation;
import 'remove_unnecessary_const_test.dart' as remove_unnecessary_const;
import 'remove_unnecessary_new_test.dart' as remove_unnecessary_new;
import 'replace_colon_with_equals_test.dart' as replace_colon_with_equals;
@@ -15,6 +20,11 @@
defineReflectiveSuite(() {
add_override.main();
convert_documentation_into_line.main();
+ convert_to_contains.main();
+ remove_argument.main();
+ remove_initializer.main();
+ remove_empty_else.main();
+ remove_type_annotation.main();
remove_unnecessary_const.main();
remove_unnecessary_new.main();
replace_colon_with_equals.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
index b9f2735..91c2321 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
@@ -78,7 +78,7 @@
''');
await assertNoFix(
errorFilter: (e) {
- return e.errorCode == StaticTypeWarningCode.INVALID_ASSIGNMENT;
+ return e.errorCode == CompileTimeErrorCode.INVALID_ASSIGNMENT;
},
);
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
index eec3b63..df32308 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -379,7 +379,7 @@
}
''');
await assertNoFix(errorFilter: (e) {
- return e.errorCode == StaticTypeWarningCode.UNDEFINED_GETTER;
+ return e.errorCode == CompileTimeErrorCode.UNDEFINED_GETTER;
});
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
index b3e1fe2..c8797e3 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -322,7 +322,7 @@
}
''');
await assertNoFix(errorFilter: (e) {
- return e.errorCode == StaticTypeWarningCode.UNDEFINED_GETTER;
+ return e.errorCode == CompileTimeErrorCode.UNDEFINED_GETTER;
});
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
index 5dc1260..1a984bf 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_setter_test.dart
@@ -316,7 +316,7 @@
}
''');
await assertNoFix(errorFilter: (e) {
- return e.errorCode == StaticTypeWarningCode.UNDEFINED_SETTER;
+ return e.errorCode == CompileTimeErrorCode.UNDEFINED_SETTER;
});
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
index 3a1a413..6f1bb5e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
@@ -4,6 +4,7 @@
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer/error/error.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -35,4 +36,16 @@
}
''');
}
+
+ Future<void> test_incompleteComment() async {
+ await resolveTestUnit(r'''
+class A {
+ A() {/*
+''');
+ await assertNoFix(errorFilter: _isInterestingError);
+ }
+
+ static bool _isInterestingError(AnalysisError e) {
+ return e.errorCode.name == LintNames.empty_constructor_bodies;
+ }
}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
index 30937b9..3d8e7ef 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_parameter_test.dart
@@ -53,6 +53,19 @@
''');
}
+ Future<void> test_first_required_second_optionalInvalid() async {
+ await resolveTestUnit('''
+class C {
+ C(int a, int b = 1,);
+}
+''');
+ await assertHasFix('''
+class C {
+ C(int b = 1,);
+}
+''', errorFilter: (e) => e.offset == 14);
+ }
+
Future<void> test_first_requiredPositional_second_optionalNamed() async {
await resolveTestUnit('''
class C {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
index aa333d5..e40a0b2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
@@ -29,7 +29,7 @@
import 'dart:async';
var v;Future<int> main() async => 0;
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -53,7 +53,7 @@
Future<List<int>> main() async {
}
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -69,7 +69,7 @@
Future<List<int>> main() async {
}
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -84,7 +84,7 @@
al.Future<int> main() async {
}
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -97,7 +97,7 @@
import 'dart:async';
Future<int> main() async => 0;
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -111,7 +111,7 @@
Future<int> main() async => 0;
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
@@ -128,7 +128,7 @@
Future<int> main() async {
}
''', errorFilter: (error) {
- return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+ return error.errorCode == CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE;
});
}
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 5956889..bf78d64 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -98,7 +98,7 @@
/// Initialize a newly created visitor to use each of the given delegate
/// visitors to visit the nodes of an AST structure.
- DelegatingAstVisitor(this.delegates);
+ const DelegatingAstVisitor(this.delegates);
@override
T visitNode(AstNode node) {
@@ -128,6 +128,9 @@
///
/// Clients may extend this class.
class GeneralizingAstVisitor<R> implements AstVisitor<R> {
+ /// Initialize a newly created visitor.
+ const GeneralizingAstVisitor();
+
@override
R visitAdjacentStrings(AdjacentStrings node) => visitStringLiteral(node);
@@ -606,6 +609,9 @@
///
/// Clients may extend this class.
class RecursiveAstVisitor<R> implements AstVisitor<R> {
+ /// Initialize a newly created visitor.
+ const RecursiveAstVisitor();
+
@override
R visitAdjacentStrings(AdjacentStrings node) {
node.visitChildren(this);
@@ -1341,6 +1347,9 @@
///
/// Clients may extend this class.
class SimpleAstVisitor<R> implements AstVisitor<R> {
+ /// Initialize a newly created visitor.
+ const SimpleAstVisitor();
+
@override
R visitAdjacentStrings(AdjacentStrings node) => null;
@@ -1719,6 +1728,9 @@
///
/// Clients may extend this class.
class ThrowingAstVisitor<R> implements AstVisitor<R> {
+ /// Initialize a newly created visitor.
+ const ThrowingAstVisitor();
+
@override
R visitAdjacentStrings(AdjacentStrings node) => _throw(node);
@@ -3097,6 +3109,9 @@
///
/// Clients may extend this class.
class UnifyingAstVisitor<R> implements AstVisitor<R> {
+ /// Initialize a newly created visitor.
+ const UnifyingAstVisitor();
+
@override
R visitAdjacentStrings(AdjacentStrings node) => visitNode(node);
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index 3119637..70552ed 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -79,6 +79,9 @@
///
/// Clients may extend this class.
class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
+ /// Initialize a newly created visitor.
+ const GeneralizingElementVisitor();
+
@override
R visitClassElement(ClassElement element) => visitElement(element);
@@ -191,6 +194,9 @@
///
/// Clients may extend this class.
class RecursiveElementVisitor<R> implements ElementVisitor<R> {
+ /// Initialize a newly created visitor.
+ const RecursiveElementVisitor();
+
@override
R visitClassElement(ClassElement element) {
element.visitChildren(this);
@@ -325,6 +331,9 @@
///
/// Clients may extend this class.
class SimpleElementVisitor<R> implements ElementVisitor<R> {
+ /// Initialize a newly created visitor.
+ const SimpleElementVisitor();
+
@override
R visitClassElement(ClassElement element) => null;
@@ -398,6 +407,9 @@
///
/// Clients may extend this class.
class ThrowingElementVisitor<R> implements ElementVisitor<R> {
+ /// Initialize a newly created visitor.
+ const ThrowingElementVisitor();
+
@override
R visitClassElement(ClassElement element) => _throw(element);
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index e281f0d..c0096fc 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -61,7 +61,6 @@
AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES,
AnalysisOptionsWarningCode.UNSUPPORTED_VALUE,
CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
@@ -107,6 +106,7 @@
CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_EXTENSION,
CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS,
CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_EXTENSION,
+ CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION,
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST,
CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
@@ -154,6 +154,9 @@
CompileTimeErrorCode.ENUM_CONSTANT_SAME_NAME_AS_ENCLOSING,
CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET,
CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP,
+ CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
+ CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
+ CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
CompileTimeErrorCode.EXPORT_LEGACY_SYMBOL,
CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
@@ -184,6 +187,8 @@
CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
+ CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+ CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE,
CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
@@ -191,6 +196,7 @@
CompileTimeErrorCode.GETTER_NOT_SUBTYPE_SETTER_TYPES,
CompileTimeErrorCode.IF_ELEMENT_CONDITION_FROM_DEFERRED_LIBRARY,
CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
+ CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE,
CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
@@ -208,6 +214,7 @@
CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+ CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC,
CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS,
@@ -217,6 +224,7 @@
CompileTimeErrorCode.INVALID_ANNOTATION,
CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
CompileTimeErrorCode.INVALID_ANNOTATION_GETTER,
+ CompileTimeErrorCode.INVALID_ASSIGNMENT,
CompileTimeErrorCode.INVALID_CAST_FUNCTION,
CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR,
CompileTimeErrorCode.INVALID_CAST_LITERAL,
@@ -242,6 +250,8 @@
CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
CompileTimeErrorCode.INVALID_USE_OF_NULL_VALUE,
CompileTimeErrorCode.INVOCATION_OF_EXTENSION_WITHOUT_CALL,
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION,
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
CompileTimeErrorCode.LABEL_UNDEFINED,
CompileTimeErrorCode.LATE_FINAL_FIELD_WITH_CONST_CONSTRUCTOR,
@@ -283,11 +293,16 @@
CompileTimeErrorCode.NO_COMBINED_SUPER_SIGNATURE,
CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS,
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+ CompileTimeErrorCode.NON_BOOL_CONDITION,
+ CompileTimeErrorCode.NON_BOOL_EXPRESSION,
+ CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION,
+ CompileTimeErrorCode.NON_BOOL_OPERAND,
CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR,
CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION,
@@ -303,7 +318,9 @@
CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+ CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
CompileTimeErrorCode.NON_SYNC_FACTORY,
+ CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT,
CompileTimeErrorCode.NON_TYPE_IN_CATCH_CLAUSE,
CompileTimeErrorCode.NON_VOID_RETURN_FOR_OPERATOR,
CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER,
@@ -353,6 +370,10 @@
CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH,
CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR,
CompileTimeErrorCode.RETURN_IN_GENERATOR,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
CompileTimeErrorCode.RETURN_WITHOUT_VALUE,
CompileTimeErrorCode.SET_ELEMENT_FROM_DEFERRED_LIBRARY,
CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
@@ -371,6 +392,7 @@
CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
CompileTimeErrorCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
+ CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
CompileTimeErrorCode.TYPE_TEST_WITH_NON_TYPE,
CompileTimeErrorCode.TYPE_TEST_WITH_UNDEFINED_NAME,
CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE,
@@ -379,13 +401,25 @@
CompileTimeErrorCode.UNDEFINED_CLASS_BOOLEAN,
CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+ CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT,
CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
CompileTimeErrorCode.UNDEFINED_EXTENSION_OPERATOR,
CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER,
+ CompileTimeErrorCode.UNDEFINED_FUNCTION,
+ CompileTimeErrorCode.UNDEFINED_GETTER,
CompileTimeErrorCode.UNDEFINED_IDENTIFIER,
CompileTimeErrorCode.UNDEFINED_IDENTIFIER_AWAIT,
+ CompileTimeErrorCode.UNDEFINED_METHOD,
CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME,
+ CompileTimeErrorCode.UNDEFINED_SETTER,
+ CompileTimeErrorCode.UNDEFINED_SUPER_GETTER,
+ CompileTimeErrorCode.UNDEFINED_SUPER_METHOD,
+ CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_SUPER_SETTER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_STATIC_MEMBER_OF_EXTENDED_TYPE,
CompileTimeErrorCode.URI_DOES_NOT_EXIST,
CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED,
@@ -395,10 +429,14 @@
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_POSITION,
CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
+ CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
FfiCode.ANNOTATION_ON_POINTER_FIELD,
FfiCode.EXTRA_ANNOTATION_ON_STRUCT_FIELD,
FfiCode.FIELD_IN_STRUCT_WITH_INITIALIZER,
@@ -748,42 +786,6 @@
ScannerErrorCode.UNSUPPORTED_OPERATOR,
ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
- StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
- StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
- StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
- StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
- StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
- StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
- StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
- StaticTypeWarningCode.NON_BOOL_CONDITION,
- StaticTypeWarningCode.NON_BOOL_EXPRESSION,
- StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
- StaticTypeWarningCode.NON_BOOL_OPERAND,
- StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
- StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
- StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT,
- StaticTypeWarningCode.UNDEFINED_FUNCTION,
- StaticTypeWarningCode.UNDEFINED_GETTER,
- StaticTypeWarningCode.UNDEFINED_METHOD,
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
- StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
- StaticTypeWarningCode.UNDEFINED_SETTER,
- StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
- StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
- StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
- StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
- StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
- StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
StaticWarningCode.DEAD_NULL_AWARE_EXPRESSION,
StaticWarningCode.INVALID_NULL_AWARE_OPERATOR,
StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 085bacb..d09c2fe 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -22,6 +22,7 @@
EnableString.set_literals: ExperimentalFeatures.set_literals,
EnableString.spread_collections: ExperimentalFeatures.spread_collections,
EnableString.triple_shift: ExperimentalFeatures.triple_shift,
+ EnableString.value_class: ExperimentalFeatures.value_class,
EnableString.variance: ExperimentalFeatures.variance,
};
@@ -34,6 +35,7 @@
true, // set-literals
true, // spread-collections
IsEnabledByDefault.triple_shift,
+ IsEnabledByDefault.value_class,
IsEnabledByDefault.variance,
];
@@ -64,6 +66,9 @@
/// String to enable the experiment "triple-shift"
static const String triple_shift = 'triple-shift';
+ /// String to enable the experiment "value-class"
+ static const String value_class = 'value-class';
+
/// String to enable the experiment "variance"
static const String variance = 'variance';
}
@@ -141,8 +146,17 @@
firstSupportedVersion: null,
);
- static const variance = ExperimentalFeature(
+ static const value_class = ExperimentalFeature(
index: 8,
+ enableString: EnableString.value_class,
+ isEnabledByDefault: IsEnabledByDefault.value_class,
+ isExpired: IsExpired.value_class,
+ documentation: 'Value class',
+ firstSupportedVersion: null,
+ );
+
+ static const variance = ExperimentalFeature(
+ index: 9,
enableString: EnableString.variance,
isEnabledByDefault: IsEnabledByDefault.variance,
isExpired: IsExpired.variance,
@@ -178,6 +192,9 @@
/// Default state of the experiment "triple-shift"
static const bool triple_shift = false;
+ /// Default state of the experiment "value-class"
+ static const bool value_class = false;
+
/// Default state of the experiment "variance"
static const bool variance = false;
}
@@ -210,6 +227,9 @@
/// Expiration status of the experiment "triple-shift"
static const bool triple_shift = false;
+ /// Expiration status of the experiment "value-class"
+ static const bool value_class = false;
+
/// Expiration status of the experiment "variance"
static const bool variance = false;
}
@@ -244,6 +264,9 @@
/// Current state for the flag "triple-shift"
bool get triple_shift => isEnabled(ExperimentalFeatures.triple_shift);
+ /// Current state for the flag "value-class"
+ bool get value_class => isEnabled(ExperimentalFeatures.value_class);
+
/// Current state for the flag "variance"
bool get variance => isEnabled(ExperimentalFeatures.variance);
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index b60196a..a60d615 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -200,37 +200,41 @@
void _checkForInconsistentLanguageVersionOverride(
Map<FileState, CompilationUnit> units,
) {
- var libraryUnit = units.values.first;
+ var libraryEntry = units.entries.first;
+ var libraryUnit = libraryEntry.value;
var libraryOverrideToken = libraryUnit.languageVersionToken;
- for (var partEntry in units.entries.skip(1)) {
- var partUnit = partEntry.value;
- var partOverrideToken = partUnit.languageVersionToken;
- if (libraryOverrideToken != null) {
- if (partOverrideToken != null) {
- if (partOverrideToken.major != libraryOverrideToken.major ||
- partOverrideToken.minor != libraryOverrideToken.minor) {
- _getErrorReporter(partEntry.key).reportErrorForToken(
- CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
- partOverrideToken,
- );
+ var elementToUnit = <CompilationUnitElement, CompilationUnit>{};
+ for (var entry in units.entries) {
+ var unit = entry.value;
+ elementToUnit[unit.declaredElement] = unit;
+ }
+
+ for (var directive in libraryUnit.directives) {
+ if (directive is PartDirective) {
+ var partUnit = elementToUnit[directive.uriElement];
+ if (partUnit != null) {
+ var shouldReport = false;
+ var partOverrideToken = partUnit.languageVersionToken;
+ if (libraryOverrideToken != null) {
+ if (partOverrideToken != null) {
+ if (partOverrideToken.major != libraryOverrideToken.major ||
+ partOverrideToken.minor != libraryOverrideToken.minor) {
+ shouldReport = true;
+ }
+ } else {
+ shouldReport = true;
+ }
+ } else if (partOverrideToken != null) {
+ shouldReport = true;
}
- } else {
- var partDirectives = partUnit.directives;
- for (var partOf in partDirectives.whereType<PartOfDirective>()) {
- var partOffset = partOf.partKeyword.offset;
- _getErrorReporter(partEntry.key).reportErrorForOffset(
+ if (shouldReport) {
+ _getErrorReporter(_library).reportErrorForNode(
CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
- partOffset,
- partOf.ofKeyword.end - partOffset,
+ directive.uri,
);
}
}
- } else if (partOverrideToken != null) {
- _getErrorReporter(partEntry.key).reportErrorForToken(
- CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
- partOverrideToken,
- );
}
}
}
@@ -442,8 +446,8 @@
// non-internal code from importing internal code.
bool privileged = false;
- if (code == StaticTypeWarningCode.UNDEFINED_FUNCTION ||
- code == StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME) {
+ if (code == CompileTimeErrorCode.UNDEFINED_FUNCTION ||
+ code == CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME) {
// Special case a small number of errors in Flutter code which are
// ignored. The erroneous code is found in a conditionally imported
// library, which uses a special version of the "dart:ui" library
@@ -555,7 +559,7 @@
LineInfo lineInfo = unit.lineInfo;
_fileToLineInfo[file] = lineInfo;
- _fileToIgnoreInfo[file] = IgnoreInfo.calculateIgnores(content, lineInfo);
+ _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
return unit;
}
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index db95be9..7db09b6 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -370,10 +370,8 @@
dataErrorCode,
CheckedModeCompileTimeErrorCode
.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH) ||
- identical(
- dataErrorCode,
- CheckedModeCompileTimeErrorCode
- .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
+ identical(dataErrorCode,
+ CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH) ||
identical(dataErrorCode,
CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) {
_errorReporter.reportError(data);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 2509b5f..d844664 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -229,7 +229,7 @@
if (dartObject != null && constant.isConst) {
if (!runtimeTypeMatch(dartObject, constant.type)) {
// TODO(brianwilkerson) This should not be reported if
- // StaticTypeWarningCode.INVALID_ASSIGNMENT has already been
+ // CompileTimeErrorCode.INVALID_ASSIGNMENT has already been
// reported (that is, if the static types are also wrong).
errorReporter.reportErrorForNode(
CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
@@ -621,8 +621,7 @@
if (argumentValue != null) {
if (!runtimeTypeMatch(argumentValue, parameter.type)) {
errorReporter.reportErrorForNode(
- CheckedModeCompileTimeErrorCode
- .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+ CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
errorTarget,
[argumentValue.type, parameter.type]);
}
@@ -636,8 +635,7 @@
// the field.
if (!runtimeTypeMatch(argumentValue, fieldType)) {
errorReporter.reportErrorForNode(
- CheckedModeCompileTimeErrorCode
- .CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+ CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
errorTarget,
[argumentValue.type, fieldType]);
}
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index c3720e9..c713b70 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -115,6 +115,11 @@
return false;
}
+ InstantiatedClass mapArguments(DartType Function(DartType) f) {
+ var mappedArguments = arguments.map(f).toList();
+ return InstantiatedClass(element, mappedArguments);
+ }
+
@override
String toString() {
var buffer = StringBuffer();
@@ -232,6 +237,20 @@
return result.withNullability(nullability);
}
+ /// Return all of the superinterfaces of the given [type].
+ @visibleForTesting
+ Set<InstantiatedClass> computeSuperinterfaceSet(InstantiatedClass type) {
+ var result = <InstantiatedClass>{};
+ _addSuperinterfaces(result, type);
+ if (typeSystem.isNonNullableByDefault) {
+ return result;
+ } else {
+ return result.map((e) {
+ return e.mapArguments(typeSystem.toLegacyType);
+ }).toSet();
+ }
+ }
+
/// Compute the least upper bound of types [i] and [j], both of which are
/// known to be interface types.
///
@@ -265,15 +284,6 @@
);
}
- /// Return all of the superinterfaces of the given [type].
- @visibleForTesting
- static Set<InstantiatedClass> computeSuperinterfaceSet(
- InstantiatedClass type) {
- var result = <InstantiatedClass>{};
- _addSuperinterfaces(result, type);
- return result;
- }
-
/// Add all of the superinterfaces of the given [type] to the given [set].
static void _addSuperinterfaces(
Set<InstantiatedClass> set, InstantiatedClass type) {
diff --git a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
index 790541d..ac55764 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_analyzer.dart
@@ -531,7 +531,7 @@
LineInfo lineInfo = unit.lineInfo;
_fileToLineInfo[file] = lineInfo;
- _fileToIgnoreInfo[file] = IgnoreInfo.calculateIgnores(content, lineInfo);
+ _fileToIgnoreInfo[file] = IgnoreInfo.forDart(unit, content);
return unit;
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 165da43..e558b4d 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -223,7 +223,7 @@
node.staticElement = result.getter;
if (_shouldReportInvalidMember(staticType, result)) {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
operator,
[methodName, staticType],
);
@@ -281,7 +281,7 @@
var leftWriteType = _getStaticType2(node.leftHandSide);
if (!_typeSystem.isAssignableTo2(type, leftWriteType)) {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
+ CompileTimeErrorCode.INVALID_ASSIGNMENT,
node.rightHandSide,
[type, leftWriteType],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index aeff38b..b4bb472 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -65,7 +65,7 @@
var typeArguments = node.typeArguments;
if (typeArguments != null) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode
+ CompileTimeErrorCode
.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
typeArguments,
[element.name, constructorElement.name]);
@@ -122,7 +122,7 @@
var typeArguments = node.typeArguments;
if (typeArguments != null) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode
+ CompileTimeErrorCode
.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
typeArguments,
[element.name, constructorElement.name]);
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 818e4c5..8486729 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -102,7 +102,7 @@
void _checkNonBoolOperand(Expression operand, String operator) {
_resolver.boolExpressionVerifier.checkForNonBoolExpression(
operand,
- errorCode: StaticTypeWarningCode.NON_BOOL_OPERAND,
+ errorCode: CompileTimeErrorCode.NON_BOOL_OPERAND,
arguments: [operator],
);
}
@@ -335,13 +335,13 @@
if (_shouldReportInvalidMember(leftType, result)) {
if (leftOperand is SuperExpression) {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
node.operator,
[methodName, leftType],
);
} else {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
node.operator,
[methodName, leftType],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
index cc18f5e..d6f416c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inference_helper.dart
@@ -406,7 +406,7 @@
List<DartType> typeArguments;
if (typeArgumentList.arguments.length != typeParameters.length) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
typeArgumentList,
[
rawType,
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index ceb24d4..65fc8ab 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -97,7 +97,7 @@
if (receiver is SimpleIdentifier) {
var receiverElement = receiver.staticElement;
if (receiverElement is PrefixElement) {
- _resolveReceiverPrefix(node, receiver, receiverElement, nameNode, name);
+ _resolveReceiverPrefix(node, receiverElement, nameNode, name);
return;
}
}
@@ -190,13 +190,13 @@
);
} else if (nullReceiver) {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
nameNode,
[element.enclosingElement.displayName],
);
} else {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+ CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
nameNode,
[
nameNode.name,
@@ -210,7 +210,7 @@
void _reportInvocationOfNonFunction(MethodInvocation node) {
_setDynamicResolution(node, setNameTypeToDynamic: false);
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION,
node.methodName,
[node.methodName.name],
);
@@ -236,16 +236,18 @@
}
void _reportUndefinedFunction(
- MethodInvocation node, Identifier ignorableIdentifier) {
+ MethodInvocation node, {
+ @required String prefix,
+ @required String name,
+ }) {
_setDynamicResolution(node);
- // TODO(scheglov) This is duplication.
- if (nameScope.shouldIgnoreUndefined(ignorableIdentifier)) {
+ if (nameScope.shouldIgnoreUndefined2(prefix: prefix, name: name)) {
return;
}
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_FUNCTION,
+ CompileTimeErrorCode.UNDEFINED_FUNCTION,
node.methodName,
[node.methodName.name],
);
@@ -255,7 +257,7 @@
MethodInvocation node, String name, ClassElement typeReference) {
_setDynamicResolution(node);
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_METHOD,
+ CompileTimeErrorCode.UNDEFINED_METHOD,
node.methodName,
[name, typeReference.displayName],
);
@@ -513,7 +515,11 @@
} else if (_resolver.enclosingExtension != null) {
receiverType = _resolver.enclosingExtension.extendedType;
} else {
- return _reportUndefinedFunction(node, node.methodName);
+ return _reportUndefinedFunction(
+ node,
+ prefix: null,
+ name: node.methodName.name,
+ );
}
_resolveReceiverType(
@@ -526,8 +532,8 @@
);
}
- void _resolveReceiverPrefix(MethodInvocation node, SimpleIdentifier receiver,
- PrefixElement prefix, SimpleIdentifier nameNode, String name) {
+ void _resolveReceiverPrefix(MethodInvocation node, PrefixElement prefix,
+ SimpleIdentifier nameNode, String name) {
// Note: prefix?.bar is reported as an error in ElementResolver.
if (name == FunctionElement.LOAD_LIBRARY_NAME) {
@@ -543,9 +549,6 @@
}
}
- // TODO(scheglov) I don't like how we resolve prefixed names.
- // But maybe this is the only one solution.
- var prefixedName = PrefixedIdentifierImpl.temp(receiver, nameNode);
var element = prefix.scope.lookup2(name).getter;
element = _resolver.toLegacyElement(element);
nameNode.staticElement = element;
@@ -563,7 +566,11 @@
return _setResolution(node, element.type);
}
- _reportUndefinedFunction(node, prefixedName);
+ _reportUndefinedFunction(
+ node,
+ prefix: prefix.name,
+ name: name,
+ );
}
void _resolveReceiverSuper(MethodInvocation node, SuperExpression receiver,
@@ -609,7 +616,7 @@
// Nothing help, there is no target at all.
_setDynamicResolution(node);
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+ CompileTimeErrorCode.UNDEFINED_SUPER_METHOD,
nameNode,
[name, enclosingClass.displayName]);
}
@@ -664,7 +671,7 @@
if (!nameNode.isSynthetic) {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_METHOD,
+ CompileTimeErrorCode.UNDEFINED_METHOD,
nameNode,
[name, receiverClassName],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 43b20e7..e3f3cc0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -73,7 +73,7 @@
var operandWriteType = _getWriteType(operand);
if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
+ CompileTimeErrorCode.INVALID_ASSIGNMENT,
node,
[type, operandWriteType],
);
@@ -149,13 +149,13 @@
if (_shouldReportInvalidMember(receiverType, result)) {
if (operand is SuperExpression) {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
node.operator,
[methodName, receiverType],
);
} else {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
node.operator,
[methodName, receiverType],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index beeb19a..8a27334 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -73,7 +73,7 @@
var operandWriteType = _getStaticType(operand);
if (!_typeSystem.isAssignableTo2(type, operandWriteType)) {
_resolver.errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
+ CompileTimeErrorCode.INVALID_ASSIGNMENT,
node,
[type, operandWriteType],
);
@@ -205,13 +205,13 @@
if (_shouldReportInvalidMember(staticType, result)) {
if (operand is SuperExpression) {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
operator,
[methodName, staticType],
);
} else {
_errorReporter.reportErrorForToken(
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
operator,
[methodName, staticType],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index af28859..3b74a26 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -11,6 +11,7 @@
import 'package:analyzer/src/dart/element/scope.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/generated/engine.dart';
+import 'package:meta/meta.dart';
/// The scope defined by a block.
class BlockScope {
@@ -406,24 +407,34 @@
extension ScopeExtension on Scope {
/// Return `true` if the fact that the given [node] is not defined should be
- /// ignored (from the perspective of error reporting). This will be the case
- /// if there is at least one import that defines the node's prefix, and if
- /// that import either has no show combinators or has a show combinator that
- /// explicitly lists the node's name.
+ /// ignored (from the perspective of error reporting).
bool shouldIgnoreUndefined(Identifier node) {
if (node is PrefixedIdentifier) {
- return _enclosingLibraryScope.shouldIgnoreUndefined(
+ return shouldIgnoreUndefined2(
prefix: node.prefix.name,
name: node.identifier.name,
);
}
- return _enclosingLibraryScope.shouldIgnoreUndefined(
+ return shouldIgnoreUndefined2(
prefix: null,
name: (node as SimpleIdentifier).name,
);
}
+ /// Return `true` if the fact that the identifier with the given [prefix]
+ /// (might be `null`) and [name] is not defined should be ignored (from the
+ /// perspective of error reporting).
+ bool shouldIgnoreUndefined2({
+ @required String prefix,
+ @required String name,
+ }) {
+ return _enclosingLibraryScope.shouldIgnoreUndefined(
+ prefix: prefix,
+ name: name,
+ );
+ }
+
List<ExtensionElement> get extensions {
return _enclosingLibraryScope.extensions;
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
index b6a88ef..29f8498 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_name_resolver.dart
@@ -122,7 +122,7 @@
if (argumentCount != parameterCount) {
errorReporter.reportErrorForNode(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS,
node,
[node.name.name, parameterCount, argumentCount],
);
@@ -333,7 +333,7 @@
var typeArguments = node.typeArguments;
if (typeArguments != null) {
errorReporter.reportErrorForNode(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
typeArguments,
[classIdentifier.name, constructorIdentifier.name],
);
@@ -354,8 +354,10 @@
}
if (_isInstanceCreation(node)) {
+ node.type = dynamicType;
_ErrorHelper(errorReporter).reportNewWithNonType(node);
} else {
+ node.type = dynamicType;
errorReporter.reportErrorForNode(
CompileTimeErrorCode.NOT_A_TYPE,
typeIdentifier,
@@ -454,7 +456,7 @@
if (_isTypeInTypeArgumentList(node)) {
errorReporter.reportErrorForNode(
- StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT,
+ CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT,
identifier,
[identifier.name],
);
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index f12a3d2..e79edc9 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -87,7 +87,7 @@
if (declaredReturnType != null) {
if (!_typeSystem.isAssignableTo2(impliedReturnType, declaredReturnType)) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+ CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
expression,
[impliedReturnType, declaredReturnType],
);
@@ -108,7 +108,7 @@
if (!_typeSystem.isAssignableTo2(impliedReturnType, requiredReturnType)) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
+ CompileTimeErrorCode.YIELD_OF_INVALID_TYPE,
expression,
[impliedReturnType, requiredReturnType],
);
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 3839122..6eff16b 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -15,6 +15,7 @@
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/member.dart' show ExecutableMember;
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type_system.dart';
import 'package:analyzer/src/dart/resolver/body_inference_context.dart';
@@ -279,7 +280,8 @@
}
}
}
- _checkStrictInferenceInParameters(node.parameters);
+ _checkStrictInferenceInParameters(node.parameters,
+ body: node.body, initializers: node.initializers);
super.visitConstructorDeclaration(node);
}
@@ -360,7 +362,8 @@
if (node.parent is CompilationUnit && !node.isSetter) {
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
}
- _checkStrictInferenceInParameters(node.functionExpression.parameters);
+ _checkStrictInferenceInParameters(node.functionExpression.parameters,
+ body: node.functionExpression.body);
super.visitFunctionDeclaration(node);
} finally {
_inDeprecatedMember = wasInDeprecatedMember;
@@ -381,7 +384,7 @@
}
DartType functionType = InferenceContext.getContext(node);
if (functionType is! FunctionType) {
- _checkStrictInferenceInParameters(node.parameters);
+ _checkStrictInferenceInParameters(node.parameters, body: node.body);
}
super.visitFunctionExpression(node);
}
@@ -400,6 +403,7 @@
@override
void visitFunctionTypeAlias(FunctionTypeAlias node) {
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
+ _checkStrictInferenceInParameters(node.parameters);
super.visitFunctionTypeAlias(node);
}
@@ -493,7 +497,7 @@
if (!node.isSetter && !elementIsOverride()) {
_checkStrictInferenceReturnType(node.returnType, node, node.name.name);
}
- _checkStrictInferenceInParameters(node.parameters);
+ _checkStrictInferenceInParameters(node.parameters, body: node.body);
ExecutableElement overriddenElement = getConcreteOverriddenElement();
if (overriddenElement == null && (node.isSetter || node.isGetter)) {
@@ -1313,9 +1317,37 @@
/// In "strict-inference" mode, check that each of the [parameters]' type is
/// specified.
- void _checkStrictInferenceInParameters(FormalParameterList parameters) {
+ ///
+ /// Only parameters which are referenced in [initializers] or [body] are
+ /// reported. If [initializers] and [body] are both null, the parameters are
+ /// assumed to originate from a typedef, function-typed parameter, or function
+ /// which is abstract or external.
+ void _checkStrictInferenceInParameters(FormalParameterList parameters,
+ {List<ConstructorInitializer> initializers, FunctionBody body}) {
+ _UsedParameterVisitor usedParameterVisitor;
+
+ bool isParameterReferenced(SimpleFormalParameter parameter) {
+ if ((body == null || body is EmptyFunctionBody) && initializers == null) {
+ // The parameter is in a typedef, or function that is abstract,
+ // external, etc.
+ return true;
+ }
+ if (usedParameterVisitor == null) {
+ // Visit the function body and initializers once to determine whether
+ // each of the parameters is referenced.
+ usedParameterVisitor = _UsedParameterVisitor(
+ parameters.parameters.map((p) => p.declaredElement).toSet());
+ body?.accept(usedParameterVisitor);
+ for (var initializer in initializers ?? []) {
+ initializer.accept(usedParameterVisitor);
+ }
+ }
+
+ return usedParameterVisitor.isUsed(parameter.declaredElement);
+ }
+
void checkParameterTypeIsKnown(SimpleFormalParameter parameter) {
- if (parameter.type == null) {
+ if (parameter.type == null && isParameterReferenced(parameter)) {
ParameterElement element = parameter.declaredElement;
_errorReporter.reportErrorForNode(
HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER,
@@ -1653,3 +1685,27 @@
identifier.parent is Combinator &&
identifier.parent.parent is ExportDirective;
}
+
+/// A visitor that determines, upon visiting a function body and/or a
+/// constructor's initializers, whether a parameter is referenced.
+class _UsedParameterVisitor extends RecursiveAstVisitor<void> {
+ final Set<ParameterElement> _parameters;
+
+ final Set<ParameterElement> _usedParameters = {};
+
+ _UsedParameterVisitor(this._parameters);
+
+ bool isUsed(ParameterElement parameter) =>
+ _usedParameters.contains(parameter);
+
+ @override
+ void visitSimpleIdentifier(SimpleIdentifier node) {
+ Element element = node.staticElement;
+ if (element is ExecutableMember) {
+ element = element.declaration;
+ }
+ if (_parameters.contains(element)) {
+ _usedParameters.add(element);
+ }
+ }
+}
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index cf46b92..05eb039 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -35,11 +35,11 @@
/// Check to ensure that the [condition] is of type bool, are. Otherwise an
/// error is reported on the expression.
///
- /// See [StaticTypeWarningCode.NON_BOOL_CONDITION].
+ /// See [CompileTimeErrorCode.NON_BOOL_CONDITION].
void checkForNonBoolCondition(Expression condition) {
checkForNonBoolExpression(
condition,
- errorCode: StaticTypeWarningCode.NON_BOOL_CONDITION,
+ errorCode: CompileTimeErrorCode.NON_BOOL_CONDITION,
);
}
@@ -62,7 +62,7 @@
void checkForNonBoolNegationExpression(Expression expression) {
checkForNonBoolExpression(
expression,
- errorCode: StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION,
+ errorCode: CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION,
);
}
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index bc93306..f53e655 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -42,60 +42,6 @@
"has type '{2}'.");
/**
- * Parameters:
- * 0: The type of the runtime value of the argument
- * 1: The static type of the parameter
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the runtime type of a constant
- // value can't be assigned to the static type of a constant constructor's
- // parameter.
- //
- // #### Example
- //
- // The following code produces this diagnostic because the runtime type of `i`
- // is `int`, which can't be assigned to the static type of `s`:
- //
- // ```dart
- // class C {
- // final String s;
- //
- // const C(this.s);
- // }
- //
- // const dynamic i = 0;
- //
- // void f() {
- // const C([!i!]);
- // }
- // ```
- //
- // #### Common fixes
- //
- // Pass a value of the correct type to the constructor:
- //
- // ```dart
- // class C {
- // final String s;
- //
- // const C(this.s);
- // }
- //
- // const dynamic i = 0;
- //
- // void f() {
- // const C('$i');
- // }
- // ```
- static const CheckedModeCompileTimeErrorCode
- CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH = CheckedModeCompileTimeErrorCode(
- 'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
- "A value of type '{0}' can't be assigned to a parameter of type "
- "'{1}'.",
- hasPublishedDocs: true);
-
- /**
* 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error
* if o is not <b>null</b> and the interface of the class of <i>o</i> is not a
* subtype of the static type of the field <i>v</i>.
@@ -1444,6 +1390,60 @@
correction: "Try renaming either the type variable or the member.");
/**
+ * Parameters:
+ * 0: The type of the runtime value of the argument
+ * 1: The static type of the parameter
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the runtime type of a constant
+ // value can't be assigned to the static type of a constant constructor's
+ // parameter.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the runtime type of `i`
+ // is `int`, which can't be assigned to the static type of `s`:
+ //
+ // ```dart
+ // class C {
+ // final String s;
+ //
+ // const C(this.s);
+ // }
+ //
+ // const dynamic i = 0;
+ //
+ // void f() {
+ // const C([!i!]);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Pass a value of the correct type to the constructor:
+ //
+ // ```dart
+ // class C {
+ // final String s;
+ //
+ // const C(this.s);
+ // }
+ //
+ // const dynamic i = 0;
+ //
+ // void f() {
+ // const C('$i');
+ // }
+ // ```
+ static const CompileTimeErrorCode CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH =
+ CompileTimeErrorCode(
+ 'CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH',
+ "A value of type '{0}' can't be assigned to a parameter of type "
+ "'{1}'.",
+ hasPublishedDocs: true);
+
+ /**
* 16.12.2 Const: It is a compile-time error if evaluation of a constant
* object results in an uncaught exception being thrown.
*/
@@ -2501,6 +2501,45 @@
hasPublishedDocs: true);
/**
+ * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
+ * class implements the built-in class <i>List<E></i> is allocated.
+ *
+ * Parameters:
+ * 0: the number of provided type arguments
+ */
+ static const CompileTimeErrorCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
+ CompileTimeErrorCode(
+ 'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
+ "List literals require exactly one type argument or none, "
+ "but {0} found.",
+ correction: "Try adjusting the number of type arguments.");
+
+ /**
+ * Parameters:
+ * 0: the number of provided type arguments
+ */
+ static const CompileTimeErrorCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
+ CompileTimeErrorCode(
+ 'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
+ "Set literals require exactly one type argument or none, "
+ "but {0} found.",
+ correction: "Try adjusting the number of type arguments.");
+
+ /**
+ * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
+ * implements the built-in class <i>Map<K, V></i> is allocated.
+ *
+ * Parameters:
+ * 0: the number of provided type arguments
+ */
+ static const CompileTimeErrorCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
+ CompileTimeErrorCode(
+ 'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
+ "Map literals require exactly two type arguments or none, "
+ "but {0} found.",
+ correction: "Try adjusting the number of type arguments.");
+
+ /**
* SDK implementation libraries can be exported only by other SDK libraries.
*
* Parameters:
@@ -3487,6 +3526,61 @@
correction: "Try adding initializers for the fields.",
hasPublishedDocs: true);
+ /**
+ * 17.6.2 For-in. It the iterable expression does not implement Iterable with
+ * a type argument that can be assigned to the for-in variable's type, this
+ * warning is reported.
+ *
+ * Parameters:
+ * 0: The type of the iterable expression.
+ * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+ * 2: The loop variable type.
+ */
+ static const CompileTimeErrorCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
+ CompileTimeErrorCode(
+ 'FOR_IN_OF_INVALID_ELEMENT_TYPE',
+ "The type '{0}' used in the 'for' loop must implement {1} with a "
+ "type argument that can be assigned to '{2}'.");
+
+ /**
+ * Parameters:
+ * 0: The type of the iterable expression.
+ * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the expression following `in` in
+ // a for-in loop has a type that isn't a subclass of `Iterable`.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `m` is a `Map`, and
+ // `Map` isn't a subclass of `Iterable`:
+ //
+ // ```dart
+ // void f(Map<String, String> m) {
+ // for (String s in [!m!]) {
+ // print(s);
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Replace the expression with one that produces an iterable value:
+ //
+ // ```dart
+ // void f(Map<String, String> m) {
+ // for (String s in m.values) {
+ // print(s);
+ // }
+ // }
+ // ```
+ static const CompileTimeErrorCode FOR_IN_OF_INVALID_TYPE =
+ CompileTimeErrorCode('FOR_IN_OF_INVALID_TYPE',
+ "The type '{0}' used in the 'for' loop must implement {1}.",
+ hasPublishedDocs: true);
+
static const CompileTimeErrorCode FOR_IN_WITH_CONST_VARIABLE =
CompileTimeErrorCode('FOR_IN_WITH_CONST_VARIABLE',
"A for-in loop-variable can't be 'const'.",
@@ -3573,6 +3667,54 @@
"removing the modifier 'async*' from the function body.");
/**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the body of a function has the
+ // `async` modifier even though the return type of the function isn't
+ // assignable to `Future`.
+ //
+ // #### Example
+ //
+ // The following code produces this diagnostic because the body of the
+ // function `f` has the `async` modifier even though the return type isn't
+ // assignable to `Future`:
+ //
+ // ```dart
+ // [!int!] f() async {
+ // return 0;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the function should be asynchronous, then change the return type to be
+ // assignable to `Future`:
+ //
+ // ```dart
+ // Future<int> f() async {
+ // return 0;
+ // }
+ // ```
+ //
+ // If the function should be synchronous, then remove the `async` modifier:
+ //
+ // ```dart
+ // int f() {
+ // return 0;
+ // }
+ // ```
+ static const CompileTimeErrorCode ILLEGAL_ASYNC_RETURN_TYPE =
+ CompileTimeErrorCode(
+ 'ILLEGAL_ASYNC_RETURN_TYPE',
+ "Functions marked 'async' must have a return type assignable to "
+ "'Future'.",
+ correction: "Try fixing the return type of the function, or "
+ "removing the modifier 'async' from the function body.",
+ hasPublishedDocs: true);
+
+ /**
* It is a compile-time error if the declared return type of a function marked
* 'sync*' is not a supertype of 'Iterable<T>' for some type 'T'.
*/
@@ -4066,6 +4208,51 @@
correction: "Try removing the initialization.");
/**
+ * Parameters:
+ * 0: the name of the static member
+ * 1: the kind of the static member (field, getter, setter, or method)
+ * 2: the name of the defining class
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when an access operator is used to
+ // access a static member through an instance of the class.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `zero` is a static
+ // field, but it’s being accessed as if it were an instance field:
+ //
+ // ```dart
+ // void f(C c) {
+ // c.[!zero!];
+ // }
+ //
+ // class C {
+ // static int zero = 0;
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Use the class to access the static member:
+ //
+ // ```dart
+ // void f(C c) {
+ // C.zero;
+ // }
+ //
+ // class C {
+ // static int zero = 0;
+ // }
+ // ```
+ static const CompileTimeErrorCode INSTANCE_ACCESS_TO_STATIC_MEMBER =
+ CompileTimeErrorCode('INSTANCE_ACCESS_TO_STATIC_MEMBER',
+ "Static {1} '{0}' can't be accessed through an instance.",
+ correction: "Try using the class '{2}' to access the {1}.",
+ hasPublishedDocs: true);
+
+ /**
* No parameters.
*/
// #### Description
@@ -4273,6 +4460,56 @@
/**
* Parameters:
+ * 0: the name of the right hand side type
+ * 1: the name of the left hand side type
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the static type of an expression
+ // that is assigned to a variable isn't assignable to the type of the
+ // variable.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because the type of the
+ // initializer (`int`) isn't assignable to the type of the variable
+ // (`String`):
+ //
+ // ```dart
+ // int i = 0;
+ // String s = [!i!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the value being assigned is always assignable at runtime, even though
+ // the static types don't reflect that, then add an explicit cast.
+ //
+ // Otherwise, change the value being assigned so that it has the expected
+ // type. In the previous example, this might look like:
+ //
+ // ```dart
+ // int i = 0;
+ // String s = i.toString();
+ // ```
+ //
+ // If you can’t change the value, then change the type of the variable to be
+ // compatible with the type of the value being assigned:
+ //
+ // ```dart
+ // int i = 0;
+ // int s = i;
+ // ```
+ static const CompileTimeErrorCode INVALID_ASSIGNMENT = CompileTimeErrorCode(
+ 'INVALID_ASSIGNMENT',
+ "A value of type '{0}' can't be assigned to a variable of type "
+ "'{1}'.",
+ correction: "Try changing the type of the variable, or "
+ "casting the right-hand type to '{1}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
* 0: the type of the function
* 1: the expected function type
*/
@@ -4793,6 +5030,94 @@
hasPublishedDocs: true);
/**
+ * Parameters:
+ * 0: the name of the identifier that is not a function type
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it finds a function invocation,
+ // but the name of the function being invoked is defined to be something other
+ // than a function.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `Binary` is the name of
+ // a function type, not a function:
+ //
+ // ```dart
+ // typedef Binary = int Function(int, int);
+ //
+ // int f() {
+ // return [!Binary!](1, 2);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Replace the name with the name of a function.
+ static const CompileTimeErrorCode INVOCATION_OF_NON_FUNCTION =
+ CompileTimeErrorCode(
+ 'INVOCATION_OF_NON_FUNCTION', "'{0}' isn't a function.",
+ // TODO(brianwilkerson) Split this error code so that we can provide
+ // better error and correction messages.
+ correction:
+ "Try correcting the name to match an existing function, or "
+ "define a method or function named '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a function invocation is found,
+ // but the name being referenced isn't the name of a function, or when the
+ // expression computing the function doesn't compute a function.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `x` isn't a function:
+ //
+ // ```dart
+ // int x = 0;
+ //
+ // int f() => x;
+ //
+ // var y = [!x!]();
+ // ```
+ //
+ // The following code produces this diagnostic because `f()` doesn't return a
+ // function:
+ //
+ // ```dart
+ // int x = 0;
+ //
+ // int f() => x;
+ //
+ // var y = [!f()!]();
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If you need to invoke a function, then replace the code before the argument
+ // list with the name of a function or with an expression that computes a
+ // function:
+ //
+ // ```dart
+ // int x = 0;
+ //
+ // int f() => x;
+ //
+ // var y = f();
+ // ```
+ static const CompileTimeErrorCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
+ CompileTimeErrorCode(
+ 'INVOCATION_OF_NON_FUNCTION_EXPRESSION',
+ "The expression doesn't evaluate to a function, so it can't be "
+ "invoked.",
+ hasPublishedDocs: true);
+
+ /**
* 13.13 Break: It is a compile-time error if no such statement
* <i>s<sub>E</sub></i> exists within the innermost function in which
* <i>s<sub>b</sub></i> occurs.
@@ -5580,6 +5905,21 @@
"explicitly invoking a different constructor in '{0}'.");
/**
+ * User friendly specialized error for [NON_GENERATIVE_CONSTRUCTOR]. This
+ * handles the case of `class E extends Exception` which will never work
+ * because [Exception] has no generative constructors.
+ */
+ static const CompileTimeErrorCode NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS =
+ CompileTimeErrorCode(
+ 'NO_GENERATIVE_CONSTRUCTOR_IN_SUPERCLASS',
+ "The class '{0}' cannot extend '{1}' because '{1}' only has factory"
+ " constructors (no generative constructors), and '{0}' has at"
+ ' least one generative constructor.',
+ correction: 'Try implementing the class instead, adding a generative'
+ " (not factory) constructor to the superclass {0}, or a factory"
+ ' constructor to the subclass.');
+
+ /**
* Parameters:
* 0: the name of the superclass that does not define an implicitly invoked
* constructor
@@ -5735,6 +6075,140 @@
hasPublishedDocs: true);
/**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a condition, such as an `if` or
+ // `while` loop, doesn't have the static type `bool`.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `x` has the static type
+ // `int`:
+ //
+ // ```dart
+ // void f(int x) {
+ // if ([!x!]) {
+ // // ...
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Change the condition so that it produces a Boolean value:
+ //
+ // ```dart
+ // void f(int x) {
+ // if (x == 0) {
+ // // ...
+ // }
+ // }
+ // ```
+ static const CompileTimeErrorCode NON_BOOL_CONDITION = CompileTimeErrorCode(
+ 'NON_BOOL_CONDITION', "Conditions must have a static type of 'bool'.",
+ correction: "Try changing the condition.", hasPublishedDocs: true);
+
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the first expression in an
+ // assert has a type other than `bool`.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because the type of `p` is
+ // `int`, but a `bool` is required:
+ //
+ // ```dart
+ // void f(int p) {
+ // assert([!p!]);
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Change the expression so that it has the type `bool`:
+ //
+ // ```dart
+ // void f(int p) {
+ // assert(p > 0);
+ // }
+ // ```
+ static const CompileTimeErrorCode NON_BOOL_EXPRESSION = CompileTimeErrorCode(
+ 'NON_BOOL_EXPRESSION',
+ "The expression in an assert must be of type 'bool'.",
+ correction: "Try changing the expression.",
+ hasPublishedDocs: true);
+
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the operand of the unary
+ // negation operator (`!`) doesn't have the type `bool`.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `x` is an `int` when it
+ // must be a `bool`:
+ //
+ // ```dart
+ // int x = 0;
+ // bool y = ![!x!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Replace the operand with an expression that has the type `bool`:
+ //
+ // ```dart
+ // int x = 0;
+ // bool y = !(x > 0);
+ // ```
+ static const CompileTimeErrorCode NON_BOOL_NEGATION_EXPRESSION =
+ CompileTimeErrorCode('NON_BOOL_NEGATION_EXPRESSION',
+ "A negation operand must have a static type of 'bool'.",
+ correction: "Try changing the operand to the '!' operator.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
+ * 0: the lexeme of the logical operator
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when one of the operands of either
+ // the `&&` or `||` operator doesn't have the type `bool`.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `a` isn't a Boolean
+ // value:
+ //
+ // ```dart
+ // int a = 3;
+ // bool b = [!a!] || a > 1;
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Change the operand to a Boolean value:
+ //
+ // ```dart
+ // int a = 3;
+ // bool b = a == 0 || a > 1;
+ // ```
+ static const CompileTimeErrorCode NON_BOOL_OPERAND = CompileTimeErrorCode(
+ 'NON_BOOL_OPERAND',
+ "The operands of the operator '{0}' must be assignable to 'bool'.",
+ hasPublishedDocs: true);
+
+ /**
* 13.2 Expression Statements: It is a compile-time error if a non-constant
* map literal that has no explicit type arguments appears in a place where a
* statement is expected.
@@ -6177,20 +6651,80 @@
* Let <i>k</i> be a generative constructor. It is a compile-time error if
* class <i>S</i> does not declare a generative constructor named <i>S</i>
* (respectively <i>S.id</i>)
+ *
+ * Parameters:
+ * 0: the non-generative constructor
*/
static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR =
- CompileTimeErrorCode('NON_GENERATIVE_CONSTRUCTOR',
- "The generative constructor '{0}' expected, but factory found.",
+ CompileTimeErrorCode(
+ 'NON_GENERATIVE_CONSTRUCTOR',
+ "The constructor '{0}' is a factory constructor, but must be a"
+ " generative constructor to be a valid superinitializer.",
correction:
- "Try calling a different constructor in the superclass, or "
+ "Try calling a different constructor of the superclass, or "
"making the called constructor not be a factory constructor.");
+ /**
+ * An error code for when a class has no explicit constructor, and therefore
+ * a constructor is implicitly defined which uses a factory as a
+ * superinitializer. See [NON_GENERATIVE_CONSTRUCTOR].
+ *
+ * Parameters:
+ * 0: the name of the superclass
+ * 1: the name of the current class
+ * 2: the implicitly called factory constructor of the superclass
+ */
+ static const CompileTimeErrorCode NON_GENERATIVE_IMPLICIT_CONSTRUCTOR =
+ CompileTimeErrorCode(
+ 'NON_GENERATIVE_IMPLICIT_CONSTRUCTOR',
+ "The default constructor of superclass '{0}' (called by the implicit"
+ " default constructor of '{1}') must be a generative constructor,"
+ " but factory found.",
+ correction: 'Try adding an explicit constructor that has a different'
+ " superinitializer or changing the superclass constructor '{2}'"
+ " to not be a factory constructor.");
+
static const CompileTimeErrorCode NON_SYNC_FACTORY = CompileTimeErrorCode(
'NON_SYNC_FACTORY',
"Factory bodies can't use 'async', 'async*', or 'sync*'.");
/**
* Parameters:
+ * 0: the name appearing where a type is expected
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when an identifier that isn't a type
+ // is used as a type argument.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `x` is a variable, not
+ // a type:
+ //
+ // ```dart
+ // var x = 0;
+ // List<[!x!]> xList = [];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Change the type argument to be a type:
+ //
+ // ```dart
+ // var x = 0;
+ // List<int> xList = [];
+ // ```
+ static const CompileTimeErrorCode NON_TYPE_AS_TYPE_ARGUMENT =
+ CompileTimeErrorCode('NON_TYPE_AS_TYPE_ARGUMENT',
+ "The name '{0}' isn't a type so it can't be used as a type argument.",
+ correction: "Try correcting the name to an existing type, or "
+ "defining a type named '{0}'.",
+ hasPublishedDocs: true,
+ isUnresolvedIdentifier: true);
+
+ /**
+ * Parameters:
* 0: the name of the non-type element
*/
// #### Description
@@ -7594,6 +8128,112 @@
"changing the method body modifier.");
/**
+ * Parameters:
+ * 0: the return type as declared in the return statement
+ * 1: the expected return type as defined by the method
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when the static type of a returned
+ // expression isn't assignable to the return type that the closure is required
+ // to have.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `f` is defined to be a
+ // function that returns a `String`, but the closure assigned to it returns an
+ // `int`:
+ //
+ // ```dart
+ // String Function(String) f = (s) => [!3!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the return type is correct, then replace the returned value with a value
+ // of the correct type, possibly by converting the existing value:
+ //
+ // ```dart
+ // String Function(String) f = (s) => 3.toString();
+ // ```
+ static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
+ CompileTimeErrorCode(
+ 'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
+ "The return type '{0}' isn't a '{1}', as required by the closure's "
+ "context.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
+ * 0: the return type as declared in the return statement
+ * 1: the expected return type as defined by the enclosing class
+ * 2: the name of the constructor
+ */
+ static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
+ CompileTimeErrorCodeWithUniqueName(
+ 'RETURN_OF_INVALID_TYPE',
+ 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
+ "A value of type '{0}' can't be returned from constructor '{2}' "
+ "because it has a return type of '{1}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
+ * 0: the return type as declared in the return statement
+ * 1: the expected return type as defined by the method
+ * 2: the name of the method
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a method or function returns a
+ // value whose type isn't assignable to the declared return type.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `f` has a return type
+ // of `String` but is returning an `int`:
+ //
+ // ```dart
+ // String f() => [!3!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the return type is correct, then replace the value being returned with a
+ // value of the correct type, possibly by converting the existing value:
+ //
+ // ```dart
+ // String f() => 3.toString();
+ // ```
+ //
+ // If the value is correct, then change the return type to match:
+ //
+ // ```dart
+ // int f() => 3;
+ // ```
+ static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
+ CompileTimeErrorCodeWithUniqueName(
+ 'RETURN_OF_INVALID_TYPE',
+ 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
+ "A value of type '{0}' can't be returned from function '{2}' because "
+ "it has a return type of '{1}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
+ * 0: the return type as declared in the return statement
+ * 1: the expected return type as defined by the method
+ * 2: the name of the method
+ */
+ static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
+ CompileTimeErrorCodeWithUniqueName(
+ 'RETURN_OF_INVALID_TYPE',
+ 'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
+ "A value of type '{0}' can't be returned from method '{2}' because "
+ "it has a return type of '{1}'.",
+ hasPublishedDocs: true);
+
+ /**
* No parameters.
*/
// #### Description
@@ -7992,6 +8632,21 @@
"making the member an instance member.");
/**
+ * 10 Generics: It is a static type warning if a type parameter is a supertype
+ * of its upper bound.
+ *
+ * Parameters:
+ * 0: the name of the type parameter
+ * 1: the name of the bounding type
+ *
+ * See [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+ */
+ static const CompileTimeErrorCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND =
+ CompileTimeErrorCode('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND',
+ "'{0}' can't be a supertype of its upper bound.",
+ correction: "Try using a type that is or is a subclass of '{1}'.");
+
+ /**
* 12.31 Type Test: It is a static warning if <i>T</i> does not denote a type
* available in the current lexical scope.
*/
@@ -8295,6 +8950,55 @@
/**
* Parameters:
+ * 0: the name of the enumeration constant that is not defined
+ * 1: the name of the enumeration used to access the constant
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it encounters an identifier that
+ // appears to be the name of an enum constant, and the name either isn't
+ // defined or isn't visible in the scope in which it's being referenced.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `E` doesn't define a
+ // constant named `c`:
+ //
+ // ```dart
+ // enum E {a, b}
+ //
+ // var e = E.[!c!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the constant should be defined, then add it to the declaration of the
+ // enum:
+ //
+ // ```dart
+ // enum E {a, b, c}
+ //
+ // var e = E.c;
+ // ```
+ //
+ // If the constant shouldn't be defined, then change the name to the name of
+ // an existing constant:
+ //
+ // ```dart
+ // enum E {a, b}
+ //
+ // var e = E.b;
+ // ```
+ static const CompileTimeErrorCode UNDEFINED_ENUM_CONSTANT =
+ CompileTimeErrorCode('UNDEFINED_ENUM_CONSTANT',
+ "There's no constant named '{0}' in '{1}'.",
+ correction:
+ "Try correcting the name to the name of an existing constant, or "
+ "defining a constant named '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
* 0: the name of the getter that is undefined
* 1: the name of the extension that was explicitly specified
*/
@@ -8610,6 +9314,89 @@
/**
* Parameters:
+ * 0: the name of the method that is undefined
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it encounters an identifier that
+ // appears to be the name of a function but either isn't defined or isn't
+ // visible in the scope in which it's being referenced.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because the name `emty` isn't
+ // defined:
+ //
+ // ```dart
+ // List<int> empty() => [];
+ //
+ // void main() {
+ // print([!emty!]());
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the identifier isn't defined, then either define it or replace it with
+ // the name of a function that is defined. The example above can be corrected
+ // by fixing the spelling of the function:
+ //
+ // ```dart
+ // List<int> empty() => [];
+ //
+ // void main() {
+ // print(empty());
+ // }
+ // ```
+ //
+ // If the function is defined but isn't visible, then you probably need to add
+ // an import or re-arrange your code to make the function visible.
+ static const CompileTimeErrorCode UNDEFINED_FUNCTION = CompileTimeErrorCode(
+ 'UNDEFINED_FUNCTION', "The function '{0}' isn't defined.",
+ correction: "Try importing the library that defines '{0}', "
+ "correcting the name to the name of an existing function, or "
+ "defining a function named '{0}'.",
+ hasPublishedDocs: true,
+ isUnresolvedIdentifier: true);
+
+ /**
+ * Parameters:
+ * 0: the name of the getter
+ * 1: the name of the enclosing type where the getter is being looked for
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it encounters an identifier that
+ // appears to be the name of a getter but either isn't defined or isn't
+ // visible in the scope in which it's being referenced.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `String` has no member
+ // named `len`:
+ //
+ // ```dart
+ // int f(String s) => s.[!len!];
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the identifier isn't defined, then either define it or replace it with
+ // the name of a getter that is defined. The example above can be corrected by
+ // fixing the spelling of the getter:
+ //
+ // ```dart
+ // int f(String s) => s.length;
+ // ```
+ static const CompileTimeErrorCode UNDEFINED_GETTER = CompileTimeErrorCode(
+ 'UNDEFINED_GETTER', "The getter '{0}' isn't defined for the type '{1}'.",
+ correction: "Try importing the library that defines '{0}', "
+ "correcting the name to the name of an existing getter, or "
+ "defining a getter or field named '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
* 0: the name of the identifier
*/
// #### Description
@@ -8683,6 +9470,42 @@
/**
* Parameters:
+ * 0: the name of the method that is undefined
+ * 1: the resolved type name that the method lookup is happening on
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it encounters an identifier that
+ // appears to be the name of a method but either isn't defined or isn't
+ // visible in the scope in which it's being referenced.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because the identifier
+ // `removeMiddle` isn't defined:
+ //
+ // ```dart
+ // int f(List<int> l) => l.[!removeMiddle!]();
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the identifier isn't defined, then either define it or replace it with
+ // the name of a method that is defined. The example above can be corrected by
+ // fixing the spelling of the method:
+ //
+ // ```dart
+ // int f(List<int> l) => l.removeLast();
+ // ```
+ static const CompileTimeErrorCode UNDEFINED_METHOD = CompileTimeErrorCode(
+ 'UNDEFINED_METHOD', "The method '{0}' isn't defined for the type '{1}'.",
+ correction:
+ "Try correcting the name to the name of an existing method, or "
+ "defining a method named '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
* 0: the name of the requested named parameter
*/
// #### Description
@@ -8759,6 +9582,245 @@
/**
* Parameters:
+ * 0: the name of the operator
+ * 1: the name of the enclosing type where the operator is being looked for
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a user-definable operator is
+ // invoked on an object for which the operator isn't defined.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because the class `C` doesn't
+ // define the operator `+`:
+ //
+ // ```dart
+ // class C {}
+ //
+ // C f(C c) => c [!+!] 2;
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the operator should be defined for the class, then define it:
+ //
+ // ```dart
+ // class C {
+ // C operator +(int i) => this;
+ // }
+ //
+ // C f(C c) => c + 2;
+ // ```
+ static const CompileTimeErrorCode UNDEFINED_OPERATOR = CompileTimeErrorCode(
+ 'UNDEFINED_OPERATOR',
+ "The operator '{0}' isn't defined for the type '{1}'.",
+ correction: "Try defining the operator '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * No parameters.
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a prefixed identifier is found
+ // where the prefix is valid, but the identifier isn't declared in any of the
+ // libraries imported using that prefix.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `dart:core` doesn't
+ // define anything named `a`:
+ //
+ // ```dart
+ // import 'dart:core' as p;
+ //
+ // void f() {
+ // p.[!a!];
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the library in which the name is declared isn't imported yet, add an
+ // import for the library.
+ //
+ // If the name is wrong, then change it to one of the names that's declared in
+ // the imported libraries.
+ static const CompileTimeErrorCode UNDEFINED_PREFIXED_NAME =
+ CompileTimeErrorCode(
+ 'UNDEFINED_PREFIXED_NAME',
+ "The name '{0}' is being referenced through the prefix '{1}', but it "
+ "isn't defined in any of the libraries imported using that "
+ "prefix.",
+ correction: "Try correcting the prefix or "
+ "importing the library that defines '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * Parameters:
+ * 0: the name of the setter
+ * 1: the name of the enclosing type where the setter is being looked for
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when it encounters an identifier that
+ // appears to be the name of a setter but either isn't defined or isn't
+ // visible in the scope in which the identifier is being referenced.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because there isn't a setter
+ // named `z`:
+ //
+ // ```dart
+ // class C {
+ // int x = 0;
+ // void m(int y) {
+ // this.[!z!] = y;
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the identifier isn't defined, then either define it or replace it with
+ // the name of a setter that is defined. The example above can be corrected by
+ // fixing the spelling of the setter:
+ //
+ // ```dart
+ // class C {
+ // int x = 0;
+ // void m(int y) {
+ // this.x = y;
+ // }
+ // }
+ // ```
+ static const CompileTimeErrorCode UNDEFINED_SETTER = CompileTimeErrorCode(
+ 'UNDEFINED_SETTER', "The setter '{0}' isn't defined for the type '{1}'.",
+ correction: "Try importing the library that defines '{0}', "
+ "correcting the name to the name of an existing setter, or "
+ "defining a setter or field named '{0}'.",
+ hasPublishedDocs: true);
+
+ /**
+ * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
+ * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
+ *
+ * Parameters:
+ * 0: the name of the getter
+ * 1: the name of the enclosing type where the getter is being looked for
+ */
+ static const CompileTimeErrorCode UNDEFINED_SUPER_GETTER =
+ CompileTimeErrorCode('UNDEFINED_SUPER_GETTER',
+ "The getter '{0}' isn't defined in a superclass of '{1}'.",
+ correction:
+ "Try correcting the name to the name of an existing getter, or "
+ "defining a getter or field named '{0}' in a superclass.");
+
+ /**
+ * Parameters:
+ * 0: the name of the method that is undefined
+ * 1: the resolved type name that the method lookup is happening on
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when an inherited method is
+ // referenced using `super`, but there’s no method with that name in the
+ // superclass chain.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `Object` doesn't define
+ // a member named `n`:
+ //
+ // ```dart
+ // class C {
+ // void m() {
+ // super.[!n!]();
+ // }
+ // }
+ // ```
+ //
+ // #### Common fixes
+ //
+ // If the inherited method you intend to invoke has a different name, then
+ // make the name of the invoked method match the inherited method.
+ //
+ // If the method you intend to invoke is defined in the same class, then
+ // remove the `super.`.
+ //
+ // If not, then either add the method to one of the superclasses or remove the
+ // invocation.
+ static const CompileTimeErrorCode UNDEFINED_SUPER_METHOD =
+ CompileTimeErrorCode('UNDEFINED_SUPER_METHOD',
+ "The method '{0}' isn't defined in a superclass of '{1}'.",
+ correction:
+ "Try correcting the name to the name of an existing method, or "
+ "defining a method named '{0}' in a superclass.",
+ hasPublishedDocs: true);
+
+ /**
+ * 12.18 Assignment: Evaluation of an assignment of the form
+ * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
+ * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
+ * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
+ * <i>e<sub>2</sub></i>).
+ *
+ * 12.29 Assignable Expressions: An assignable expression of the form
+ * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
+ * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
+ * <i>e<sub>2</sub></i>.
+ *
+ * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
+ * It is a static type warning if <i>T</i> does not have an accessible
+ * instance member named <i>m</i>.
+ *
+ * Parameters:
+ * 0: the name of the operator
+ * 1: the name of the enclosing type where the operator is being looked for
+ */
+ static const CompileTimeErrorCode UNDEFINED_SUPER_OPERATOR =
+ CompileTimeErrorCode('UNDEFINED_SUPER_OPERATOR',
+ "The operator '{0}' isn't defined in a superclass of '{1}'.",
+ correction: "Try defining the operator '{0}' in a superclass.");
+
+ /**
+ * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
+ * It is a static type warning if <i>T</i> does not have an accessible
+ * instance setter named <i>v=</i>.
+ *
+ * Parameters:
+ * 0: the name of the setter
+ * 1: the name of the enclosing type where the setter is being looked for
+ */
+ static const CompileTimeErrorCode UNDEFINED_SUPER_SETTER =
+ CompileTimeErrorCode('UNDEFINED_SUPER_SETTER',
+ "The setter '{0}' isn't defined in a superclass of '{1}'.",
+ correction:
+ "Try correcting the name to the name of an existing setter, or "
+ "defining a setter or field named '{0}' in a superclass.");
+
+ /**
+ * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
+ * not have an accessible (3.2) instance member named <i>m</i>.
+ *
+ * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
+ * when we are able to find the name defined in a supertype. It exists to
+ * provide a more informative error message.
+ *
+ * Parameters:
+ * 0: the name of the defining type
+ */
+ static const CompileTimeErrorCode
+ UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = CompileTimeErrorCode(
+ 'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
+ "Static members from supertypes must be qualified by the name of the "
+ "defining type.",
+ correction: "Try adding '{0}.' before the name.");
+
+ /**
+ * Parameters:
* 0: the name of the defining type
*/
// #### Description
@@ -9069,6 +10131,92 @@
hasPublishedDocs: true);
/**
+ * Parameters:
+ * 0: the name of the type being referenced (<i>G</i>)
+ * 1: the number of type parameters that were declared
+ * 2: the number of type arguments provided
+ */
+ // #### Description
+ //
+ // The analyzer produces this diagnostic when a type that has type parameters
+ // is used and type arguments are provided, but the number of type arguments
+ // isn't the same as the number of type parameters.
+ //
+ // The analyzer also produces this diagnostic when a constructor is invoked
+ // and the number of type arguments doesn't match the number of type
+ // parameters declared for the class.
+ //
+ // #### Examples
+ //
+ // The following code produces this diagnostic because `C` has one type
+ // parameter but two type arguments are provided when it is used as a type
+ // annotation:
+ //
+ // ```dart
+ // class C<E> {}
+ //
+ // void f([!C<int, int>!] x) {}
+ // ```
+ //
+ // The following code produces this diagnostic because `C` declares one type
+ // parameter, but two type arguments are provided when creating an instance:
+ //
+ // ```dart
+ // class C<E> {}
+ //
+ // var c = [!C<int, int>!]();
+ // ```
+ //
+ // #### Common fixes
+ //
+ // Add or remove type arguments, as necessary, to match the number of type
+ // parameters defined for the type:
+ //
+ // ```dart
+ // class C<E> {}
+ //
+ // void f(C<int> x) {}
+ // ```
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
+ CompileTimeErrorCode(
+ 'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
+ "The type '{0}' is declared with {1} type parameters, "
+ "but {2} type arguments were given.",
+ correction:
+ "Try adjusting the number of type arguments to match the number "
+ "of type parameters.",
+ hasPublishedDocs: true);
+
+ /**
+ * It will be a static type warning if <i>m</i> is not a generic method with
+ * exactly <i>n</i> type parameters.
+ *
+ * Parameters:
+ * 0: the name of the class being instantiated
+ * 1: the name of the constructor being invoked
+ */
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR =
+ CompileTimeErrorCode('WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR',
+ "The constructor '{0}.{1}' doesn't have type parameters.",
+ correction: "Try moving type arguments to after the type name.");
+
+ /**
+ * It will be a static type warning if <i>m</i> is not a generic method with
+ * exactly <i>n</i> type parameters.
+ *
+ * Parameters:
+ * 0: the name of the method being referenced (<i>G</i>)
+ * 1: the number of type parameters that were declared
+ * 2: the number of type arguments provided
+ */
+ static const CompileTimeErrorCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
+ CompileTimeErrorCode(
+ 'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
+ "The method '{0}' is declared with {1} type parameters, "
+ "but {2} type arguments were given.",
+ correction: "Try adjusting the number of type arguments.");
+
+ /**
* Let `C` be a generic class that declares a formal type parameter `X`, and
* assume that `T` is a direct superinterface of `C`. It is a compile-time
* error if `X` occurs contravariantly or invariantly in `T`.
@@ -9134,6 +10282,30 @@
"Try adding 'async*' or 'sync*' to the enclosing function.");
/**
+ * 17.16.1 Yield: Let T be the static type of e [the expression to the right
+ * of "yield"] and let f be the immediately enclosing function. It is a
+ * static type warning if either:
+ *
+ * - the body of f is marked async* and the type Stream<T> may not be
+ * assigned to the declared return type of f.
+ *
+ * - the body of f is marked sync* and the type Iterable<T> may not be
+ * assigned to the declared return type of f.
+ *
+ * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
+ * right of "yield*"] and let f be the immediately enclosing function. It is
+ * a static type warning if T may not be assigned to the declared return type
+ * of f. If f is synchronous it is a static type warning if T may not be
+ * assigned to Iterable. If f is asynchronous it is a static type warning if
+ * T may not be assigned to Stream.
+ */
+ static const CompileTimeErrorCode YIELD_OF_INVALID_TYPE =
+ CompileTimeErrorCode(
+ 'YIELD_OF_INVALID_TYPE',
+ "The type '{0}' implied by the 'yield' expression must be assignable "
+ "to '{1}'.");
+
+ /**
* Initialize a newly created error code to have the given [name]. The message
* associated with the error will be created from the given [message]
* template. The correction associated with the error will be created from the
@@ -9171,1178 +10343,6 @@
}
/**
- * The error codes used for static type warnings. The convention for this class
- * is for the name of the error code to indicate the problem that caused the
- * error to be generated and for the error message to explain what is wrong and,
- * when appropriate, how the problem can be corrected.
- */
-class StaticTypeWarningCode extends AnalyzerErrorCode {
- /**
- * 12.7 Lists: A fresh instance (7.6.1) <i>a</i>, of size <i>n</i>, whose
- * class implements the built-in class <i>List<E></i> is allocated.
- *
- * Parameters:
- * 0: the number of provided type arguments
- */
- static const StaticTypeWarningCode EXPECTED_ONE_LIST_TYPE_ARGUMENTS =
- StaticTypeWarningCode(
- 'EXPECTED_ONE_LIST_TYPE_ARGUMENTS',
- "List literals require exactly one type argument or none, "
- "but {0} found.",
- correction: "Try adjusting the number of type arguments.");
-
- /**
- * Parameters:
- * 0: the number of provided type arguments
- */
- static const StaticTypeWarningCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
- StaticTypeWarningCode(
- 'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
- "Set literals require exactly one type argument or none, "
- "but {0} found.",
- correction: "Try adjusting the number of type arguments.");
-
- /**
- * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
- * implements the built-in class <i>Map<K, V></i> is allocated.
- *
- * Parameters:
- * 0: the number of provided type arguments
- */
- static const StaticTypeWarningCode EXPECTED_TWO_MAP_TYPE_ARGUMENTS =
- StaticTypeWarningCode(
- 'EXPECTED_TWO_MAP_TYPE_ARGUMENTS',
- "Map literals require exactly two type arguments or none, "
- "but {0} found.",
- correction: "Try adjusting the number of type arguments.");
-
- /**
- * 17.6.2 For-in. It the iterable expression does not implement Iterable with
- * a type argument that can be assigned to the for-in variable's type, this
- * warning is reported.
- *
- * Parameters:
- * 0: The type of the iterable expression.
- * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
- * 2: The loop variable type.
- */
- static const StaticTypeWarningCode FOR_IN_OF_INVALID_ELEMENT_TYPE =
- StaticTypeWarningCode(
- 'FOR_IN_OF_INVALID_ELEMENT_TYPE',
- "The type '{0}' used in the 'for' loop must implement {1} with a "
- "type argument that can be assigned to '{2}'.");
-
- /**
- * Parameters:
- * 0: The type of the iterable expression.
- * 1: The sequence type -- Iterable for `for` or Stream for `await for`.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the expression following `in` in
- // a for-in loop has a type that isn't a subclass of `Iterable`.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `m` is a `Map`, and
- // `Map` isn't a subclass of `Iterable`:
- //
- // ```dart
- // void f(Map<String, String> m) {
- // for (String s in [!m!]) {
- // print(s);
- // }
- // }
- // ```
- //
- // #### Common fixes
- //
- // Replace the expression with one that produces an iterable value:
- //
- // ```dart
- // void f(Map<String, String> m) {
- // for (String s in m.values) {
- // print(s);
- // }
- // }
- // ```
- static const StaticTypeWarningCode FOR_IN_OF_INVALID_TYPE =
- StaticTypeWarningCode('FOR_IN_OF_INVALID_TYPE',
- "The type '{0}' used in the 'for' loop must implement {1}.",
- hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the body of a function has the
- // `async` modifier even though the return type of the function isn't
- // assignable to `Future`.
- //
- // #### Example
- //
- // The following code produces this diagnostic because the body of the
- // function `f` has the `async` modifier even though the return type isn't
- // assignable to `Future`:
- //
- // ```dart
- // [!int!] f() async {
- // return 0;
- // }
- // ```
- //
- // #### Common fixes
- //
- // If the function should be asynchronous, then change the return type to be
- // assignable to `Future`:
- //
- // ```dart
- // Future<int> f() async {
- // return 0;
- // }
- // ```
- //
- // If the function should be synchronous, then remove the `async` modifier:
- //
- // ```dart
- // int f() {
- // return 0;
- // }
- // ```
- static const StaticTypeWarningCode ILLEGAL_ASYNC_RETURN_TYPE =
- StaticTypeWarningCode(
- 'ILLEGAL_ASYNC_RETURN_TYPE',
- "Functions marked 'async' must have a return type assignable to "
- "'Future'.",
- correction: "Try fixing the return type of the function, or "
- "removing the modifier 'async' from the function body.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the static member
- * 1: the kind of the static member (field, getter, setter, or method)
- * 2: the name of the defining class
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when an access operator is used to
- // access a static member through an instance of the class.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `zero` is a static
- // field, but it’s being accessed as if it were an instance field:
- //
- // ```dart
- // void f(C c) {
- // c.[!zero!];
- // }
- //
- // class C {
- // static int zero = 0;
- // }
- // ```
- //
- // #### Common fixes
- //
- // Use the class to access the static member:
- //
- // ```dart
- // void f(C c) {
- // C.zero;
- // }
- //
- // class C {
- // static int zero = 0;
- // }
- // ```
- static const StaticTypeWarningCode INSTANCE_ACCESS_TO_STATIC_MEMBER =
- StaticTypeWarningCode('INSTANCE_ACCESS_TO_STATIC_MEMBER',
- "Static {1} '{0}' can't be accessed through an instance.",
- correction: "Try using the class '{2}' to access the {1}.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the right hand side type
- * 1: the name of the left hand side type
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the static type of an expression
- // that is assigned to a variable isn't assignable to the type of the
- // variable.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because the type of the
- // initializer (`int`) isn't assignable to the type of the variable
- // (`String`):
- //
- // ```dart
- // int i = 0;
- // String s = [!i!];
- // ```
- //
- // #### Common fixes
- //
- // If the value being assigned is always assignable at runtime, even though
- // the static types don't reflect that, then add an explicit cast.
- //
- // Otherwise, change the value being assigned so that it has the expected
- // type. In the previous example, this might look like:
- //
- // ```dart
- // int i = 0;
- // String s = i.toString();
- // ```
- //
- // If you can’t change the value, then change the type of the variable to be
- // compatible with the type of the value being assigned:
- //
- // ```dart
- // int i = 0;
- // int s = i;
- // ```
- static const StaticTypeWarningCode INVALID_ASSIGNMENT = StaticTypeWarningCode(
- 'INVALID_ASSIGNMENT',
- "A value of type '{0}' can't be assigned to a variable of type "
- "'{1}'.",
- correction: "Try changing the type of the variable, or "
- "casting the right-hand type to '{1}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the identifier that is not a function type
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it finds a function invocation,
- // but the name of the function being invoked is defined to be something other
- // than a function.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `Binary` is the name of
- // a function type, not a function:
- //
- // ```dart
- // typedef Binary = int Function(int, int);
- //
- // int f() {
- // return [!Binary!](1, 2);
- // }
- // ```
- //
- // #### Common fixes
- //
- // Replace the name with the name of a function.
- static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION =
- StaticTypeWarningCode(
- 'INVOCATION_OF_NON_FUNCTION', "'{0}' isn't a function.",
- // TODO(brianwilkerson) Split this error code so that we can provide
- // better error and correction messages.
- correction:
- "Try correcting the name to match an existing function, or "
- "define a method or function named '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a function invocation is found,
- // but the name being referenced isn't the name of a function, or when the
- // expression computing the function doesn't compute a function.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `x` isn't a function:
- //
- // ```dart
- // int x = 0;
- //
- // int f() => x;
- //
- // var y = [!x!]();
- // ```
- //
- // The following code produces this diagnostic because `f()` doesn't return a
- // function:
- //
- // ```dart
- // int x = 0;
- //
- // int f() => x;
- //
- // var y = [!f()!]();
- // ```
- //
- // #### Common fixes
- //
- // If you need to invoke a function, then replace the code before the argument
- // list with the name of a function or with an expression that computes a
- // function:
- //
- // ```dart
- // int x = 0;
- //
- // int f() => x;
- //
- // var y = f();
- // ```
- static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
- StaticTypeWarningCode(
- 'INVOCATION_OF_NON_FUNCTION_EXPRESSION',
- "The expression doesn't evaluate to a function, so it can't be "
- "invoked.",
- hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a condition, such as an `if` or
- // `while` loop, doesn't have the static type `bool`.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `x` has the static type
- // `int`:
- //
- // ```dart
- // void f(int x) {
- // if ([!x!]) {
- // // ...
- // }
- // }
- // ```
- //
- // #### Common fixes
- //
- // Change the condition so that it produces a Boolean value:
- //
- // ```dart
- // void f(int x) {
- // if (x == 0) {
- // // ...
- // }
- // }
- // ```
- static const StaticTypeWarningCode NON_BOOL_CONDITION = StaticTypeWarningCode(
- 'NON_BOOL_CONDITION', "Conditions must have a static type of 'bool'.",
- correction: "Try changing the condition.", hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the first expression in an
- // assert has a type other than `bool`.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because the type of `p` is
- // `int`, but a `bool` is required:
- //
- // ```dart
- // void f(int p) {
- // assert([!p!]);
- // }
- // ```
- //
- // #### Common fixes
- //
- // Change the expression so that it has the type `bool`:
- //
- // ```dart
- // void f(int p) {
- // assert(p > 0);
- // }
- // ```
- static const StaticTypeWarningCode NON_BOOL_EXPRESSION =
- StaticTypeWarningCode('NON_BOOL_EXPRESSION',
- "The expression in an assert must be of type 'bool'.",
- correction: "Try changing the expression.", hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the operand of the unary
- // negation operator (`!`) doesn't have the type `bool`.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `x` is an `int` when it
- // must be a `bool`:
- //
- // ```dart
- // int x = 0;
- // bool y = ![!x!];
- // ```
- //
- // #### Common fixes
- //
- // Replace the operand with an expression that has the type `bool`:
- //
- // ```dart
- // int x = 0;
- // bool y = !(x > 0);
- // ```
- static const StaticTypeWarningCode NON_BOOL_NEGATION_EXPRESSION =
- StaticTypeWarningCode('NON_BOOL_NEGATION_EXPRESSION',
- "A negation operand must have a static type of 'bool'.",
- correction: "Try changing the operand to the '!' operator.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the lexeme of the logical operator
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when one of the operands of either
- // the `&&` or `||` operator doesn't have the type `bool`.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `a` isn't a Boolean
- // value:
- //
- // ```dart
- // int a = 3;
- // bool b = [!a!] || a > 1;
- // ```
- //
- // #### Common fixes
- //
- // Change the operand to a Boolean value:
- //
- // ```dart
- // int a = 3;
- // bool b = a == 0 || a > 1;
- // ```
- static const StaticTypeWarningCode NON_BOOL_OPERAND = StaticTypeWarningCode(
- 'NON_BOOL_OPERAND',
- "The operands of the operator '{0}' must be assignable to 'bool'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name appearing where a type is expected
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when an identifier that isn't a type
- // is used as a type argument.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `x` is a variable, not
- // a type:
- //
- // ```dart
- // var x = 0;
- // List<[!x!]> xList = [];
- // ```
- //
- // #### Common fixes
- //
- // Change the type argument to be a type:
- //
- // ```dart
- // var x = 0;
- // List<int> xList = [];
- // ```
- static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT =
- StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT',
- "The name '{0}' isn't a type so it can't be used as a type argument.",
- correction: "Try correcting the name to an existing type, or "
- "defining a type named '{0}'.",
- hasPublishedDocs: true,
- isUnresolvedIdentifier: true);
-
- /**
- * Parameters:
- * 0: the return type as declared in the return statement
- * 1: the expected return type as defined by the method
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when the static type of a returned
- // expression isn't assignable to the return type that the closure is required
- // to have.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `f` is defined to be a
- // function that returns a `String`, but the closure assigned to it returns an
- // `int`:
- //
- // ```dart
- // String Function(String) f = (s) => [!3!];
- // ```
- //
- // #### Common fixes
- //
- // If the return type is correct, then replace the returned value with a value
- // of the correct type, possibly by converting the existing value:
- //
- // ```dart
- // String Function(String) f = (s) => 3.toString();
- // ```
- static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
- StaticTypeWarningCode(
- 'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
- "The return type '{0}' isn't a '{1}', as required by the closure's "
- "context.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the return type as declared in the return statement
- * 1: the expected return type as defined by the enclosing class
- * 2: the name of the constructor
- */
- static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
- StaticTypeWarningCodeWithUniqueName(
- 'RETURN_OF_INVALID_TYPE',
- 'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
- "A value of type '{0}' can't be returned from constructor '{2}' "
- "because it has a return type of '{1}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the return type as declared in the return statement
- * 1: the expected return type as defined by the method
- * 2: the name of the method
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a method or function returns a
- // value whose type isn't assignable to the declared return type.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `f` has a return type
- // of `String` but is returning an `int`:
- //
- // ```dart
- // String f() => [!3!];
- // ```
- //
- // #### Common fixes
- //
- // If the return type is correct, then replace the value being returned with a
- // value of the correct type, possibly by converting the existing value:
- //
- // ```dart
- // String f() => 3.toString();
- // ```
- //
- // If the value is correct, then change the return type to match:
- //
- // ```dart
- // int f() => 3;
- // ```
- static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
- StaticTypeWarningCodeWithUniqueName(
- 'RETURN_OF_INVALID_TYPE',
- 'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
- "A value of type '{0}' can't be returned from function '{2}' because "
- "it has a return type of '{1}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the return type as declared in the return statement
- * 1: the expected return type as defined by the method
- * 2: the name of the method
- */
- static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
- StaticTypeWarningCodeWithUniqueName(
- 'RETURN_OF_INVALID_TYPE',
- 'StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
- "A value of type '{0}' can't be returned from method '{2}' because "
- "it has a return type of '{1}'.",
- hasPublishedDocs: true);
-
- /**
- * 10 Generics: It is a static type warning if a type parameter is a supertype
- * of its upper bound.
- *
- * Parameters:
- * 0: the name of the type parameter
- * 1: the name of the bounding type
- *
- * See [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
- */
- static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND =
- StaticTypeWarningCode('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND',
- "'{0}' can't be a supertype of its upper bound.",
- correction: "Try using a type that is or is a subclass of '{1}'.");
-
- /**
- * Parameters:
- * 0: the name of the enumeration constant that is not defined
- * 1: the name of the enumeration used to access the constant
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it encounters an identifier that
- // appears to be the name of an enum constant, and the name either isn't
- // defined or isn't visible in the scope in which it's being referenced.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `E` doesn't define a
- // constant named `c`:
- //
- // ```dart
- // enum E {a, b}
- //
- // var e = E.[!c!];
- // ```
- //
- // #### Common fixes
- //
- // If the constant should be defined, then add it to the declaration of the
- // enum:
- //
- // ```dart
- // enum E {a, b, c}
- //
- // var e = E.c;
- // ```
- //
- // If the constant shouldn't be defined, then change the name to the name of
- // an existing constant:
- //
- // ```dart
- // enum E {a, b}
- //
- // var e = E.b;
- // ```
- static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT =
- StaticTypeWarningCode('UNDEFINED_ENUM_CONSTANT',
- "There's no constant named '{0}' in '{1}'.",
- correction:
- "Try correcting the name to the name of an existing constant, or "
- "defining a constant named '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the method that is undefined
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it encounters an identifier that
- // appears to be the name of a function but either isn't defined or isn't
- // visible in the scope in which it's being referenced.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because the name `emty` isn't
- // defined:
- //
- // ```dart
- // List<int> empty() => [];
- //
- // void main() {
- // print([!emty!]());
- // }
- // ```
- //
- // #### Common fixes
- //
- // If the identifier isn't defined, then either define it or replace it with
- // the name of a function that is defined. The example above can be corrected
- // by fixing the spelling of the function:
- //
- // ```dart
- // List<int> empty() => [];
- //
- // void main() {
- // print(empty());
- // }
- // ```
- //
- // If the function is defined but isn't visible, then you probably need to add
- // an import or re-arrange your code to make the function visible.
- static const StaticTypeWarningCode UNDEFINED_FUNCTION = StaticTypeWarningCode(
- 'UNDEFINED_FUNCTION', "The function '{0}' isn't defined.",
- correction: "Try importing the library that defines '{0}', "
- "correcting the name to the name of an existing function, or "
- "defining a function named '{0}'.",
- hasPublishedDocs: true,
- isUnresolvedIdentifier: true);
-
- /**
- * Parameters:
- * 0: the name of the getter
- * 1: the name of the enclosing type where the getter is being looked for
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it encounters an identifier that
- // appears to be the name of a getter but either isn't defined or isn't
- // visible in the scope in which it's being referenced.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `String` has no member
- // named `len`:
- //
- // ```dart
- // int f(String s) => s.[!len!];
- // ```
- //
- // #### Common fixes
- //
- // If the identifier isn't defined, then either define it or replace it with
- // the name of a getter that is defined. The example above can be corrected by
- // fixing the spelling of the getter:
- //
- // ```dart
- // int f(String s) => s.length;
- // ```
- static const StaticTypeWarningCode UNDEFINED_GETTER = StaticTypeWarningCode(
- 'UNDEFINED_GETTER', "The getter '{0}' isn't defined for the type '{1}'.",
- correction: "Try importing the library that defines '{0}', "
- "correcting the name to the name of an existing getter, or "
- "defining a getter or field named '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the method that is undefined
- * 1: the resolved type name that the method lookup is happening on
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it encounters an identifier that
- // appears to be the name of a method but either isn't defined or isn't
- // visible in the scope in which it's being referenced.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because the identifier
- // `removeMiddle` isn't defined:
- //
- // ```dart
- // int f(List<int> l) => l.[!removeMiddle!]();
- // ```
- //
- // #### Common fixes
- //
- // If the identifier isn't defined, then either define it or replace it with
- // the name of a method that is defined. The example above can be corrected by
- // fixing the spelling of the method:
- //
- // ```dart
- // int f(List<int> l) => l.removeLast();
- // ```
- static const StaticTypeWarningCode UNDEFINED_METHOD = StaticTypeWarningCode(
- 'UNDEFINED_METHOD', "The method '{0}' isn't defined for the type '{1}'.",
- correction:
- "Try correcting the name to the name of an existing method, or "
- "defining a method named '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the operator
- * 1: the name of the enclosing type where the operator is being looked for
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a user-definable operator is
- // invoked on an object for which the operator isn't defined.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because the class `C` doesn't
- // define the operator `+`:
- //
- // ```dart
- // class C {}
- //
- // C f(C c) => c [!+!] 2;
- // ```
- //
- // #### Common fixes
- //
- // If the operator should be defined for the class, then define it:
- //
- // ```dart
- // class C {
- // C operator +(int i) => this;
- // }
- //
- // C f(C c) => c + 2;
- // ```
- static const StaticTypeWarningCode UNDEFINED_OPERATOR = StaticTypeWarningCode(
- 'UNDEFINED_OPERATOR',
- "The operator '{0}' isn't defined for the type '{1}'.",
- correction: "Try defining the operator '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * No parameters.
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a prefixed identifier is found
- // where the prefix is valid, but the identifier isn't declared in any of the
- // libraries imported using that prefix.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `dart:core` doesn't
- // define anything named `a`:
- //
- // ```dart
- // import 'dart:core' as p;
- //
- // void f() {
- // p.[!a!];
- // }
- // ```
- //
- // #### Common fixes
- //
- // If the library in which the name is declared isn't imported yet, add an
- // import for the library.
- //
- // If the name is wrong, then change it to one of the names that's declared in
- // the imported libraries.
- static const StaticTypeWarningCode UNDEFINED_PREFIXED_NAME =
- StaticTypeWarningCode(
- 'UNDEFINED_PREFIXED_NAME',
- "The name '{0}' is being referenced through the prefix '{1}', but it "
- "isn't defined in any of the libraries imported using that "
- "prefix.",
- correction: "Try correcting the prefix or "
- "importing the library that defines '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * Parameters:
- * 0: the name of the setter
- * 1: the name of the enclosing type where the setter is being looked for
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when it encounters an identifier that
- // appears to be the name of a setter but either isn't defined or isn't
- // visible in the scope in which the identifier is being referenced.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because there isn't a setter
- // named `z`:
- //
- // ```dart
- // class C {
- // int x = 0;
- // void m(int y) {
- // this.[!z!] = y;
- // }
- // }
- // ```
- //
- // #### Common fixes
- //
- // If the identifier isn't defined, then either define it or replace it with
- // the name of a setter that is defined. The example above can be corrected by
- // fixing the spelling of the setter:
- //
- // ```dart
- // class C {
- // int x = 0;
- // void m(int y) {
- // this.x = y;
- // }
- // }
- // ```
- static const StaticTypeWarningCode UNDEFINED_SETTER = StaticTypeWarningCode(
- 'UNDEFINED_SETTER', "The setter '{0}' isn't defined for the type '{1}'.",
- correction: "Try importing the library that defines '{0}', "
- "correcting the name to the name of an existing setter, or "
- "defining a setter or field named '{0}'.",
- hasPublishedDocs: true);
-
- /**
- * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
- * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
- *
- * Parameters:
- * 0: the name of the getter
- * 1: the name of the enclosing type where the getter is being looked for
- */
- static const StaticTypeWarningCode UNDEFINED_SUPER_GETTER =
- StaticTypeWarningCode('UNDEFINED_SUPER_GETTER',
- "The getter '{0}' isn't defined in a superclass of '{1}'.",
- correction:
- "Try correcting the name to the name of an existing getter, or "
- "defining a getter or field named '{0}' in a superclass.");
-
- /**
- * Parameters:
- * 0: the name of the method that is undefined
- * 1: the resolved type name that the method lookup is happening on
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when an inherited method is
- // referenced using `super`, but there’s no method with that name in the
- // superclass chain.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `Object` doesn't define
- // a member named `n`:
- //
- // ```dart
- // class C {
- // void m() {
- // super.[!n!]();
- // }
- // }
- // ```
- //
- // #### Common fixes
- //
- // If the inherited method you intend to invoke has a different name, then
- // make the name of the invoked method match the inherited method.
- //
- // If the method you intend to invoke is defined in the same class, then
- // remove the `super.`.
- //
- // If not, then either add the method to one of the superclasses or remove the
- // invocation.
- static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD =
- StaticTypeWarningCode('UNDEFINED_SUPER_METHOD',
- "The method '{0}' isn't defined in a superclass of '{1}'.",
- correction:
- "Try correcting the name to the name of an existing method, or "
- "defining a method named '{0}' in a superclass.",
- hasPublishedDocs: true);
-
- /**
- * 12.18 Assignment: Evaluation of an assignment of the form
- * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
- * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
- * return e;} (<i>e<sub>1</sub></i>, <i>e<sub>2</sub></i>,
- * <i>e<sub>2</sub></i>).
- *
- * 12.29 Assignable Expressions: An assignable expression of the form
- * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] is evaluated as a method
- * invocation of the operator method [] on <i>e<sub>1</sub></i> with argument
- * <i>e<sub>2</sub></i>.
- *
- * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
- * It is a static type warning if <i>T</i> does not have an accessible
- * instance member named <i>m</i>.
- *
- * Parameters:
- * 0: the name of the operator
- * 1: the name of the enclosing type where the operator is being looked for
- */
- static const StaticTypeWarningCode UNDEFINED_SUPER_OPERATOR =
- StaticTypeWarningCode('UNDEFINED_SUPER_OPERATOR',
- "The operator '{0}' isn't defined in a superclass of '{1}'.",
- correction: "Try defining the operator '{0}' in a superclass.");
-
- /**
- * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
- * It is a static type warning if <i>T</i> does not have an accessible
- * instance setter named <i>v=</i>.
- *
- * Parameters:
- * 0: the name of the setter
- * 1: the name of the enclosing type where the setter is being looked for
- */
- static const StaticTypeWarningCode UNDEFINED_SUPER_SETTER =
- StaticTypeWarningCode('UNDEFINED_SUPER_SETTER',
- "The setter '{0}' isn't defined in a superclass of '{1}'.",
- correction:
- "Try correcting the name to the name of an existing setter, or "
- "defining a setter or field named '{0}' in a superclass.");
-
- /**
- * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does
- * not have an accessible (3.2) instance member named <i>m</i>.
- *
- * This is a specialization of [INSTANCE_ACCESS_TO_STATIC_MEMBER] that is used
- * when we are able to find the name defined in a supertype. It exists to
- * provide a more informative error message.
- *
- * Parameters:
- * 0: the name of the defining type
- */
- static const StaticTypeWarningCode
- UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = StaticTypeWarningCode(
- 'UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER',
- "Static members from supertypes must be qualified by the name of the "
- "defining type.",
- correction: "Try adding '{0}.' before the name.");
-
- /**
- * Parameters:
- * 0: the name of the type being referenced (<i>G</i>)
- * 1: the number of type parameters that were declared
- * 2: the number of type arguments provided
- */
- // #### Description
- //
- // The analyzer produces this diagnostic when a type that has type parameters
- // is used and type arguments are provided, but the number of type arguments
- // isn't the same as the number of type parameters.
- //
- // The analyzer also produces this diagnostic when a constructor is invoked
- // and the number of type arguments doesn't match the number of type
- // parameters declared for the class.
- //
- // #### Examples
- //
- // The following code produces this diagnostic because `C` has one type
- // parameter but two type arguments are provided when it is used as a type
- // annotation:
- //
- // ```dart
- // class C<E> {}
- //
- // void f([!C<int, int>!] x) {}
- // ```
- //
- // The following code produces this diagnostic because `C` declares one type
- // parameter, but two type arguments are provided when creating an instance:
- //
- // ```dart
- // class C<E> {}
- //
- // var c = [!C<int, int>!]();
- // ```
- //
- // #### Common fixes
- //
- // Add or remove type arguments, as necessary, to match the number of type
- // parameters defined for the type:
- //
- // ```dart
- // class C<E> {}
- //
- // void f(C<int> x) {}
- // ```
- static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS =
- StaticTypeWarningCode(
- 'WRONG_NUMBER_OF_TYPE_ARGUMENTS',
- "The type '{0}' is declared with {1} type parameters, "
- "but {2} type arguments were given.",
- correction:
- "Try adjusting the number of type arguments to match the number "
- "of type parameters.",
- hasPublishedDocs: true);
-
- /**
- * It will be a static type warning if <i>m</i> is not a generic method with
- * exactly <i>n</i> type parameters.
- *
- * Parameters:
- * 0: the name of the class being instantiated
- * 1: the name of the constructor being invoked
- */
- static const StaticTypeWarningCode
- WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR = StaticTypeWarningCode(
- 'WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR',
- "The constructor '{0}.{1}' doesn't have type parameters.",
- correction: "Try moving type arguments to after the type name.");
-
- /**
- * It will be a static type warning if <i>m</i> is not a generic method with
- * exactly <i>n</i> type parameters.
- *
- * Parameters:
- * 0: the name of the method being referenced (<i>G</i>)
- * 1: the number of type parameters that were declared
- * 2: the number of type arguments provided
- */
- static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD =
- StaticTypeWarningCode(
- 'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
- "The method '{0}' is declared with {1} type parameters, "
- "but {2} type arguments were given.",
- correction: "Try adjusting the number of type arguments.");
-
- /**
- * 17.16.1 Yield: Let T be the static type of e [the expression to the right
- * of "yield"] and let f be the immediately enclosing function. It is a
- * static type warning if either:
- *
- * - the body of f is marked async* and the type Stream<T> may not be
- * assigned to the declared return type of f.
- *
- * - the body of f is marked sync* and the type Iterable<T> may not be
- * assigned to the declared return type of f.
- *
- * 17.16.2 Yield-Each: Let T be the static type of e [the expression to the
- * right of "yield*"] and let f be the immediately enclosing function. It is
- * a static type warning if T may not be assigned to the declared return type
- * of f. If f is synchronous it is a static type warning if T may not be
- * assigned to Iterable. If f is asynchronous it is a static type warning if
- * T may not be assigned to Stream.
- */
- static const StaticTypeWarningCode YIELD_OF_INVALID_TYPE =
- StaticTypeWarningCode(
- 'YIELD_OF_INVALID_TYPE',
- "The type '{0}' implied by the 'yield' expression must be assignable "
- "to '{1}'.");
-
- /**
- * Initialize a newly created error code to have the given [name]. The message
- * associated with the error will be created from the given [message]
- * template. The correction associated with the error will be created from the
- * given [correction] template.
- */
- const StaticTypeWarningCode(String name, String message,
- {String correction,
- bool hasPublishedDocs,
- bool isUnresolvedIdentifier = false})
- : super.temporary(name, message,
- correction: correction,
- hasPublishedDocs: hasPublishedDocs,
- isUnresolvedIdentifier: isUnresolvedIdentifier);
-
- @override
- ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
-
- @override
- ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
-}
-
-class StaticTypeWarningCodeWithUniqueName extends StaticTypeWarningCode {
- @override
- final String uniqueName;
-
- const StaticTypeWarningCodeWithUniqueName(
- String name, this.uniqueName, String message,
- {String correction, bool hasPublishedDocs})
- : super(name, message,
- correction: correction, hasPublishedDocs: hasPublishedDocs);
-}
-
-/**
* The error codes used for static warnings. The convention for this class is
* for the name of the error code to indicate the problem that caused the error
* to be generated and for the error message to explain what is wrong and, when
@@ -10485,7 +10485,7 @@
'INVALID_NULL_AWARE_OPERATOR',
"The target expression can't be null, so the null-aware operator "
"'{0}' can't be used.",
- correction: "Try replace the operator '{0}' with '{1}'.",
+ correction: "Try replacing the operator '{0}' with '{1}'.",
hasPublishedDocs: true);
/**
@@ -10500,7 +10500,7 @@
'INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT',
"The target expression can't be null because of short-circuiting, so "
"the null-aware operator '{0}' can't be used.",
- correction: "Try replace the operator '{0}' with '{1}'.",
+ correction: "Try replacing the operator '{0}' with '{1}'.",
hasPublishedDocs: true);
/**
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index 5e0ee73..9d78748 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -119,7 +119,7 @@
} else {
checkElement(
_typeProvider.futureElement,
- StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
+ CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE,
);
}
} else if (enclosingExecutable.isGenerator) {
@@ -157,25 +157,25 @@
void reportTypeError() {
if (enclosingExecutable.isClosure) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
expression,
[S, T],
);
} else if (enclosingExecutable.isConstructor) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
expression,
[S, T, enclosingExecutable.displayName],
);
} else if (enclosingExecutable.isFunction) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
expression,
[S, T, enclosingExecutable.displayName],
);
} else if (enclosingExecutable.isMethod) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
expression,
[S, T, enclosingExecutable.displayName],
);
@@ -258,25 +258,25 @@
void reportTypeError() {
if (enclosingExecutable.isClosure) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE,
expression,
[S, T],
);
} else if (enclosingExecutable.isConstructor) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR,
expression,
[S, T, enclosingExecutable.displayName],
);
} else if (enclosingExecutable.isFunction) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION,
expression,
[S, T, enclosingExecutable.displayName],
);
} else if (enclosingExecutable.isMethod) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD,
expression,
[S, T, enclosingExecutable.displayName],
);
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index ed3f577..ed0cec8 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -48,7 +48,7 @@
);
}
_checkTypeArgumentCount(typeArguments, 1,
- StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
+ CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
}
_checkForImplicitDynamicTypedLiteral(node);
}
@@ -63,7 +63,7 @@
);
}
_checkTypeArgumentCount(typeArguments, 2,
- StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
+ CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
}
_checkForImplicitDynamicTypedLiteral(node);
}
@@ -83,7 +83,7 @@
);
}
_checkTypeArgumentCount(typeArguments, 1,
- StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
+ CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
}
_checkForImplicitDynamicTypedLiteral(node);
}
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index 16646b8..2fd3549 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -130,7 +130,7 @@
var type1 = arguments['type'];
var type2 = arguments['type2'];
errorReporter?.reportErrorForOffset(
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
+ CompileTimeErrorCode.INVALID_ASSIGNMENT,
offset,
length,
[type1, type2]);
@@ -288,15 +288,15 @@
return;
case "UNDEFINED_GETTER":
errorReporter?.reportErrorForOffset(
- StaticTypeWarningCode.UNDEFINED_GETTER, offset, length);
+ CompileTimeErrorCode.UNDEFINED_GETTER, offset, length);
return;
case "UNDEFINED_METHOD":
errorReporter?.reportErrorForOffset(
- StaticTypeWarningCode.UNDEFINED_METHOD, offset, length);
+ CompileTimeErrorCode.UNDEFINED_METHOD, offset, length);
return;
case "UNDEFINED_SETTER":
errorReporter?.reportErrorForOffset(
- StaticTypeWarningCode.UNDEFINED_SETTER, offset, length);
+ CompileTimeErrorCode.UNDEFINED_SETTER, offset, length);
return;
case "UNEXPECTED_DOLLAR_IN_STRING":
errorReporter?.reportErrorForOffset(
@@ -322,7 +322,7 @@
return;
case "WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR":
errorReporter?.reportErrorMessage(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
offset,
length,
message);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 7b6a003..ac374e1 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -521,7 +521,7 @@
[identifier.name]);
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME,
+ CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME,
identifier,
[identifier.name, prefixElement.name]);
}
@@ -787,7 +787,10 @@
}
return;
} else {
- if (element.isFactory) {
+ if (element.isFactory &&
+ // Check if we've reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
+ !element.enclosingElement.constructors
+ .every((constructor) => constructor.isFactory)) {
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node, [element]);
}
@@ -851,7 +854,7 @@
}
/// Check that the given index [expression] was resolved, otherwise a
- /// [StaticTypeWarningCode.UNDEFINED_OPERATOR] is generated. The [target] is
+ /// [CompileTimeErrorCode.UNDEFINED_OPERATOR] is generated. The [target] is
/// the target of the expression. The [methodName] is the name of the operator
/// associated with the context of using of the given index expression.
void _checkForUndefinedIndexOperator(
@@ -886,7 +889,7 @@
);
} else if (target is SuperExpression) {
_errorReporter.reportErrorForOffset(
- StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR,
offset,
length,
[methodName, staticType],
@@ -904,7 +907,7 @@
);
} else {
_errorReporter.reportErrorForOffset(
- StaticTypeWarningCode.UNDEFINED_OPERATOR,
+ CompileTimeErrorCode.UNDEFINED_OPERATOR,
offset,
length,
[methodName, staticType],
@@ -1320,8 +1323,8 @@
_checkForStaticAccessToInstanceMember(propertyName, element);
} else {
var code = typeReference.isEnum
- ? StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT
- : StaticTypeWarningCode.UNDEFINED_GETTER;
+ ? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
+ : CompileTimeErrorCode.UNDEFINED_GETTER;
_errorReporter.reportErrorForNode(
code,
propertyName,
@@ -1356,7 +1359,7 @@
// The error will be reported in ErrorVerifier.
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_SETTER,
+ CompileTimeErrorCode.UNDEFINED_SETTER,
propertyName,
[propertyName.name, typeReference.name],
);
@@ -1392,7 +1395,7 @@
);
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
+ CompileTimeErrorCode.UNDEFINED_SUPER_GETTER,
propertyName,
[propertyName.name, staticType],
);
@@ -1433,7 +1436,7 @@
}
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_SUPER_SETTER,
+ CompileTimeErrorCode.UNDEFINED_SUPER_SETTER,
propertyName,
[propertyName.name, staticType],
);
@@ -1494,7 +1497,7 @@
}
if (shouldReportUndefinedGetter) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_GETTER,
+ CompileTimeErrorCode.UNDEFINED_GETTER,
propertyName,
[propertyName.name, staticType],
);
@@ -1517,7 +1520,7 @@
// OK
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.UNDEFINED_SETTER,
+ CompileTimeErrorCode.UNDEFINED_SETTER,
propertyName,
[propertyName.name, staticType],
);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 5821ce0..a195ba9 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -401,7 +401,6 @@
_duplicateDefinitionVerifier.checkClass(node);
_checkForBuiltInIdentifierAsName(
node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME);
- _checkForNoDefaultSuperConstructorImplicit(node);
_checkForConflictingClassTypeVariableErrorCodes();
TypeName superclass = node.extendsClause?.superclass;
ImplementsClause implementsClause = node.implementsClause;
@@ -711,7 +710,7 @@
node.staticElement == null &&
!_isFunctionType(expressionType)) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
functionExpression);
} else if (expressionType is FunctionType) {
_typeArgumentsVerifier.checkFunctionExpressionInvocation(node);
@@ -1250,7 +1249,8 @@
// class.
if (!_checkForExtendsDisallowedClass(superclass) &&
!_checkForImplementsClauseErrorCodes(implementsClause) &&
- !_checkForAllMixinErrorCodes(withClause)) {
+ !_checkForAllMixinErrorCodes(withClause) &&
+ !_checkForNoGenerativeConstructorsInSuperclass(superclass)) {
_checkForImplicitDynamicType(superclass);
_checkForExtendsDeferredClass(superclass);
_checkForRepeatedType(implementsClause?.interfaces,
@@ -1260,6 +1260,9 @@
_checkMixinInference(node, withClause);
_checkForMixinWithConflictingPrivateMember(withClause, superclass);
_checkForConflictingGenerics(node);
+ if (node is ClassDeclaration) {
+ _checkForNoDefaultSuperConstructorImplicit(node);
+ }
}
}
@@ -1537,8 +1540,21 @@
DartType expectedStaticType,
ErrorCode errorCode) {
if (!_typeSystem.isAssignableTo2(actualStaticType, expectedStaticType)) {
+ AstNode getErrorNode(AstNode node) {
+ if (node is CascadeExpression) {
+ return getErrorNode(node.target);
+ }
+ if (node is ParenthesizedExpression) {
+ return getErrorNode(node.expression);
+ }
+ return node;
+ }
+
_errorReporter.reportErrorForNode(
- errorCode, expression, [actualStaticType, expectedStaticType]);
+ errorCode,
+ getErrorNode(expression),
+ [actualStaticType, expectedStaticType],
+ );
return false;
}
return true;
@@ -2241,7 +2257,7 @@
if (!_typeSystem.isAssignableTo2(iterableType, requiredSequenceType)) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
+ CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
node.iterable,
[iterableType, loopTypeName],
);
@@ -2265,7 +2281,7 @@
if (!_typeSystem.isAssignableTo2(sequenceElementType, variableType)) {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
+ CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
node.iterable,
[iterableType, loopTypeName, variableType],
);
@@ -2765,7 +2781,7 @@
/// Check that the given [typeReference] is not a type reference and that then
/// the [name] is reference to an instance member.
///
- /// See [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
+ /// See [CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
void _checkForInstanceAccessToStaticMember(
ClassElement typeReference, Expression target, SimpleIdentifier name) {
if (_isInComment) {
@@ -2802,7 +2818,7 @@
}
}
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+ CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
name,
[name.name, _getKind(element), element.enclosingElement.name]);
}
@@ -2838,7 +2854,7 @@
/// Verify that the given left hand side ([lhs]) and right hand side ([rhs])
/// represent a valid assignment.
///
- /// See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
+ /// See [CompileTimeErrorCode.INVALID_ASSIGNMENT].
void _checkForInvalidAssignment(Expression lhs, Expression rhs) {
if (lhs == null || rhs == null) {
return;
@@ -2863,7 +2879,7 @@
}
_checkForAssignableExpression(
- rhs, leftType, StaticTypeWarningCode.INVALID_ASSIGNMENT);
+ rhs, leftType, CompileTimeErrorCode.INVALID_ASSIGNMENT);
}
/// Check the given [initializer] to ensure that the field being initialized
@@ -3388,9 +3404,9 @@
if (superUnnamedConstructor != null) {
if (superUnnamedConstructor.isFactory) {
_errorReporter.reportErrorForNode(
- CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
+ CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR,
declaration.name,
- [superUnnamedConstructor]);
+ [superElement.name, _enclosingClass.name, superUnnamedConstructor]);
return;
}
if (superUnnamedConstructor.isDefaultConstructor) {
@@ -3408,6 +3424,35 @@
}
}
+ bool _checkForNoGenerativeConstructorsInSuperclass(TypeName superclass) {
+ InterfaceType superType = _enclosingClass.supertype;
+ if (superType == null) {
+ return false;
+ }
+ if (_enclosingClass.constructors
+ .every((constructor) => constructor.isFactory)) {
+ // A class with no generative constructors *can* be extended if the
+ // subclass has only factory constructors.
+ return false;
+ }
+ ClassElement superElement = superType.element;
+ if (superElement.constructors.isEmpty) {
+ // Exclude empty constructor set, which indicates other errors occurred.
+ return false;
+ }
+ if (superElement.constructors
+ .every((constructor) => constructor.isFactory)) {
+ // For `E extends Exception`, etc., this will never work, because it has
+ // no generative constructors. State this clearly to users.
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS,
+ superclass,
+ [_enclosingClass.name, superElement.name]);
+ return true;
+ }
+ return false;
+ }
+
/// Verify the given map [literal] either:
/// * has `const modifier`
/// * has explicit type arguments
@@ -3433,6 +3478,7 @@
return;
}
+ /// TODO(srawlins): Add any tests showing this is reported.
_errorReporter.reportErrorForNode(
CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT, literal);
}
@@ -4051,7 +4097,7 @@
/// Check that none of the type [parameters] references itself in its bound.
///
- /// See [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
+ /// See [CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
void _checkForTypeParameterBoundRecursion(List<TypeParameter> parameters) {
Map<TypeParameterElement, TypeParameter> elementToNode;
for (var parameter in parameters) {
@@ -4074,7 +4120,7 @@
if (step == parameters.length) {
var element = parameter.declaredElement;
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
+ CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
parameter,
[element.displayName, element.bound],
);
@@ -4141,6 +4187,11 @@
return;
}
ClassElement superElement = superType.element;
+ if (superElement.constructors
+ .every((constructor) => constructor.isFactory)) {
+ // Already reported [NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS].
+ return;
+ }
ConstructorElement superUnnamedConstructor =
superElement.unnamedConstructor;
if (superUnnamedConstructor != null) {
@@ -4256,7 +4307,7 @@
/// defined in the enclosing class rather than in a superclass.
///
/// See
- /// [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
+ /// [CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER].
void _checkForUnqualifiedReferenceToNonLocalStaticMember(
SimpleIdentifier name) {
Element element = name.staticElement;
@@ -4289,8 +4340,7 @@
[enclosingElement.displayName]);
} else {
_errorReporter.reportErrorForNode(
- StaticTypeWarningCode
- .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
name,
[enclosingElement.displayName]);
}
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index b57f4fe..49cc989 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -616,7 +616,7 @@
node.condition?.accept(this);
boolExpressionVerifier.checkForNonBoolExpression(
node.condition,
- errorCode: StaticTypeWarningCode.NON_BOOL_EXPRESSION,
+ errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
);
_flowAnalysis?.flow?.assert_afterCondition(node.condition);
node.message?.accept(this);
@@ -630,7 +630,7 @@
node.condition?.accept(this);
boolExpressionVerifier.checkForNonBoolExpression(
node.condition,
- errorCode: StaticTypeWarningCode.NON_BOOL_EXPRESSION,
+ errorCode: CompileTimeErrorCode.NON_BOOL_EXPRESSION,
);
_flowAnalysis?.flow?.assert_afterCondition(node.condition);
node.message?.accept(this);
diff --git a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
index 517c647..d019194 100644
--- a/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
+++ b/pkg/analyzer/lib/src/ignore_comments/ignore_info.dart
@@ -2,9 +2,10 @@
// 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:collection';
-
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/generated/source.dart';
/// Information about analysis `//ignore:` and `//ignore_for_file` comments
@@ -31,26 +32,73 @@
static final RegExp _IGNORE_FOR_FILE_MATCHER =
RegExp(r'//[ ]*ignore_for_file:(.*)$', multiLine: true);
- final Map<int, List<String>> _ignoreMap = HashMap<int, List<String>>();
+ /// A table mapping line numbers to the diagnostics that are ignored on that
+ /// line.
+ final Map<int, List<_DiagnosticName>> _ignoredOnLine = {};
- final Set<String> _ignoreForFileSet = HashSet<String>();
+ /// A list containing all of the diagnostics that are ignored for the whole
+ /// file.
+ final List<_DiagnosticName> _ignoredForFile = [];
- /// Whether this info object defines any ignores.
- bool get hasIgnores => _ignoreMap.isNotEmpty || _ignoreForFileSet.isNotEmpty;
+ IgnoreInfo();
- /// Test whether this [errorCode] is ignored at the given [line].
- bool ignoredAt(String errorCode, int line) =>
- _ignoreForFileSet.contains(errorCode) ||
- _ignoreMap[line]?.contains(errorCode) == true;
+ /// Initialize a newly created instance of this class to represent the ignore
+ /// comments in the given compilation [unit].
+ IgnoreInfo.forDart(CompilationUnit unit, String content) {
+ var lineInfo = unit.lineInfo;
+ for (var comment in unit.ignoreComments) {
+ var lexeme = comment.lexeme;
+ if (lexeme.contains('ignore:')) {
+ var location = lineInfo.getLocation(comment.offset);
+ var lineNumber = location.lineNumber;
+ String beforeMatch = content.substring(
+ lineInfo.getOffsetOfLine(lineNumber - 1),
+ lineInfo.getOffsetOfLine(lineNumber - 1) +
+ location.columnNumber -
+ 1);
+ if (beforeMatch.trim().isEmpty) {
+ // The comment is on its own line, so it refers to the next line.
+ lineNumber++;
+ }
+ _ignoredOnLine
+ .putIfAbsent(lineNumber, () => [])
+ .addAll(comment.diagnosticNames);
+ } else if (lexeme.contains('ignore_for_file:')) {
+ _ignoredForFile.addAll(comment.diagnosticNames);
+ }
+ }
+ }
+
+ /// Return `true` if there are any ignore comments in the file.
+ bool get hasIgnores =>
+ _ignoredOnLine.isNotEmpty || _ignoredForFile.isNotEmpty;
+
+ /// Return `true` if the [errorCode] is ignored at the given [line].
+ bool ignoredAt(String errorCode, int line) {
+ for (var name in _ignoredForFile) {
+ if (name.matches(errorCode)) {
+ return true;
+ }
+ }
+ var ignoredOnLine = _ignoredOnLine[line];
+ if (ignoredOnLine != null) {
+ for (var name in ignoredOnLine) {
+ if (name.matches(errorCode)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
/// Ignore these [errorCodes] at [line].
- void _addAll(int line, Iterable<String> errorCodes) {
- _ignoreMap.putIfAbsent(line, () => <String>[]).addAll(errorCodes);
+ void _addAll(int line, Iterable<_DiagnosticName> errorCodes) {
+ _ignoredOnLine.putIfAbsent(line, () => []).addAll(errorCodes);
}
/// Ignore these [errorCodes] in the whole file.
- void _addAllForFile(Iterable<String> errorCodes) {
- _ignoreForFileSet.addAll(errorCodes);
+ void _addAllForFile(Iterable<_DiagnosticName> errorCodes) {
+ _ignoredForFile.addAll(errorCodes);
}
/// Calculate ignores for the given [content] with line [info].
@@ -64,10 +112,13 @@
IgnoreInfo ignoreInfo = IgnoreInfo();
for (Match match in matches) {
// See _IGNORE_MATCHER for format --- note the possibility of error lists.
- Iterable<String> codes = match
+ // Note that the offsets are not being computed here. This shouldn't
+ // affect older clients of this class because none of the previous APIs
+ // depended on having offsets.
+ Iterable<_DiagnosticName> codes = match
.group(1)
.split(',')
- .map((String code) => code.trim().toLowerCase());
+ .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
CharacterLocation location = info.getLocation(match.start);
int lineNumber = location.lineNumber;
String beforeMatch = content.substring(
@@ -82,13 +133,75 @@
ignoreInfo._addAll(lineNumber, codes);
}
}
+ // Note that the offsets are not being computed here. This shouldn't affect
+ // older clients of this class because none of the previous APIs depended on
+ // having offsets.
for (Match match in fileMatches) {
- Iterable<String> codes = match
+ Iterable<_DiagnosticName> codes = match
.group(1)
.split(',')
- .map((String code) => code.trim().toLowerCase());
+ .map((String code) => _DiagnosticName(code.trim().toLowerCase(), -1));
ignoreInfo._addAllForFile(codes);
}
return ignoreInfo;
}
}
+
+/// The name and location of a diagnostic name in an ignore comment.
+class _DiagnosticName {
+ /// The name of the diagnostic being ignored.
+ final String name;
+
+ /// The offset of the diagnostic in the source file.
+ final int offset;
+
+ /// Initialize a newly created diagnostic name to have the given [name] and
+ /// [offset].
+ _DiagnosticName(this.name, this.offset);
+
+ /// Return `true` if this diagnostic name matches the given error code.
+ bool matches(String errorCode) => name == errorCode;
+}
+
+extension on CompilationUnit {
+ /// Return all of the ignore comments in this compilation unit.
+ Iterable<CommentToken> get ignoreComments sync* {
+ Iterable<CommentToken> processPrecedingComments(Token currentToken) sync* {
+ var comment = currentToken.precedingComments;
+ while (comment != null) {
+ var lexeme = comment.lexeme;
+ var match = IgnoreInfo._IGNORE_MATCHER.matchAsPrefix(lexeme);
+ if (match != null) {
+ yield comment;
+ } else {
+ match = IgnoreInfo._IGNORE_FOR_FILE_MATCHER.matchAsPrefix(lexeme);
+ if (match != null) {
+ yield comment;
+ }
+ }
+ comment = comment.next;
+ }
+ }
+
+ var currentToken = beginToken;
+ while (currentToken != currentToken.next) {
+ yield* processPrecedingComments(currentToken);
+ currentToken = currentToken.next;
+ }
+ yield* processPrecedingComments(currentToken);
+ }
+}
+
+extension on CommentToken {
+ /// Return the diagnostic names contained in this comment, assuming that it is
+ /// a correctly formatted ignore comment.
+ Iterable<_DiagnosticName> get diagnosticNames sync* {
+ int offset = lexeme.indexOf(':') + 1;
+ var names = lexeme.substring(offset).split(',');
+ offset += this.offset;
+ for (var name in names) {
+ yield _DiagnosticName(name.trim().toLowerCase(), offset);
+ offset += name.length + 1;
+ }
+ }
+}
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 0d43ce3..1ac317b 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -26,342 +26,6 @@
]);
}
- test_fieldFormalParameterAssignableToField_extends() async {
- // According to checked-mode type checking rules, a value of type B is
- // assignable to a field of type A, because B extends A (and hence is a
- // subtype of A).
- await assertNoErrorsInCode(r'''
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-class C {
- final A a;
- const C(this.a);
-}
-var v = const C(const B());
-''');
- }
-
- test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() async {
- // Null always passes runtime type checks, even when the type is
- // unresolved.
- await assertErrorsInCode(r'''
-class A {
- final Unresolved x;
- const A(String this.x);
-}
-var v = const A(null);
-''', [
- error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
- ]);
- }
-
- test_fieldFormalParameterAssignableToField_implements() async {
- // According to checked-mode type checking rules, a value of type B is
- // assignable to a field of type A, because B implements A (and hence is a
- // subtype of A).
- await assertNoErrorsInCode(r'''
-class A {}
-class B implements A {
- const B();
-}
-class C {
- final A a;
- const C(this.a);
-}
-var v = const C(const B());
-''');
- }
-
- test_fieldFormalParameterAssignableToField_list_dynamic() async {
- // [1, 2, 3] has type List<dynamic>, which is a subtype of List<int>.
- await assertNoErrorsInCode(r'''
-class A {
- const A(List<int> x);
-}
-var x = const A(const [1, 2, 3]);
-''');
- }
-
- test_fieldFormalParameterAssignableToField_list_nonDynamic() async {
- // <int>[1, 2, 3] has type List<int>, which is a subtype of List<num>.
- await assertNoErrorsInCode(r'''
-class A {
- const A(List<num> x);
-}
-var x = const A(const <int>[1, 2, 3]);
-''');
- }
-
- test_fieldFormalParameterAssignableToField_map_dynamic() async {
- // {1: 2} has type Map<dynamic, dynamic>, which is a subtype of
- // Map<int, int>.
- await assertNoErrorsInCode(r'''
-class A {
- const A(Map<int, int> x);
-}
-var x = const A(const {1: 2});
-''');
- }
-
- test_fieldFormalParameterAssignableToField_map_keyDifferent() async {
- // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
- // Map<num, int>.
- await assertNoErrorsInCode(r'''
-class A {
- const A(Map<num, int> x);
-}
-var x = const A(const <int, int>{1: 2});
-''');
- }
-
- test_fieldFormalParameterAssignableToField_map_valueDifferent() async {
- // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
- // Map<int, num>.
- await assertNoErrorsInCode(r'''
-class A {
- const A(Map<int, num> x);
-}
-var x = const A(const <int, int>{1: 2});
-''');
- }
-
- test_fieldFormalParameterAssignableToField_notype() async {
- // If a field is declared without a type, then any value may be assigned to
- // it.
- await assertNoErrorsInCode(r'''
-class A {
- final x;
- const A(this.x);
-}
-var v = const A(5);
-''');
- }
-
- test_fieldFormalParameterAssignableToField_null() async {
- // Null is assignable to anything.
- await assertNoErrorsInCode(r'''
-class A {
- final int x;
- const A(this.x);
-}
-var v = const A(null);
-''');
- }
-
- test_fieldFormalParameterAssignableToField_typedef() async {
- // foo has the runtime type dynamic -> dynamic, so it is not assignable
- // to A.f.
- await assertErrorsInCode(r'''
-typedef String Int2String(int x);
-class A {
- final Int2String f;
- const A(this.f);
-}
-foo(x) => 1;
-var v = const A(foo);
-''', [
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 116, 3),
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 116,
- 3),
- ]);
- }
-
- test_fieldFormalParameterAssignableToField_typeSubstitution() async {
- // foo has the runtime type dynamic -> dynamic, so it should be assignable
- // to A.f.
- await assertNoErrorsInCode(r'''
-class A<T> {
- final T x;
- const A(this.x);
-}
-var v = const A<int>(3);
-''');
- }
-
- test_fieldFormalParameterNotAssignableToField() async {
- await assertErrorsInCode(r'''
-class A {
- final int x;
- const A(this.x);
-}
-var v = const A('foo');
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 62,
- 5),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_extends() async {
- // According to checked-mode type checking rules, a value of type A is not
- // assignable to a field of type B, because B extends A (the subtyping
- // relationship is in the wrong direction).
- await assertErrorsInCode(r'''
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-class C {
- final B b;
- const C(this.b);
-}
-const A u = const A();
-var v = const C(u);
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 143,
- 1),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_fieldType() async {
- await assertErrorsInCode(r'''
-class A {
- final int x;
- const A(this.x);
-}
-var v = const A('foo');
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 62,
- 5),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() async {
- await assertErrorsInCode(r'''
-class A {
- final Unresolved x;
- const A(String this.x);
-}
-var v = const A('foo');
-''', [
- error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_implements() async {
- // According to checked-mode type checking rules, a value of type A is not
- // assignable to a field of type B, because B implements A (the subtyping
- // relationship is in the wrong direction).
- await assertErrorsInCode(r'''
-class A {
- const A();
-}
-class B implements A {}
-class C {
- final B b;
- const C(this.b);
-}
-const A u = const A();
-var v = const C(u);
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 132,
- 1),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_list() async {
- // <num>[1, 2, 3] has type List<num>, which is not a subtype of List<int>.
- await assertErrorsInCode(r'''
-class A {
- const A(List<int> x);
-}
-const dynamic w = const <num>[1, 2, 3];
-var x = const A(w);
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 92,
- 1),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_map_keyMismatch() async {
- // <num, int>{1: 2} has type Map<num, int>, which is not a subtype of
- // Map<int, int>.
- await assertErrorsInCode(r'''
-class A {
- const A(Map<int, int> x);
-}
-const dynamic w = const <num, int>{1: 2};
-var x = const A(w);
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 98,
- 1),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_map_valueMismatch() async {
- // <int, num>{1: 2} has type Map<int, num>, which is not a subtype of
- // Map<int, int>.
- await assertErrorsInCode(r'''
-class A {
- const A(Map<int, int> x);
-}
-const dynamic w = const <int, num>{1: 2};
-var x = const A(w);
-''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 98,
- 1),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_optional() async {
- await assertErrorsInCode(r'''
-class A {
- final int x;
- const A([this.x = 'foo']);
-}
-var v = const A();
-''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 45, 5),
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 64,
- 9),
- ]);
- }
-
- test_fieldFormalParameterNotAssignableToField_typedef() async {
- // foo has the runtime type String -> int, so it should not be assignable
- // to A.f (A.f requires it to be int -> String).
- await assertErrorsInCode(r'''
-typedef String Int2String(int x);
-class A {
- final Int2String f;
- const A(this.f);
-}
-int foo(String x) => 1;
-var v = const A(foo);
-''', [
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 127, 3),
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 127,
- 3),
- ]);
- }
-
test_fieldInitializerNotAssignable() async {
await assertErrorsInCode(r'''
class A {
@@ -404,7 +68,7 @@
var v = const C<String>();
''',
[
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 27, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
error(
CheckedModeCompileTimeErrorCode
.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
@@ -437,7 +101,7 @@
var v = const C<int>();
''',
[
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 27, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 27, 1),
],
);
}
@@ -538,10 +202,7 @@
}
var v = const A('foo');
''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 46,
- 5),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 46, 5),
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 46, 5),
]);
}
@@ -554,10 +215,7 @@
var v = const A<int>('foo');
''', [
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 5),
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 52,
- 5),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 52, 5),
]);
}
@@ -620,7 +278,7 @@
const int x = 'foo';
''', [
error(CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, 14, 5),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 14, 5),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 14, 5),
]);
}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
deleted file mode 100644
index 8afcd5b..0000000
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2014, 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';
-
-import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
-
-import '../src/dart/resolution/driver_resolution.dart';
-
-class CompileTimeErrorCodeTestBase extends DriverResolutionTest {
- test_bug_23176() async {
- await assertErrorsInCode('''
-class A {
- const A([x]);
-}
-class B {
- dynamic @A(const A()) x;
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 40, 7),
- error(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 40, 7),
- error(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 62, 1),
- ]);
- }
-
- test_builtInIdentifierAsType_formalParameter_field() async {
- await assertErrorsInCode(r'''
-class A {
- var x;
- A(static this.x);
-}
-''', [
- error(ParserErrorCode.EXTRANEOUS_MODIFIER, 23, 6),
- ]);
- }
-
- test_builtInIdentifierAsType_formalParameter_simple() async {
- await assertErrorsInCode(r'''
-f(static x) {
-}
-''', [
- error(ParserErrorCode.EXTRANEOUS_MODIFIER, 2, 6),
- ]);
- }
-
- test_builtInIdentifierAsType_variableDeclaration() async {
- await assertErrorsInCode(r'''
-f() {
- typedef x;
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 8, 7),
- error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 8, 7),
- error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 16, 1),
- ]);
- }
-
- test_consistentCaseExpressionTypes_dynamic() async {
- // Even though A.S and S have a static type of "dynamic", we should see
- // that they match 'abc', because they are constant strings.
- await assertNoErrorsInCode(r'''
-class A {
- static const S = 'A.S';
-}
-
-const S = 'S';
-
-foo(var p) {
- switch (p) {
- case S:
- break;
- case A.S:
- break;
- case 'abc':
- break;
- }
-}
-''');
- }
-
- test_constConstructor_redirect_generic() async {
- await assertNoErrorsInCode(r'''
-class A<T> {
- const A(T value) : this._(value);
- const A._(T value) : value = value;
- final T value;
-}
-
-void main(){
- const A<int>(1);
-}
-''');
- }
-
- test_constEvalThrowsException() async {
- await assertErrorsInCode(r'''
-class C {
- const C();
-}
-f() { return const C(); }
-''', [
- error(CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION, 0, 0),
- ]);
- }
-
- test_constEvalThrowsException_divisionByZero() async {
- await assertErrorsInCode('''
-const C = 1 ~/ 0;
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, 10, 6),
- ]);
- }
-
- test_constEvalTypeInt_binary() async {
- await _check_constEvalTypeBoolOrInt_binary("a ^ ''");
- await _check_constEvalTypeBoolOrInt_binary("a & ''");
- await _check_constEvalTypeBoolOrInt_binary("a | ''");
- await _check_constEvalTypeInt_binary("a >> ''");
- await _check_constEvalTypeInt_binary("a << ''");
- }
-
- test_constEvalTypeNum_binary() async {
- await _check_constEvalTypeNum_binary("a + ''");
- await _check_constEvalTypeNum_binary("a - ''");
- await _check_constEvalTypeNum_binary("a * ''");
- await _check_constEvalTypeNum_binary("a / ''");
- await _check_constEvalTypeNum_binary("a ~/ ''");
- await _check_constEvalTypeNum_binary("a > ''");
- await _check_constEvalTypeNum_binary("a < ''");
- await _check_constEvalTypeNum_binary("a >= ''");
- await _check_constEvalTypeNum_binary("a <= ''");
- await _check_constEvalTypeNum_binary("a % ''");
- }
-
- test_constWithNonConstantArgument_annotation() async {
- await assertErrorsInCode(r'''
-class A {
- const A(int p);
-}
-var v = 42;
-@A(v)
-main() {
-}
-''', [
- error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 45, 1),
- ]);
- }
-
- test_constWithNonConstantArgument_classShadowedBySetter() async {
- await assertErrorsInCode(r'''
-class Annotation {
- const Annotation(Object obj);
-}
-
-class Bar {}
-
-class Foo {
- @Annotation(Bar)
- set Bar(int value) {}
-}
-''', [
- error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 94, 3),
- error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 94, 3),
- ]);
- }
-
- test_constWithNonConstantArgument_instanceCreation() async {
- await assertErrorsInCode(r'''
-class A {
- const A(a);
-}
-f(p) { return const A(p); }
-''', [
- error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 48, 1),
- ]);
- }
-
- test_fromEnvironment_bool_badArgs() async {
- await assertErrorsInCode(r'''
-var b1 = const bool.fromEnvironment(1);
-var b2 = const bool.fromEnvironment('x', defaultValue: 1);
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 29),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 36, 1),
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 49, 48),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 81, 15),
- ]);
- }
-
- test_fromEnvironment_bool_badDefault_whenDefined() async {
- // The type of the defaultValue needs to be correct even when the default
- // value isn't used (because the variable is defined in the environment).
- driver.declaredVariables = DeclaredVariables.fromMap({'x': 'true'});
- await assertErrorsInCode('''
-var b = const bool.fromEnvironment('x', defaultValue: 1);
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 8, 48),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 40, 15),
- ]);
- }
-
- test_genericFunctionTypeArgument_inference_function() async {
- await assertErrorsInCode(r'''
-T f<T>(T t) => null;
-main() { f(<S>(S s) => s); }
-''', [
- error(CompileTimeErrorCode.COULD_NOT_INFER, 30, 1),
- ]);
- }
-
- test_genericFunctionTypeArgument_inference_functionType() async {
- await assertErrorsInCode(r'''
-T Function<T>(T) f;
-main() { f(<S>(S s) => s); }
-''', [
- error(CompileTimeErrorCode.COULD_NOT_INFER, 29, 1),
- ]);
- }
-
- test_genericFunctionTypeArgument_inference_method() async {
- await assertErrorsInCode(r'''
-class C {
- T f<T>(T t) => null;
-}
-main() { new C().f(<S>(S s) => s); }
-''', [
- error(CompileTimeErrorCode.COULD_NOT_INFER, 52, 1),
- ]);
- }
-
- test_genericFunctionTypedParameter() async {
- var code = '''
-void g(T f<T>(T x)) {}
-''';
- await assertNoErrorsInCode(code);
- }
-
- test_length_of_erroneous_constant() async {
- // Attempting to compute the length of constant that couldn't be evaluated
- // (due to an error) should not crash the analyzer (see dartbug.com/23383)
- await assertErrorsInCode('''
-const int i = (1 ? 'alpha' : 'beta').length;
-''', [
- error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 14,
- 29),
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 15, 1),
- error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 15, 1),
- ]);
- }
-
- test_nonConstMapAsExpressionStatement_begin() async {
- // TODO(danrubel): Consider improving recovery
- await assertErrorsInCode(r'''
-f() {
- {'a' : 0, 'b' : 1}.length;
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
- error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
- ]);
- }
-
- test_nonConstMapAsExpressionStatement_only() async {
- // TODO(danrubel): Consider improving recovery
- await assertErrorsInCode(r'''
-f() {
- {'a' : 0, 'b' : 1};
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
- error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
- ]);
- }
-
- test_nonConstValueInInitializer_instanceCreation_inDifferentFile() async {
- newFile('/test/lib/a.dart', content: '''
-import 'b.dart';
-const v = const MyClass();
-''');
- await assertErrorsInCode('''
-class MyClass {
- const MyClass([p = foo]);
-}
-''', [
- error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 37, 3),
- error(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 37, 3),
- ]);
- }
-
- test_symbol_constructor_badArgs() async {
- await assertErrorsInCode(r'''
-var s1 = const Symbol('3');
-var s2 = const Symbol(3);
-var s3 = const Symbol();
-var s4 = const Symbol('x', 'y');
-var s5 = const Symbol('x', foo: 'x');
-''', [
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 17),
- error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 37, 15),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
- error(CompileTimeErrorCode.NOT_ENOUGH_POSITIONAL_ARGUMENTS, 75, 2),
- error(CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS, 100, 10),
- error(CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER, 139, 3),
- ]);
- }
-
- Future<void> _check_constEvalTypeBoolOrInt_binary(String expr) async {
- await assertErrorsInCode('''
-const int a = 0;
-const _ = $expr;
-''', [
- error(HintCode.UNUSED_ELEMENT, 23, 1),
- error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
- ]);
- }
-
- Future<void> _check_constEvalTypeInt_binary(String expr) async {
- await assertErrorsInCode('''
-const int a = 0;
-const _ = $expr;
-''', [
- error(HintCode.UNUSED_ELEMENT, 23, 1),
- error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
- ]);
- }
-
- Future<void> _check_constEvalTypeNum_binary(String expr) async {
- await assertErrorsInCode('''
-const num a = 0;
-const _ = $expr;
-''', [
- error(HintCode.UNUSED_ELEMENT, 23, 1),
- error(CompileTimeErrorCode.CONST_EVAL_TYPE_NUM, 27, 6),
- error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
deleted file mode 100644
index b77cbfd..0000000
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/dart/resolution/driver_resolution.dart';
-import 'compile_time_error_code.dart';
-
-main() {
- defineReflectiveSuite(() {
- defineReflectiveTests(CompileTimeErrorCodeTest);
- defineReflectiveTests(ControlFlowCollectionsTest);
- });
-}
-
-@reflectiveTest
-class CompileTimeErrorCodeTest extends CompileTimeErrorCodeTestBase {
- @override
- @failingTest
- test_constEvalThrowsException() {
- return super.test_constEvalThrowsException();
- }
-}
-
-@reflectiveTest
-class ControlFlowCollectionsTest extends DriverResolutionTest {
- test_listElementTypeNotAssignable_const() async {
- await assertErrorsInCode('''
-var v = const <String>[42];
-''', [
- error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
- ]);
- }
-
- test_mapValueTypeNotAssignable_const() async {
- await assertErrorsInCode('''
-var v = const <String, String>{'a' : 2};
-''', [
- error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 37, 1),
- ]);
- }
-
- test_nonBoolCondition_for_declaration() async {
- // https://github.com/dart-lang/sdk/issues/24713
- await assertErrorsInCode(r'''
-f() {
- for (int i = 0; 3;) {}
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 24, 1),
- ]);
- }
-
- test_nonBoolCondition_for_expression() async {
- // https://github.com/dart-lang/sdk/issues/24713
- await assertErrorsInCode(r'''
-f() {
- int i;
- for (i = 0; 3;) {}
-}''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 29, 1),
- ]);
- }
-
- test_nonConstMapAsExpressionStatement_begin() async {
- // TODO(danrubel) Fasta is not recovering well.
- // Ideally we would produce a single diagnostic:
- // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
- await assertErrorsInCode(r'''
-f() {
- {'a' : 0, 'b' : 1}.length;
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
- error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
- ]);
- }
-
- test_nonConstMapAsExpressionStatement_only() async {
- // TODO(danrubel) Fasta is not recovering well.
- // Ideally we would produce a single diagnostic:
- // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
- await assertErrorsInCode(r'''
-f() {
- {'a' : 0, 'b' : 1};
-}
-''', [
- error(ParserErrorCode.EXPECTED_TOKEN, 9, 3),
- error(ParserErrorCode.EXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 13, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 15, 1),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 18, 3),
- error(ParserErrorCode.UNEXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.MISSING_IDENTIFIER, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 22, 1),
- error(ParserErrorCode.EXPECTED_TOKEN, 24, 1),
- ]);
- }
-
- test_setElementTypeNotAssignable_const() async {
- await assertErrorsInCode('''
-var v = const <String>{42};
-''', [
- error(CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/generated/error_suppression_test.dart b/pkg/analyzer/test/generated/error_suppression_test.dart
index 877c713..2335951 100644
--- a/pkg/analyzer/test/generated/error_suppression_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_test.dart
@@ -22,7 +22,7 @@
await assertErrorsInCode('''
int x = ''; // ignore: invalid_assignment
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 2),
]);
}
@@ -31,7 +31,7 @@
// ignore: unused_import, undefined_function
f() => g();
''', [
- error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 52, 1),
+ error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 52, 1),
]);
}
@@ -41,7 +41,7 @@
int x = '';
int _y = 0; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 34, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 34, 2),
error(HintCode.UNUSED_ELEMENT, 42, 2),
]);
}
@@ -139,7 +139,7 @@
int x = '';
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 2),
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 57,
1),
]);
@@ -153,7 +153,7 @@
''', [
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43,
1),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 1),
]);
}
@@ -162,7 +162,7 @@
// ignore invalid_assignment
String y = 3; //INVALID_ASSIGNMENT
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 40, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 40, 1),
]);
}
@@ -228,7 +228,7 @@
int x = ''; //INVALID_ASSIGNMENT
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 2),
error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43,
1),
]);
@@ -260,7 +260,7 @@
'''
f() => g();
''',
- [error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 7, 1)],
+ [error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 7, 1)],
);
}
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 035fd21..7b2fb4a 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -329,6 +329,17 @@
''');
}
+ test_typeBeforeAnnotation() async {
+ await _assertCanBeAnalyzed('''
+class A {
+ const A([x]);
+}
+class B {
+ dynamic @A(const A()) x;
+}
+''');
+ }
+
Future<void> _assertCanBeAnalyzed(String text) async {
await resolveTestCode(text);
assertHasTestErrors();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 4527bd6..286187a 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2181,7 +2181,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 93, 1),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 97, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 97, 1),
]);
var z = result.unit.declaredElement.topLevelVariables
.where((e) => e.name == 'z')
@@ -2796,8 +2796,8 @@
null[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 0, 0),
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 0, 0),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 0, 0),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 0, 0),
]);
}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 61362bf..9423c6c 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -6880,7 +6880,7 @@
InstanceCreationExpressionImpl expression =
parseExpression('new a.b.c<C>()', errors: [
expectedError(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
8,
1)
]);
@@ -15153,7 +15153,7 @@
}
var statement = parseStatement('const A<B>.c<C>();') as ExpressionStatement;
assertErrorsWithCodes(
- [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR]);
+ [CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR]);
expect(statement.expression, isNotNull);
}
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 16902a4..bc21731 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -314,7 +314,7 @@
assert (n is int);
return n & 0x0F;
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 47, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 47, 1),
]);
}
@@ -337,7 +337,7 @@
int f(num n) {
return (n is! int) ? 0 : n & 0x0F;
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 44, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 44, 1),
]);
}
@@ -346,7 +346,7 @@
int f(num n) {
return (n is! int || n < 0) ? 0 : n & 0x0F;
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 53, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 53, 1),
]);
}
@@ -373,7 +373,7 @@
}''', [
error(HintCode.MISSING_RETURN, 4, 1),
error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 76, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 76, 1),
]);
}
@@ -406,7 +406,7 @@
return n & 0x0F;
}
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 72, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 72, 1),
]);
}
@@ -418,7 +418,7 @@
}
return n & 0x0F;
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 63, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 63, 1),
]);
}
@@ -431,7 +431,7 @@
return n & 0x0F;
}
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 81, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 81, 1),
]);
}
@@ -441,7 +441,7 @@
num n = 1234;
return n & 0x0F;
}''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 37, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 37, 1),
]);
}
}
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 4ff5151..09bb730 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -786,7 +786,7 @@
List<List<int>> b;
b[0][0] = 'hi';
}''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 39, 4),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 39, 4),
]);
verifyTestResolved();
}
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index d0ad450..14674c4 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -34,7 +34,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 65, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 65, 3),
]);
}
@@ -59,7 +59,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 68, 1),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 72, 10),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 72, 10),
]);
}
@@ -84,7 +84,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 75, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
]);
}
@@ -135,7 +135,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 64, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
]);
}
@@ -185,8 +185,8 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 271, 4),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 289, 2),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 304, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 289, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 304, 2),
]);
}
@@ -207,7 +207,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
]);
}
@@ -272,7 +272,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
]);
}
@@ -306,7 +306,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
]);
}
@@ -344,7 +344,7 @@
p = 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 71, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 71, 6),
]);
}
@@ -354,7 +354,7 @@
((p is String) && ((p = 42) == 42)) && p.length != 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 6),
]);
}
@@ -364,7 +364,7 @@
(p is String) && (((p = 42) == 42) && p.length != 0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 59, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 59, 6),
]);
}
@@ -376,7 +376,7 @@
p = 42;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 68, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 68, 6),
]);
}
@@ -388,7 +388,7 @@
p is String ? callMe(() { p.length; }) : 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 78, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 78, 6),
]);
}
@@ -398,7 +398,7 @@
p is String ? (p.length + (p = 42)) : 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 36, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 36, 6),
]);
}
@@ -414,7 +414,7 @@
p = 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 83, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 83, 6),
]);
}
@@ -426,7 +426,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 66, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 66, 6),
]);
}
@@ -444,7 +444,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 100, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 100, 1),
]);
}
@@ -462,7 +462,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 105, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 105, 1),
]);
}
@@ -475,7 +475,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
]);
}
@@ -488,7 +488,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 55, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 55, 6),
]);
}
@@ -501,7 +501,7 @@
() {p = 0;};
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
]);
}
@@ -514,7 +514,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 59, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 59, 6),
]);
}
@@ -527,7 +527,7 @@
f() {p = 0;};
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
error(HintCode.UNUSED_ELEMENT, 58, 1),
]);
}
@@ -542,7 +542,7 @@
}
''', [
error(HintCode.UNUSED_ELEMENT, 19, 1),
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 6),
]);
}
@@ -560,7 +560,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 103, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 103, 1),
]);
}
@@ -578,7 +578,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 112, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 112, 1),
]);
}
@@ -591,7 +591,7 @@
a.element.anyGetterExistsInDynamic;
}
''', [
- error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
+ error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 35, 10),
]);
}
}
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 6504efa..efa2a44 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -912,7 +912,7 @@
// Test that FutureOr does not have the constituent type methods
MethodInvocation invoke = await _testFutureOr(r'''
dynamic test(FutureOr<int> x) => x.abs();
- ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+ ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
_isDynamic(invoke.staticType);
}
@@ -920,7 +920,7 @@
// Test that FutureOr does not have the Future type methods
MethodInvocation invoke = await _testFutureOr(r'''
dynamic test(FutureOr<int> x) => x.then((x) => x);
- ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+ ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
_isDynamic(invoke.staticType);
}
@@ -928,7 +928,7 @@
// Test that FutureOr<dynamic> does not have all methods
MethodInvocation invoke = await _testFutureOr(r'''
dynamic test(FutureOr<dynamic> x) => x.abs();
- ''', errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
+ ''', errors: [CompileTimeErrorCode.UNDEFINED_METHOD]);
_isDynamic(invoke.staticType);
}
@@ -3667,7 +3667,7 @@
test_returnOfInvalidType_object_void() async {
await assertErrorsInCode(
"Object f() { void voidFn() => null; return voidFn(); }", [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 43, 8),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 43, 8),
]);
}
@@ -3702,7 +3702,7 @@
}
set g(int x) => 42;
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 41, 4),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 41, 4),
]);
}
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 12c45df..4d5a888 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -7,7 +7,6 @@
import 'all_the_rest_test.dart' as all_the_rest;
import 'checked_mode_compile_time_error_code_test.dart'
as checked_mode_compile_time_error_code;
-import 'compile_time_error_code_test.dart' as compile_time_error_code;
// ignore: deprecated_member_use_from_same_package
import 'constant_test.dart' as constant_test;
import 'element_resolver_test.dart' as element_resolver_test;
@@ -37,7 +36,6 @@
defineReflectiveSuite(() {
all_the_rest.main();
checked_mode_compile_time_error_code.main();
- compile_time_error_code.main();
constant_test.main();
element_resolver_test.main();
error_suppression.main();
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 3929a49..3c0dd2d 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -4,14 +4,11 @@
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_provider.dart';
import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/least_upper_bound.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/resolver/variance.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -21,8 +18,6 @@
main() {
defineReflectiveSuite(() {
defineReflectiveTests(AssignabilityTest);
- defineReflectiveTests(LeastUpperBoundFunctionsTest);
- defineReflectiveTests(LeastUpperBoundTest);
defineReflectiveTests(TryPromoteToTest);
});
}
@@ -87,10 +82,6 @@
typeSystem: typeSystem,
);
}
-
- String _typeString(TypeImpl type) {
- return type.getDisplayString(withNullability: true);
- }
}
@reflectiveTest
@@ -441,1238 +432,6 @@
}
}
-/// Base class for testing LUB and GLB in spec and strong mode.
-abstract class BoundTestBase extends AbstractTypeSystemTest {
- void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
- var expectedStr = _typeString(expected);
-
- var result = typeSystem.getLeastUpperBound(T1, T2);
- var resultStr = _typeString(result);
- expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
-
- // Check that the result is an upper bound.
- expect(typeSystem.isSubtypeOf(T1, result), true);
- expect(typeSystem.isSubtypeOf(T2, result), true);
-
- // Check for symmetry.
- result = typeSystem.getLeastUpperBound(T2, T1);
- resultStr = _typeString(result);
- expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
- }
-}
-
-@reflectiveTest
-class LeastUpperBoundFunctionsTest extends BoundTestBase {
- void test_differentRequiredArity() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- requiredParameter(type: intStar),
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, typeProvider.functionType);
- }
-
- void test_fuzzyArrows() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(type: dynamicType),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_glbNamedParams() {
- var type1 = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: stringStar),
- namedParameter(name: 'b', type: intStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: intStar),
- namedParameter(name: 'b', type: numStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: neverStar),
- namedParameter(name: 'b', type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_glbPositionalParams() {
- var type1 = functionTypeStar(
- parameters: [
- positionalParameter(type: stringStar),
- positionalParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- positionalParameter(type: intStar),
- positionalParameter(type: numStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- positionalParameter(type: neverStar),
- positionalParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_glbRequiredParams() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- requiredParameter(type: doubleStar),
- requiredParameter(type: numStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(type: neverStar),
- requiredParameter(type: neverStar),
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_ignoreExtraNamedParams() {
- var type1 = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: intStar),
- namedParameter(name: 'b', type: intStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: intStar),
- namedParameter(name: 'c', type: intStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- namedParameter(name: 'a', type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_ignoreExtraPositionalParams() {
- var type1 = functionTypeStar(
- parameters: [
- positionalParameter(type: intStar),
- positionalParameter(type: intStar),
- positionalParameter(type: stringStar),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- positionalParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- positionalParameter(type: intStar),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_lubReturnType() {
- var type1 = functionTypeStar(returnType: intStar);
- var type2 = functionTypeStar(returnType: doubleStar);
- var expected = functionTypeStar(returnType: numStar);
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_sameType_withNamed() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- namedParameter(name: 'n', type: numStar),
- ],
- returnType: intStar,
- );
-
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- namedParameter(name: 'n', type: numStar),
- ],
- returnType: intStar,
- );
-
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- namedParameter(name: 'n', type: numStar),
- ],
- returnType: intStar,
- );
-
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_sameType_withOptional() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- positionalParameter(type: doubleStar),
- ],
- returnType: intStar,
- );
-
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- positionalParameter(type: doubleStar),
- ],
- returnType: intStar,
- );
-
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: numStar),
- positionalParameter(type: doubleStar),
- ],
- returnType: intStar,
- );
-
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_typeFormals_differentBounds() {
- var T1 = typeParameter('T1', bound: intStar);
- var type1 = functionTypeStar(
- typeFormals: [T1],
- returnType: typeParameterTypeStar(T1),
- );
-
- var T2 = typeParameter('T2', bound: doubleStar);
- var type2 = functionTypeStar(
- typeFormals: [T2],
- returnType: typeParameterTypeStar(T2),
- );
-
- _checkLeastUpperBound(type1, type2, typeProvider.functionType);
- }
-
- void test_typeFormals_differentNumber() {
- var T1 = typeParameter('T1', bound: numStar);
- var type1 = functionTypeStar(
- typeFormals: [T1],
- returnType: typeParameterTypeStar(T1),
- );
-
- var type2 = functionTypeStar(returnType: intStar);
-
- _checkLeastUpperBound(type1, type2, typeProvider.functionType);
- }
-
- void test_typeFormals_sameBounds() {
- var T1 = typeParameter('T1', bound: numStar);
- var type1 = functionTypeStar(
- typeFormals: [T1],
- returnType: typeParameterTypeStar(T1),
- );
-
- var T2 = typeParameter('T2', bound: numStar);
- var type2 = functionTypeStar(
- typeFormals: [T2],
- returnType: typeParameterTypeStar(T2),
- );
-
- var TE = typeParameter('T', bound: numStar);
- var expected = functionTypeStar(
- typeFormals: [TE],
- returnType: typeParameterTypeStar(TE),
- );
-
- _checkLeastUpperBound(type1, type2, expected);
- }
-}
-
-@reflectiveTest
-class LeastUpperBoundTest extends BoundTestBase {
- void test_bottom_function() {
- _checkLeastUpperBound(neverStar, functionTypeStar(returnType: voidNone),
- functionTypeStar(returnType: voidNone));
- }
-
- void test_bottom_interface() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
- _checkLeastUpperBound(neverStar, typeA, typeA);
- }
-
- void test_bottom_typeParam() {
- var T = typeParameter('T');
- var typeT = typeParameterTypeStar(T);
- _checkLeastUpperBound(neverStar, typeT, typeT);
- }
-
- void test_directInterfaceCase() {
- // class A
- // class B implements A
- // class C implements B
-
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', interfaces: [typeA]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', interfaces: [typeB]);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeB);
- }
-
- void test_directSubclassCase() {
- // class A
- // class B extends A
- // class C extends B
-
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeB);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeB);
- }
-
- void test_directSuperclass_nullability() {
- var aElement = class_(name: 'A');
- var aQuestion = interfaceTypeQuestion(aElement);
- var aStar = interfaceTypeStar(aElement);
- var aNone = interfaceTypeNone(aElement);
-
- var bElementStar = class_(name: 'B', superType: aStar);
- var bElementNone = class_(name: 'B', superType: aNone);
-
- InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
- return interfaceType(
- bElementStar,
- nullabilitySuffix: nullability,
- );
- }
-
- InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
- return interfaceType(
- bElementNone,
- nullabilitySuffix: nullability,
- );
- }
-
- var bStarQuestion = _bTypeStarElement(NullabilitySuffix.question);
- var bStarStar = _bTypeStarElement(NullabilitySuffix.star);
- var bStarNone = _bTypeStarElement(NullabilitySuffix.none);
-
- var bNoneQuestion = _bTypeNoneElement(NullabilitySuffix.question);
- var bNoneStar = _bTypeNoneElement(NullabilitySuffix.star);
- var bNoneNone = _bTypeNoneElement(NullabilitySuffix.none);
-
- void assertLUB(DartType type1, DartType type2, DartType expected) {
- expect(typeSystem.getLeastUpperBound(type1, type2), expected);
- expect(typeSystem.getLeastUpperBound(type2, type1), expected);
- }
-
- assertLUB(bStarQuestion, aQuestion, aQuestion);
- assertLUB(bStarQuestion, aStar, aQuestion);
- assertLUB(bStarQuestion, aNone, aQuestion);
-
- assertLUB(bStarStar, aQuestion, aQuestion);
- assertLUB(bStarStar, aStar, aStar);
- assertLUB(bStarStar, aNone, aStar);
-
- assertLUB(bStarNone, aQuestion, aQuestion);
- assertLUB(bStarNone, aStar, aStar);
- assertLUB(bStarNone, aNone, aNone);
-
- assertLUB(bNoneQuestion, aQuestion, aQuestion);
- assertLUB(bNoneQuestion, aStar, aQuestion);
- assertLUB(bNoneQuestion, aNone, aQuestion);
-
- assertLUB(bNoneStar, aQuestion, aQuestion);
- assertLUB(bNoneStar, aStar, aStar);
- assertLUB(bNoneStar, aNone, aStar);
-
- assertLUB(bNoneNone, aQuestion, aQuestion);
- assertLUB(bNoneNone, aStar, aStar);
- assertLUB(bNoneNone, aNone, aNone);
- }
-
- void test_dynamic_bottom() {
- _checkLeastUpperBound(dynamicType, neverStar, dynamicType);
- }
-
- void test_dynamic_function() {
- _checkLeastUpperBound(
- dynamicType, functionTypeStar(returnType: voidNone), dynamicType);
- }
-
- void test_dynamic_interface() {
- var A = class_(name: 'A');
- _checkLeastUpperBound(dynamicType, interfaceTypeStar(A), dynamicType);
- }
-
- void test_dynamic_typeParam() {
- var T = typeParameter('T');
- _checkLeastUpperBound(dynamicType, typeParameterTypeStar(T), dynamicType);
- }
-
- void test_dynamic_void() {
- // Note: _checkLeastUpperBound tests `LUB(x, y)` as well as `LUB(y, x)`
- _checkLeastUpperBound(dynamicType, voidNone, voidNone);
- }
-
- void test_interface_function() {
- var A = class_(name: 'A');
- _checkLeastUpperBound(interfaceTypeStar(A),
- functionTypeStar(returnType: voidNone), objectStar);
- }
-
- void test_interface_sameElement_nullability() {
- var aElement = class_(name: 'A');
-
- var aQuestion = interfaceTypeQuestion(aElement);
- var aStar = interfaceTypeStar(aElement);
- var aNone = interfaceTypeNone(aElement);
-
- void assertLUB(DartType type1, DartType type2, DartType expected) {
- expect(typeSystem.getLeastUpperBound(type1, type2), expected);
- expect(typeSystem.getLeastUpperBound(type2, type1), expected);
- }
-
- assertLUB(aQuestion, aQuestion, aQuestion);
- assertLUB(aQuestion, aStar, aQuestion);
- assertLUB(aQuestion, aNone, aQuestion);
-
- assertLUB(aStar, aQuestion, aQuestion);
- assertLUB(aStar, aStar, aStar);
- assertLUB(aStar, aNone, aStar);
-
- assertLUB(aNone, aQuestion, aQuestion);
- assertLUB(aNone, aStar, aStar);
- assertLUB(aNone, aNone, aNone);
- }
-
- void test_mixinAndClass_constraintAndInterface() {
- var classA = class_(name: 'A');
- var instA = InstantiatedClass(classA, []);
-
- var classB = class_(
- name: 'B',
- interfaces: [instA.withNullabilitySuffixNone],
- );
-
- var mixinM = mixin_(
- name: 'M',
- constraints: [instA.withNullabilitySuffixNone],
- );
-
- _checkLeastUpperBound(
- interfaceTypeStar(classB),
- interfaceTypeStar(mixinM),
- instA.withNullability(NullabilitySuffix.star),
- );
- }
-
- void test_mixinAndClass_object() {
- var classA = class_(name: 'A');
- var mixinM = mixin_(name: 'M');
-
- _checkLeastUpperBound(
- interfaceTypeStar(classA),
- interfaceTypeStar(mixinM),
- objectStar,
- );
- }
-
- void test_mixinAndClass_sharedInterface() {
- var classA = class_(name: 'A');
- var instA = InstantiatedClass(classA, []);
-
- var classB = class_(
- name: 'B',
- interfaces: [instA.withNullabilitySuffixNone],
- );
-
- var mixinM = mixin_(
- name: 'M',
- interfaces: [instA.withNullabilitySuffixNone],
- );
-
- _checkLeastUpperBound(
- interfaceTypeStar(classB),
- interfaceTypeStar(mixinM),
- instA.withNullability(NullabilitySuffix.star),
- );
- }
-
- void test_mixinCase() {
- // class A
- // class B extends A
- // class C extends A
- // class D extends B with M, N, O, P
-
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeA);
- var typeC = interfaceTypeStar(C);
-
- var D = class_(
- name: 'D',
- superType: typeB,
- mixins: [
- interfaceTypeStar(class_(name: 'M')),
- interfaceTypeStar(class_(name: 'N')),
- interfaceTypeStar(class_(name: 'O')),
- interfaceTypeStar(class_(name: 'P')),
- ],
- );
- var typeD = interfaceTypeStar(D);
-
- _checkLeastUpperBound(typeD, typeC, typeA);
- }
-
- void test_nestedFunctionsLubInnerParamTypes() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: intStar),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- requiredParameter(type: doubleStar),
- requiredParameter(type: numStar),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: objectStar),
- requiredParameter(type: numStar),
- requiredParameter(type: numStar),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_nestedNestedFunctionsGlbInnermostParamTypes() {
- var type1 = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: stringStar),
- requiredParameter(type: intStar),
- requiredParameter(type: intStar)
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- expect(
- _typeString(type1),
- 'void Function(void Function(void Function(String*, int*, int*)*)*)*',
- );
-
- var type2 = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: intStar),
- requiredParameter(type: doubleStar),
- requiredParameter(type: numStar)
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- expect(
- _typeString(type2),
- 'void Function(void Function(void Function(int*, double*, num*)*)*)*',
- );
- var expected = functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(
- type: functionTypeStar(
- parameters: [
- requiredParameter(type: neverStar),
- requiredParameter(type: neverStar),
- requiredParameter(type: intStar)
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- ),
- ),
- ],
- returnType: voidNone,
- );
- expect(
- _typeString(expected),
- 'void Function(void Function(void Function(Never*, Never*, int*)*)*)*',
- );
-
- _checkLeastUpperBound(type1, type2, expected);
- }
-
- void test_object() {
- var A = class_(name: 'A');
- var B = class_(name: 'B');
- var typeA = interfaceTypeStar(A);
- var typeB = interfaceTypeStar(B);
- var typeObject = typeA.element.supertype;
- // assert that object does not have a super type
- expect(typeObject.element.supertype, isNull);
- // assert that both A and B have the same super type of Object
- expect(typeB.element.supertype, typeObject);
- // finally, assert that the only least upper bound of A and B is Object
- _checkLeastUpperBound(typeA, typeB, typeObject);
- }
-
- void test_self() {
- var T = typeParameter('T');
- var A = class_(name: 'A');
-
- List<DartType> types = [
- dynamicType,
- voidNone,
- neverStar,
- typeParameterTypeStar(T),
- interfaceTypeStar(A),
- functionTypeStar(returnType: voidNone)
- ];
-
- for (DartType type in types) {
- _checkLeastUpperBound(type, type, type);
- }
- }
-
- void test_sharedSuperclass1() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeA);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeA);
- }
-
- void test_sharedSuperclass1_nullability() {
- var aElement = class_(name: 'A');
- var aQuestion = interfaceTypeQuestion(aElement);
- var aStar = interfaceTypeStar(aElement);
- var aNone = interfaceTypeNone(aElement);
-
- var bElementNone = class_(name: 'B', superType: aNone);
- var bElementStar = class_(name: 'B', superType: aStar);
-
- var cElementNone = class_(name: 'C', superType: aNone);
- var cElementStar = class_(name: 'C', superType: aStar);
-
- InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
- return interfaceType(
- bElementNone,
- nullabilitySuffix: nullability,
- );
- }
-
- InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
- return interfaceType(
- bElementStar,
- nullabilitySuffix: nullability,
- );
- }
-
- var bNoneQuestion = bTypeElementNone(NullabilitySuffix.question);
- var bNoneStar = bTypeElementNone(NullabilitySuffix.star);
- var bNoneNone = bTypeElementNone(NullabilitySuffix.none);
-
- var bStarQuestion = bTypeElementStar(NullabilitySuffix.question);
- var bStarStar = bTypeElementStar(NullabilitySuffix.star);
- var bStarNone = bTypeElementStar(NullabilitySuffix.none);
-
- InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
- return interfaceType(
- cElementNone,
- nullabilitySuffix: nullability,
- );
- }
-
- InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
- return interfaceType(
- cElementStar,
- nullabilitySuffix: nullability,
- );
- }
-
- var cNoneQuestion = cTypeElementNone(NullabilitySuffix.question);
- var cNoneStar = cTypeElementNone(NullabilitySuffix.star);
- var cNoneNone = cTypeElementNone(NullabilitySuffix.none);
-
- var cStarQuestion = cTypeElementStar(NullabilitySuffix.question);
- var cStarStar = cTypeElementStar(NullabilitySuffix.star);
- var cStarNone = cTypeElementStar(NullabilitySuffix.none);
-
- void assertLUB(DartType type1, DartType type2, DartType expected) {
- expect(typeSystem.getLeastUpperBound(type1, type2), expected);
- expect(typeSystem.getLeastUpperBound(type2, type1), expected);
- }
-
- assertLUB(bNoneQuestion, cNoneQuestion, aQuestion);
- assertLUB(bNoneQuestion, cNoneStar, aQuestion);
- assertLUB(bNoneQuestion, cNoneNone, aQuestion);
- assertLUB(bNoneQuestion, cStarQuestion, aQuestion);
- assertLUB(bNoneQuestion, cStarStar, aQuestion);
- assertLUB(bNoneQuestion, cStarNone, aQuestion);
-
- assertLUB(bNoneStar, cNoneQuestion, aQuestion);
- assertLUB(bNoneStar, cNoneStar, aStar);
- assertLUB(bNoneStar, cNoneNone, aStar);
- assertLUB(bNoneStar, cStarQuestion, aQuestion);
- assertLUB(bNoneStar, cStarStar, aStar);
- assertLUB(bNoneStar, cStarNone, aStar);
-
- assertLUB(bNoneNone, cNoneQuestion, aQuestion);
- assertLUB(bNoneNone, cNoneStar, aStar);
- assertLUB(bNoneNone, cNoneNone, aNone);
- assertLUB(bNoneNone, cStarQuestion, aQuestion);
- assertLUB(bNoneNone, cStarStar, aStar);
- assertLUB(bNoneNone, cStarNone, aNone);
-
- assertLUB(bStarQuestion, cNoneQuestion, aQuestion);
- assertLUB(bStarQuestion, cNoneStar, aQuestion);
- assertLUB(bStarQuestion, cNoneNone, aQuestion);
- assertLUB(bStarQuestion, cStarQuestion, aQuestion);
- assertLUB(bStarQuestion, cStarStar, aQuestion);
- assertLUB(bStarQuestion, cStarNone, aQuestion);
-
- assertLUB(bStarStar, cNoneQuestion, aQuestion);
- assertLUB(bStarStar, cNoneStar, aStar);
- assertLUB(bStarStar, cNoneNone, aStar);
- assertLUB(bStarStar, cStarQuestion, aQuestion);
- assertLUB(bStarStar, cStarStar, aStar);
- assertLUB(bStarStar, cStarNone, aStar);
-
- assertLUB(bStarNone, cNoneQuestion, aQuestion);
- assertLUB(bStarNone, cNoneStar, aStar);
- assertLUB(bStarNone, cNoneNone, aNone);
- assertLUB(bStarNone, cStarQuestion, aQuestion);
- assertLUB(bStarNone, cStarStar, aStar);
- assertLUB(bStarNone, cStarNone, aNone);
- }
-
- void test_sharedSuperclass2() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeA);
- var typeC = interfaceTypeStar(C);
-
- var D = class_(name: 'D', superType: typeC);
- var typeD = interfaceTypeStar(D);
-
- _checkLeastUpperBound(typeB, typeD, typeA);
- }
-
- void test_sharedSuperclass3() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeB);
- var typeC = interfaceTypeStar(C);
-
- var D = class_(name: 'D', superType: typeB);
- var typeD = interfaceTypeStar(D);
-
- _checkLeastUpperBound(typeC, typeD, typeB);
- }
-
- void test_sharedSuperclass4() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var A2 = class_(name: 'A2');
- var typeA2 = interfaceTypeStar(A2);
-
- var A3 = class_(name: 'A3');
- var typeA3 = interfaceTypeStar(A3);
-
- var B = class_(name: 'B', superType: typeA, interfaces: [typeA2]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeA, interfaces: [typeA3]);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeA);
- }
-
- void test_sharedSuperinterface1() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', interfaces: [typeA]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', interfaces: [typeA]);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeA);
- }
-
- void test_sharedSuperinterface2() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', interfaces: [typeA]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', interfaces: [typeA]);
- var typeC = interfaceTypeStar(C);
-
- var D = class_(name: 'D', interfaces: [typeC]);
- var typeD = interfaceTypeStar(D);
-
- _checkLeastUpperBound(typeB, typeD, typeA);
- }
-
- void test_sharedSuperinterface3() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', interfaces: [typeA]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', interfaces: [typeB]);
- var typeC = interfaceTypeStar(C);
-
- var D = class_(name: 'D', interfaces: [typeB]);
- var typeD = interfaceTypeStar(D);
-
- _checkLeastUpperBound(typeC, typeD, typeB);
- }
-
- void test_sharedSuperinterface4() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var A2 = class_(name: 'A2');
- var typeA2 = interfaceTypeStar(A2);
-
- var A3 = class_(name: 'A3');
- var typeA3 = interfaceTypeStar(A3);
-
- var B = class_(name: 'B', interfaces: [typeA, typeA2]);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', interfaces: [typeA, typeA3]);
- var typeC = interfaceTypeStar(C);
-
- _checkLeastUpperBound(typeB, typeC, typeA);
- }
-
- void test_twoComparables() {
- _checkLeastUpperBound(stringStar, numStar, objectStar);
- }
-
- void test_typeParam_boundedByParam() {
- var S = typeParameter('S');
- var typeS = typeParameterTypeStar(S);
-
- var T = typeParameter('T', bound: typeS);
- var typeT = typeParameterTypeStar(T);
-
- _checkLeastUpperBound(typeT, typeS, typeS);
- }
-
- void test_typeParam_class_implements_Function_ignored() {
- var A = class_(name: 'A', superType: typeProvider.functionType);
- var T = typeParameter('T', bound: interfaceTypeStar(A));
- _checkLeastUpperBound(typeParameterTypeStar(T),
- functionTypeStar(returnType: voidNone), objectStar);
- }
-
- void test_typeParam_fBounded() {
- var T = typeParameter('Q');
- var A = class_(name: 'A', typeParameters: [T]);
-
- var S = typeParameter('S');
- var typeS = typeParameterTypeStar(S);
- S.bound = interfaceTypeStar(A, typeArguments: [typeS]);
-
- var U = typeParameter('U');
- var typeU = typeParameterTypeStar(U);
- U.bound = interfaceTypeStar(A, typeArguments: [typeU]);
-
- _checkLeastUpperBound(
- typeS,
- typeParameterTypeStar(U),
- interfaceTypeStar(A, typeArguments: [objectStar]),
- );
- }
-
- void test_typeParam_function_bounded() {
- var T = typeParameter('T', bound: typeProvider.functionType);
- _checkLeastUpperBound(
- typeParameterTypeStar(T),
- functionTypeStar(returnType: voidNone),
- typeProvider.functionType,
- );
- }
-
- void test_typeParam_function_noBound() {
- var T = typeParameter('T');
- _checkLeastUpperBound(
- typeParameterTypeStar(T),
- functionTypeStar(returnType: voidNone),
- objectStar,
- );
- }
-
- void test_typeParam_interface_bounded() {
- var A = class_(name: 'A');
- var typeA = interfaceTypeStar(A);
-
- var B = class_(name: 'B', superType: typeA);
- var typeB = interfaceTypeStar(B);
-
- var C = class_(name: 'C', superType: typeA);
- var typeC = interfaceTypeStar(C);
-
- var T = typeParameter('T', bound: typeB);
- var typeT = typeParameterTypeStar(T);
-
- _checkLeastUpperBound(typeT, typeC, typeA);
- }
-
- void test_typeParam_interface_noBound() {
- var T = typeParameter('T');
- var A = class_(name: 'A');
- _checkLeastUpperBound(
- typeParameterTypeStar(T),
- interfaceTypeStar(A),
- objectStar,
- );
- }
-
- void test_typeParameters_contravariant_different() {
- // class A<in T>
- var T = typeParameter('T', variance: Variance.contravariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- // A<int>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
- var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
- _checkLeastUpperBound(aInt, aNum, aInt);
- }
-
- void test_typeParameters_contravariant_same() {
- // class A<in T>
- var T = typeParameter('T', variance: Variance.contravariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
- _checkLeastUpperBound(aNum, aNum, aNum);
- }
-
- void test_typeParameters_covariant_different() {
- // class A<out T>
- var T = typeParameter('T', variance: Variance.covariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- // A<int>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
- var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
- _checkLeastUpperBound(aInt, aNum, aNum);
- }
-
- void test_typeParameters_covariant_same() {
- // class A<out T>
- var T = typeParameter('T', variance: Variance.covariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
- _checkLeastUpperBound(aNum, aNum, aNum);
- }
-
- /// Check least upper bound of the same class with different type parameters.
- void test_typeParameters_different() {
- // class List<int>
- // class List<double>
- var listOfIntType = listStar(intStar);
- var listOfDoubleType = listStar(doubleStar);
- var listOfNum = listStar(numStar);
- _checkLeastUpperBound(listOfIntType, listOfDoubleType, listOfNum);
- }
-
- void test_typeParameters_invariant_object() {
- // class A<inout T>
- var T = typeParameter('T', variance: Variance.invariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- // A<int>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
- var aInt = interfaceTypeStar(A, typeArguments: [intStar]);
-
- _checkLeastUpperBound(aNum, aInt, objectStar);
- }
-
- void test_typeParameters_invariant_same() {
- // class A<inout T>
- var T = typeParameter('T', variance: Variance.invariant);
- var A = class_(name: 'A', typeParameters: [T]);
-
- // A<num>
- var aNum = interfaceTypeStar(A, typeArguments: [numStar]);
-
- _checkLeastUpperBound(aNum, aNum, aNum);
- }
-
- void test_typeParameters_multi_basic() {
- // class Multi<out T, inout U, in V>
- var T = typeParameter('T', variance: Variance.covariant);
- var U = typeParameter('T', variance: Variance.invariant);
- var V = typeParameter('T', variance: Variance.contravariant);
- var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
- // Multi<num, num, num>
- // Multi<int, num, int>
- var multiNumNumNum =
- interfaceTypeStar(Multi, typeArguments: [numStar, numStar, numStar]);
- var multiIntNumInt =
- interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
- // We expect Multi<num, num, int>
- var multiNumNumInt =
- interfaceTypeStar(Multi, typeArguments: [numStar, numStar, intStar]);
-
- _checkLeastUpperBound(multiNumNumNum, multiIntNumInt, multiNumNumInt);
- }
-
- void test_typeParameters_multi_objectInterface() {
- // class Multi<out T, inout U, in V>
- var T = typeParameter('T', variance: Variance.covariant);
- var U = typeParameter('T', variance: Variance.invariant);
- var V = typeParameter('T', variance: Variance.contravariant);
- var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
- // Multi<num, String, num>
- // Multi<int, num, int>
- var multiNumStringNum =
- interfaceTypeStar(Multi, typeArguments: [numStar, stringStar, numStar]);
- var multiIntNumInt =
- interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
- _checkLeastUpperBound(multiNumStringNum, multiIntNumInt, objectStar);
- }
-
- void test_typeParameters_multi_objectType() {
- // class Multi<out T, inout U, in V>
- var T = typeParameter('T', variance: Variance.covariant);
- var U = typeParameter('T', variance: Variance.invariant);
- var V = typeParameter('T', variance: Variance.contravariant);
- var Multi = class_(name: 'A', typeParameters: [T, U, V]);
-
- // Multi<String, num, num>
- // Multi<int, num, int>
- var multiStringNumNum =
- interfaceTypeStar(Multi, typeArguments: [stringStar, numStar, numStar]);
- var multiIntNumInt =
- interfaceTypeStar(Multi, typeArguments: [intStar, numStar, intStar]);
-
- // We expect Multi<Object, num, int>
- var multiObjectNumInt =
- interfaceTypeStar(Multi, typeArguments: [objectStar, numStar, intStar]);
-
- _checkLeastUpperBound(multiStringNumNum, multiIntNumInt, multiObjectNumInt);
- }
-
- void test_typeParameters_same() {
- // List<int>
- // List<int>
- var listOfIntType = listStar(intStar);
- _checkLeastUpperBound(listOfIntType, listOfIntType, listOfIntType);
- }
-
- /// Check least upper bound of two related classes with different
- /// type parameters.
- void test_typeParametersAndClass_different() {
- // class List<int>
- // class Iterable<double>
- var listOfIntType = listStar(intStar);
- var iterableOfDoubleType = iterableStar(doubleStar);
- // TODO(leafp): this should be iterableOfNumType
- _checkLeastUpperBound(listOfIntType, iterableOfDoubleType, objectStar);
- }
-
- void test_void() {
- var T = typeParameter('T');
- var A = class_(name: 'A');
- List<DartType> types = [
- neverStar,
- functionTypeStar(returnType: voidNone),
- interfaceTypeStar(A),
- typeParameterTypeStar(T),
- ];
- for (DartType type in types) {
- _checkLeastUpperBound(
- functionTypeStar(returnType: voidNone),
- functionTypeStar(returnType: type),
- functionTypeStar(returnType: voidNone),
- );
- }
- }
-}
-
@reflectiveTest
class TryPromoteToTest extends AbstractTypeSystemTest {
@override
diff --git a/pkg/analyzer/test/source/error_processor_test.dart b/pkg/analyzer/test/source/error_processor_test.dart
index f3e548d..2a58d77 100644
--- a/pkg/analyzer/test/source/error_processor_test.dart
+++ b/pkg/analyzer/test/source/error_processor_test.dart
@@ -19,7 +19,7 @@
main() {
AnalysisError invalid_assignment = AnalysisError(
- TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+ TestSource(), 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
['x'],
['y']
]);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 031f9e3..2f46907 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1666,7 +1666,7 @@
ResolvedUnitResult result = await driver.getResult(b);
List<AnalysisError> errors = result.errors;
expect(errors, hasLength(1));
- expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT);
+ expect(errors[0].errorCode, CompileTimeErrorCode.INVALID_ASSIGNMENT);
}
}
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
index 3e95b6c..30418ae 100644
--- a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -11,7 +11,7 @@
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../../../generated/elements_types_mixin.dart';
+import '../../../generated/type_system_test.dart';
main() {
defineReflectiveSuite(() {
@@ -20,7 +20,7 @@
}
@reflectiveTest
-class InterfaceLeastUpperBoundHelperTest with ElementsTypesMixin {
+class InterfaceLeastUpperBoundHelperTest extends AbstractTypeSystemTest {
@override
final TestTypeProvider typeProvider = TestTypeProvider();
@@ -535,6 +535,7 @@
}
Set<InstantiatedClass> _superInterfaces(InstantiatedClass type) {
- return InterfaceLeastUpperBoundHelper.computeSuperinterfaceSet(type);
+ var helper = InterfaceLeastUpperBoundHelper(typeSystem);
+ return helper.computeSuperinterfaceSet(type);
}
}
diff --git a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
index 19d5cef..6454cda 100644
--- a/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
+++ b/pkg/analyzer/test/src/dart/element/upper_lower_bound_test.dart
@@ -4,6 +4,7 @@
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/null_safety_understanding_flag.dart';
import 'package:analyzer/dart/element/nullability_suffix.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/type_visitor.dart';
@@ -11,6 +12,7 @@
import 'package:analyzer/src/dart/element/type_schema.dart';
import 'package:analyzer/src/dart/element/type_system.dart';
import 'package:analyzer/src/dart/element/type_visitor.dart';
+import 'package:analyzer/src/dart/resolver/variance.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -20,6 +22,8 @@
defineReflectiveSuite(() {
defineReflectiveTests(BoundsHelperPredicatesTest);
defineReflectiveTests(LowerBoundTest);
+ defineReflectiveTests(UpperBound_FunctionTypes_Test);
+ defineReflectiveTests(UpperBound_InterfaceTypes_Test);
defineReflectiveTests(UpperBoundTest);
});
}
@@ -528,8 +532,8 @@
class LowerBoundTest extends _BoundsTestBase {
test_bottom_any() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isBottom(T2), isFalse, reason: _typeString(T2));
+ _assertBottom(T1);
+ _assertNotBottom(T2);
_checkGreatestLowerBound(T1, T2, T1);
}
@@ -571,8 +575,8 @@
test_bottom_bottom() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isBottom(T2), isTrue, reason: _typeString(T2));
+ _assertBottom(T1);
+ _assertBottom(T2);
_checkGreatestLowerBound(T1, T2, T1);
}
@@ -1097,11 +1101,9 @@
test_null_any() {
void check(DartType T2, DartType expected) {
- var T2_str = _typeString(T2);
-
- expect(typeSystem.isNull(T2), isFalse, reason: 'isNull: $T2_str');
- expect(typeSystem.isTop(T2), isFalse, reason: 'isTop: $T2_str');
- expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+ _assertNotBottom(T2);
+ _assertNotNull(T2);
+ _assertNotTop(T2);
_checkGreatestLowerBound(nullNone, T2, expected);
}
@@ -1143,14 +1145,11 @@
test_null_null() {
void check(DartType T1, DartType T2) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
+ _assertNull(T1);
+ _assertNull(T2);
- expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
- expect(typeSystem.isNull(T2), isTrue, reason: 'isNull: $T2_str');
-
- expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
- expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+ _assertNotBottom(T1);
+ _assertNotBottom(T2);
_checkGreatestLowerBound(T1, T2, T1);
}
@@ -1161,8 +1160,7 @@
test_object_any() {
void check(DartType T2, DartType expected) {
- var T2_str = _typeString(T2);
- expect(typeSystem.isObject(T2), isFalse, reason: 'isObject: $T2_str');
+ _assertNotObject(T2);
_checkGreatestLowerBound(objectNone, T2, expected);
}
@@ -1216,11 +1214,8 @@
test_object_object() {
void check(DartType T1, DartType T2) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
-
- expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
- expect(typeSystem.isObject(T2), isTrue, reason: 'isObject: $T2_str');
+ _assertObject(T1);
+ _assertObject(T2);
_checkGreatestLowerBound(T1, T2, T1);
}
@@ -1309,8 +1304,8 @@
test_top_any() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isTop(T2), isFalse, reason: _typeString(T2));
+ _assertTop(T1);
+ _assertNotTop(T2);
_checkGreatestLowerBound(T1, T2, T2);
}
@@ -1357,8 +1352,8 @@
test_top_top() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isTop(T2), isTrue, reason: _typeString(T2));
+ _assertTop(T1);
+ _assertTop(T2);
_checkGreatestLowerBound(T1, T2, T2);
}
@@ -1455,74 +1450,182 @@
}
@reflectiveTest
-class UpperBoundTest extends _BoundsTestBase {
- test_bottom_any() {
- void check(DartType T1, DartType T2) {
- expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isBottom(T2), isFalse, reason: _typeString(T2));
- _checkLeastUpperBound(T1, T2, T2);
- }
-
- check(neverNone, objectNone);
- check(neverNone, objectStar);
- check(neverNone, objectQuestion);
-
- check(neverNone, intNone);
- check(neverNone, intQuestion);
- check(neverNone, intStar);
-
- check(neverNone, listNone(intNone));
- check(neverNone, listQuestion(intNone));
- check(neverNone, listStar(intNone));
-
- check(neverNone, futureOrNone(intNone));
- check(neverNone, futureOrQuestion(intNone));
- check(neverNone, futureOrStar(intNone));
-
- {
- var T = typeParameterTypeNone(
- typeParameter('T', bound: neverNone),
- );
- check(T, intNone);
- check(T, intQuestion);
- check(T, intStar);
- }
-
- {
- var T = promotedTypeParameterTypeNone(
- typeParameter('T', bound: objectQuestion),
- neverNone,
- );
- check(T, intNone);
- check(T, intQuestion);
- check(T, intStar);
- }
- }
-
- test_bottom_bottom() {
- void check(DartType T1, DartType T2) {
- expect(typeSystem.isBottom(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isBottom(T2), isTrue, reason: _typeString(T2));
- _checkLeastUpperBound(T1, T2, T2);
- }
-
- check(
- neverNone,
- typeParameterTypeNone(
- typeParameter('T', bound: neverNone),
- ),
+class UpperBound_FunctionTypes_Test extends _BoundsTestBase {
+ void test_nested2_upParameterType() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: intNone),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ );
+ expect(
+ _typeString(T1),
+ 'void Function(void Function(String, int, int))',
);
- check(
- neverNone,
- promotedTypeParameterTypeNone(
- typeParameter('T', bound: objectQuestion),
- neverNone,
- ),
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ requiredParameter(type: doubleNone),
+ requiredParameter(type: numNone),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
);
+ expect(
+ _typeString(T2),
+ 'void Function(void Function(int, double, num))',
+ );
+
+ var expected = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: objectNone),
+ requiredParameter(type: numNone),
+ requiredParameter(type: numNone),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ );
+ expect(
+ _typeString(expected),
+ 'void Function(void Function(Object, num, num))',
+ );
+
+ _checkLeastUpperBound(T1, T2, expected);
}
- test_functionType2_parameters_optionalNamed() {
+ void test_nested3_downParameterTypes() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: intNone)
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ );
+ expect(
+ _typeString(T1),
+ 'void Function(void Function(void Function(String, int, int)))',
+ );
+
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ requiredParameter(type: doubleNone),
+ requiredParameter(type: numNone)
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ );
+ expect(
+ _typeString(T2),
+ 'void Function(void Function(void Function(int, double, num)))',
+ );
+
+ var expected = functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(
+ type: functionTypeNone(
+ parameters: [
+ requiredParameter(type: neverNone),
+ requiredParameter(type: neverNone),
+ requiredParameter(type: intNone)
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ ),
+ ),
+ ],
+ returnType: voidNone,
+ );
+ expect(
+ _typeString(expected),
+ 'void Function(void Function(void Function(Never, Never, int)))',
+ );
+
+ _checkLeastUpperBound(T1, T2, expected);
+ }
+
+ void test_parameters_fuzzyArrows() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: dynamicType),
+ ],
+ returnType: voidNone,
+ );
+
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ ],
+ returnType: voidNone,
+ );
+
+ var expected = functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ ],
+ returnType: voidNone,
+ );
+
+ _checkLeastUpperBound(T1, T2, expected);
+ }
+
+ test_parameters_optionalNamed() {
FunctionType build(Map<String, DartType> namedTypes) {
return functionTypeNone(
returnType: voidNone,
@@ -1549,7 +1652,7 @@
check({'a': intNone, 'b': doubleNone}, {'a': intNone}, {'a': intNone});
}
- test_functionType2_parameters_optionalPositional() {
+ test_parameters_optionalPositional() {
FunctionType build(List<DartType> positionalTypes) {
return functionTypeNone(
returnType: voidNone,
@@ -1584,7 +1687,7 @@
);
}
- test_functionType2_parameters_requiredNamed() {
+ test_parameters_requiredNamed() {
_checkLeastUpperBound(
functionTypeNone(
returnType: voidNone,
@@ -1698,7 +1801,7 @@
);
}
- test_functionType2_parameters_requiredPositional() {
+ test_parameters_requiredPositional() {
FunctionType build(List<DartType> requiredTypes) {
return functionTypeNone(
returnType: voidNone,
@@ -1732,7 +1835,28 @@
);
}
- test_functionType2_returnType() {
+ void test_parameters_requiredPositional_differentArity() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ requiredParameter(type: intNone),
+ ],
+ returnType: voidNone,
+ );
+
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: intNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: intNone),
+ ],
+ returnType: voidNone,
+ );
+
+ _checkLeastUpperBound(T1, T2, typeProvider.functionType);
+ }
+
+ test_returnType() {
void check(DartType T1_ret, DartType T2_ret, DartType expected_ret) {
_checkLeastUpperBound(
functionTypeNone(returnType: T1_ret),
@@ -1753,7 +1877,75 @@
check(intNone, neverNone, intNone);
}
- test_functionType2_typeParameters() {
+ void test_sameType_withNamed() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ namedParameter(name: 'n', type: numNone),
+ ],
+ returnType: intNone,
+ );
+
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ namedParameter(name: 'n', type: numNone),
+ ],
+ returnType: intNone,
+ );
+
+ var expected = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ namedParameter(name: 'n', type: numNone),
+ ],
+ returnType: intNone,
+ );
+
+ _checkLeastUpperBound(T1, T2, expected);
+ }
+
+ void test_sameType_withOptional() {
+ var T1 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ positionalParameter(type: doubleNone),
+ ],
+ returnType: intNone,
+ );
+
+ var T2 = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ positionalParameter(type: doubleNone),
+ ],
+ returnType: intNone,
+ );
+
+ var expected = functionTypeNone(
+ parameters: [
+ requiredParameter(type: stringNone),
+ requiredParameter(type: intNone),
+ requiredParameter(type: numNone),
+ positionalParameter(type: doubleNone),
+ ],
+ returnType: intNone,
+ );
+
+ _checkLeastUpperBound(T1, T2, expected);
+ }
+
+ test_typeParameters() {
void check(FunctionType T1, FunctionType T2, DartType expected) {
_assertNullabilityNone(T1);
_assertNullabilityNone(T2);
@@ -1808,6 +2000,559 @@
);
}
}
+}
+
+@reflectiveTest
+class UpperBound_InterfaceTypes_Test extends _BoundsTestBase {
+ test_directInterface() {
+ // class A
+ // class B implements A
+ // class C implements B
+
+ var A = class_(name: 'A');
+ var typeA = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [typeA]);
+ var typeB = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', interfaces: [typeB]);
+ var typeC = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(typeB, typeC, typeB);
+ }
+
+ test_directInterface_legacy() {
+ typeSystem = analysisContext.typeSystemLegacy;
+
+ // (null safe) class A<T> {}
+ // (legacy) class B implements A<int> {}
+ // (null safe) class C implements A<int> {}
+
+ var A = class_(
+ name: 'A',
+ typeParameters: [typeParameter('T')],
+ );
+
+ var B = class_(
+ name: 'B',
+ interfaces: [
+ interfaceTypeStar(A, typeArguments: [intStar])
+ ],
+ );
+
+ var C = class_(
+ name: 'C',
+ interfaces: [
+ interfaceTypeNone(A, typeArguments: [intNone])
+ ],
+ );
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(B),
+ interfaceTypeNone(C),
+ interfaceTypeNone(A, typeArguments: [intStar]),
+ );
+ }
+
+ test_directSuperclass() {
+ // class A
+ // class B extends A
+ // class C extends B
+
+ var A = class_(name: 'A');
+ var typeA = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', superType: typeA);
+ var typeB = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: typeB);
+ var typeC = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(typeB, typeC, typeB);
+ }
+
+ void test_directSuperclass_nullability() {
+ var aElement = class_(name: 'A');
+ var aQuestion = interfaceTypeQuestion(aElement);
+ var aStar = interfaceTypeStar(aElement);
+ var aNone = interfaceTypeNone(aElement);
+
+ var bElementStar = class_(name: 'B', superType: aStar);
+ var bElementNone = class_(name: 'B', superType: aNone);
+
+ InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
+ return interfaceType(
+ bElementStar,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
+ return interfaceType(
+ bElementNone,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ var bStarQuestion = _bTypeStarElement(NullabilitySuffix.question);
+ var bStarStar = _bTypeStarElement(NullabilitySuffix.star);
+ var bStarNone = _bTypeStarElement(NullabilitySuffix.none);
+
+ var bNoneQuestion = _bTypeNoneElement(NullabilitySuffix.question);
+ var bNoneStar = _bTypeNoneElement(NullabilitySuffix.star);
+ var bNoneNone = _bTypeNoneElement(NullabilitySuffix.none);
+
+ void assertLUB(DartType type1, DartType type2, DartType expected) {
+ expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+ expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+ }
+
+ assertLUB(bStarQuestion, aQuestion, aQuestion);
+ assertLUB(bStarQuestion, aStar, aQuestion);
+ assertLUB(bStarQuestion, aNone, aQuestion);
+
+ assertLUB(bStarStar, aQuestion, aQuestion);
+ assertLUB(bStarStar, aStar, aStar);
+ assertLUB(bStarStar, aNone, aStar);
+
+ assertLUB(bStarNone, aQuestion, aQuestion);
+ assertLUB(bStarNone, aStar, aStar);
+ assertLUB(bStarNone, aNone, aNone);
+
+ assertLUB(bNoneQuestion, aQuestion, aQuestion);
+ assertLUB(bNoneQuestion, aStar, aQuestion);
+ assertLUB(bNoneQuestion, aNone, aQuestion);
+
+ assertLUB(bNoneStar, aQuestion, aQuestion);
+ assertLUB(bNoneStar, aStar, aStar);
+ assertLUB(bNoneStar, aNone, aStar);
+
+ assertLUB(bNoneNone, aQuestion, aQuestion);
+ assertLUB(bNoneNone, aStar, aStar);
+ assertLUB(bNoneNone, aNone, aNone);
+ }
+
+ void test_implementationsOfComparable() {
+ _checkLeastUpperBound(stringNone, numNone, objectNone);
+ }
+
+ void test_mixinAndClass_constraintAndInterface() {
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [A_none]);
+ var M = mixin_(name: 'M', constraints: [A_none]);
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(B),
+ interfaceTypeNone(M),
+ A_none,
+ );
+ }
+
+ void test_mixinAndClass_object() {
+ var A = class_(name: 'A');
+ var M = mixin_(name: 'M');
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(A),
+ interfaceTypeNone(M),
+ objectNone,
+ );
+ }
+
+ void test_mixinAndClass_sharedInterface() {
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [A_none]);
+ var M = mixin_(name: 'M', interfaces: [A_none]);
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(B),
+ interfaceTypeNone(M),
+ A_none,
+ );
+ }
+
+ void test_sameElement_nullability() {
+ var aElement = class_(name: 'A');
+
+ var aQuestion = interfaceTypeQuestion(aElement);
+ var aStar = interfaceTypeStar(aElement);
+ var aNone = interfaceTypeNone(aElement);
+
+ void assertLUB(DartType type1, DartType type2, DartType expected) {
+ expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+ expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+ }
+
+ assertLUB(aQuestion, aQuestion, aQuestion);
+ assertLUB(aQuestion, aStar, aQuestion);
+ assertLUB(aQuestion, aNone, aQuestion);
+
+ assertLUB(aStar, aQuestion, aQuestion);
+ assertLUB(aStar, aStar, aStar);
+ assertLUB(aStar, aNone, aStar);
+
+ assertLUB(aNone, aQuestion, aQuestion);
+ assertLUB(aNone, aStar, aStar);
+ assertLUB(aNone, aNone, aNone);
+ }
+
+ void test_sharedSuperclass1() {
+ // class A {}
+ // class B extends A {}
+ // class C extends A {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', superType: A_none);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: A_none);
+ var C_none = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(B_none, C_none, A_none);
+ }
+
+ void test_sharedSuperclass1_nullability() {
+ var aElement = class_(name: 'A');
+ var aQuestion = interfaceTypeQuestion(aElement);
+ var aStar = interfaceTypeStar(aElement);
+ var aNone = interfaceTypeNone(aElement);
+
+ var bElementNone = class_(name: 'B', superType: aNone);
+ var bElementStar = class_(name: 'B', superType: aStar);
+
+ var cElementNone = class_(name: 'C', superType: aNone);
+ var cElementStar = class_(name: 'C', superType: aStar);
+
+ InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
+ return interfaceType(
+ bElementNone,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
+ return interfaceType(
+ bElementStar,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ var bNoneQuestion = bTypeElementNone(NullabilitySuffix.question);
+ var bNoneStar = bTypeElementNone(NullabilitySuffix.star);
+ var bNoneNone = bTypeElementNone(NullabilitySuffix.none);
+
+ var bStarQuestion = bTypeElementStar(NullabilitySuffix.question);
+ var bStarStar = bTypeElementStar(NullabilitySuffix.star);
+ var bStarNone = bTypeElementStar(NullabilitySuffix.none);
+
+ InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
+ return interfaceType(
+ cElementNone,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
+ return interfaceType(
+ cElementStar,
+ nullabilitySuffix: nullability,
+ );
+ }
+
+ var cNoneQuestion = cTypeElementNone(NullabilitySuffix.question);
+ var cNoneStar = cTypeElementNone(NullabilitySuffix.star);
+ var cNoneNone = cTypeElementNone(NullabilitySuffix.none);
+
+ var cStarQuestion = cTypeElementStar(NullabilitySuffix.question);
+ var cStarStar = cTypeElementStar(NullabilitySuffix.star);
+ var cStarNone = cTypeElementStar(NullabilitySuffix.none);
+
+ void assertLUB(DartType type1, DartType type2, DartType expected) {
+ expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+ expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+ }
+
+ assertLUB(bNoneQuestion, cNoneQuestion, aQuestion);
+ assertLUB(bNoneQuestion, cNoneStar, aQuestion);
+ assertLUB(bNoneQuestion, cNoneNone, aQuestion);
+ assertLUB(bNoneQuestion, cStarQuestion, aQuestion);
+ assertLUB(bNoneQuestion, cStarStar, aQuestion);
+ assertLUB(bNoneQuestion, cStarNone, aQuestion);
+
+ assertLUB(bNoneStar, cNoneQuestion, aQuestion);
+ assertLUB(bNoneStar, cNoneStar, aStar);
+ assertLUB(bNoneStar, cNoneNone, aStar);
+ assertLUB(bNoneStar, cStarQuestion, aQuestion);
+ assertLUB(bNoneStar, cStarStar, aStar);
+ assertLUB(bNoneStar, cStarNone, aStar);
+
+ assertLUB(bNoneNone, cNoneQuestion, aQuestion);
+ assertLUB(bNoneNone, cNoneStar, aStar);
+ assertLUB(bNoneNone, cNoneNone, aNone);
+ assertLUB(bNoneNone, cStarQuestion, aQuestion);
+ assertLUB(bNoneNone, cStarStar, aStar);
+ assertLUB(bNoneNone, cStarNone, aNone);
+
+ assertLUB(bStarQuestion, cNoneQuestion, aQuestion);
+ assertLUB(bStarQuestion, cNoneStar, aQuestion);
+ assertLUB(bStarQuestion, cNoneNone, aQuestion);
+ assertLUB(bStarQuestion, cStarQuestion, aQuestion);
+ assertLUB(bStarQuestion, cStarStar, aQuestion);
+ assertLUB(bStarQuestion, cStarNone, aQuestion);
+
+ assertLUB(bStarStar, cNoneQuestion, aQuestion);
+ assertLUB(bStarStar, cNoneStar, aStar);
+ assertLUB(bStarStar, cNoneNone, aStar);
+ assertLUB(bStarStar, cStarQuestion, aQuestion);
+ assertLUB(bStarStar, cStarStar, aStar);
+ assertLUB(bStarStar, cStarNone, aStar);
+
+ assertLUB(bStarNone, cNoneQuestion, aQuestion);
+ assertLUB(bStarNone, cNoneStar, aStar);
+ assertLUB(bStarNone, cNoneNone, aNone);
+ assertLUB(bStarNone, cStarQuestion, aQuestion);
+ assertLUB(bStarNone, cStarStar, aStar);
+ assertLUB(bStarNone, cStarNone, aNone);
+ }
+
+ void test_sharedSuperclass2() {
+ // class A {}
+ // class B extends A {}
+ // class C extends A {}
+ // class D extends C {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', superType: A_none);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: A_none);
+ var C_none = interfaceTypeNone(C);
+
+ var D = class_(name: 'D', superType: C_none);
+ var D_none = interfaceTypeNone(D);
+
+ _checkLeastUpperBound(B_none, D_none, A_none);
+ }
+
+ void test_sharedSuperclass3() {
+ // class A {}
+ // class B extends A {}
+ // class C extends B {}
+ // class D extends B {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', superType: A_none);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: B_none);
+ var C_none = interfaceTypeNone(C);
+
+ var D = class_(name: 'D', superType: B_none);
+ var D_none = interfaceTypeNone(D);
+
+ _checkLeastUpperBound(C_none, D_none, B_none);
+ }
+
+ void test_sharedSuperclass4() {
+ // class A {}
+ // class A2 {}
+ // class A3 {}
+ // class B extends A implements A2 {}
+ // class C extends A implement A3 {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var A2 = class_(name: 'A2');
+ var A2_none = interfaceTypeNone(A2);
+
+ var A3 = class_(name: 'A3');
+ var A3_none = interfaceTypeNone(A3);
+
+ var B = class_(name: 'B', superType: A_none, interfaces: [A2_none]);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: A_none, interfaces: [A3_none]);
+ var C_none = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(B_none, C_none, A_none);
+ }
+
+ void test_sharedSuperinterface1() {
+ // class A {}
+ // class B implements A {}
+ // class C implements A {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [A_none]);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', interfaces: [A_none]);
+ var C_none = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(B_none, C_none, A_none);
+ }
+
+ void test_sharedSuperinterface2() {
+ // class A {}
+ // class B implements A {}
+ // class C implements A {}
+ // class D implements C {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [A_none]);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', interfaces: [A_none]);
+ var C_none = interfaceTypeNone(C);
+
+ var D = class_(name: 'D', interfaces: [C_none]);
+ var D_none = interfaceTypeNone(D);
+
+ _checkLeastUpperBound(B_none, D_none, A_none);
+ }
+
+ void test_sharedSuperinterface3() {
+ // class A {}
+ // class B implements A {}
+ // class C implements B {}
+ // class D implements B {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', interfaces: [A_none]);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', interfaces: [B_none]);
+ var C_none = interfaceTypeNone(C);
+
+ var D = class_(name: 'D', interfaces: [B_none]);
+ var D_none = interfaceTypeNone(D);
+
+ _checkLeastUpperBound(C_none, D_none, B_none);
+ }
+
+ void test_sharedSuperinterface4() {
+ // class A {}
+ // class A2 {}
+ // class A3 {}
+ // class B implements A, A2 {}
+ // class C implements A, A3 {}
+
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var A2 = class_(name: 'A2');
+ var A2_none = interfaceTypeNone(A2);
+
+ var A3 = class_(name: 'A3');
+ var A3_none = interfaceTypeNone(A3);
+
+ var B = class_(name: 'B', interfaces: [A_none, A2_none]);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', interfaces: [A_none, A3_none]);
+ var C_none = interfaceTypeNone(C);
+
+ _checkLeastUpperBound(B_none, C_none, A_none);
+ }
+}
+
+@reflectiveTest
+class UpperBoundTest extends _BoundsTestBase {
+ test_bottom_any() {
+ void check(DartType T1, DartType T2) {
+ _assertBottom(T1);
+ _assertNotBottom(T2);
+ _checkLeastUpperBound(T1, T2, T2);
+ }
+
+ check(neverNone, dynamicNone);
+
+ check(neverNone, objectNone);
+ check(neverNone, objectStar);
+ check(neverNone, objectQuestion);
+
+ check(neverNone, intNone);
+ check(neverNone, intQuestion);
+ check(neverNone, intStar);
+
+ check(neverNone, listNone(intNone));
+ check(neverNone, listQuestion(intNone));
+ check(neverNone, listStar(intNone));
+
+ check(neverNone, futureOrNone(intNone));
+ check(neverNone, futureOrQuestion(intNone));
+ check(neverNone, futureOrStar(intNone));
+
+ check(neverNone, functionTypeNone(returnType: voidNone));
+ check(neverNone, functionTypeQuestion(returnType: voidNone));
+ check(neverNone, functionTypeStar(returnType: voidNone));
+
+ {
+ var T = typeParameter('T');
+ check(neverNone, typeParameterTypeNone(T));
+ check(neverNone, typeParameterTypeQuestion(T));
+ check(neverNone, typeParameterTypeStar(T));
+ }
+
+ {
+ var T = typeParameterTypeNone(
+ typeParameter('T', bound: neverNone),
+ );
+ check(T, intNone);
+ check(T, intQuestion);
+ check(T, intStar);
+ }
+
+ {
+ var T = promotedTypeParameterTypeNone(
+ typeParameter('T', bound: objectQuestion),
+ neverNone,
+ );
+ check(T, intNone);
+ check(T, intQuestion);
+ check(T, intStar);
+ }
+ }
+
+ test_bottom_bottom() {
+ void check(DartType T1, DartType T2) {
+ _assertBottom(T1);
+ _assertBottom(T2);
+ _checkLeastUpperBound(T1, T2, T2);
+ }
+
+ check(
+ neverNone,
+ typeParameterTypeNone(
+ typeParameter('T', bound: neverNone),
+ ),
+ );
+
+ check(
+ neverNone,
+ promotedTypeParameterTypeNone(
+ typeParameter('T', bound: objectQuestion),
+ neverNone,
+ ),
+ );
+ }
test_functionType_interfaceType() {
void check(FunctionType T1, InterfaceType T2, InterfaceType expected) {
@@ -1860,6 +2605,16 @@
check(listNone(intNone));
}
+ void test_interfaceType_functionType() {
+ var A = class_(name: 'A');
+
+ _checkLeastUpperBound(
+ interfaceTypeNone(A),
+ functionTypeNone(returnType: voidNone),
+ objectNone,
+ );
+ }
+
test_none_question() {
void check(DartType T1, DartType T2, DartType expected) {
_assertNullabilityNone(T1);
@@ -1894,17 +2649,14 @@
test_null_any() {
void check(DartType T1, DartType T2, DartType expected) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
+ _assertNull(T1);
+ _assertNotNull(T2);
- expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
- expect(typeSystem.isNull(T2), isFalse, reason: 'isNull: $T2_str');
+ _assertNotTop(T1);
+ _assertNotTop(T2);
- expect(typeSystem.isTop(T1), isFalse, reason: 'isTop: $T1_str');
- expect(typeSystem.isTop(T2), isFalse, reason: 'isTop: $T2_str');
-
- expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
- expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+ _assertNotBottom(T1);
+ _assertNotBottom(T2);
_checkLeastUpperBound(T1, T2, expected);
}
@@ -1943,14 +2695,11 @@
test_null_null() {
void check(DartType T1, DartType T2) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
+ _assertNull(T1);
+ _assertNull(T2);
- expect(typeSystem.isNull(T1), isTrue, reason: 'isNull: $T1_str');
- expect(typeSystem.isNull(T2), isTrue, reason: 'isNull: $T2_str');
-
- expect(typeSystem.isBottom(T1), isFalse, reason: 'isBottom: $T1_str');
- expect(typeSystem.isBottom(T2), isFalse, reason: 'isBottom: $T2_str');
+ _assertNotBottom(T1);
+ _assertNotBottom(T2);
_checkLeastUpperBound(T1, T2, T2);
}
@@ -1961,11 +2710,8 @@
test_object_any() {
void check(DartType T1, DartType T2, DartType expected) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
-
- expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
- expect(typeSystem.isObject(T2), isFalse, reason: 'isObject: $T2_str');
+ _assertObject(T1);
+ _assertNotObject(T2);
_checkLeastUpperBound(T1, T2, expected);
}
@@ -1983,11 +2729,8 @@
test_object_object() {
void check(DartType T1, DartType T2) {
- var T1_str = _typeString(T1);
- var T2_str = _typeString(T2);
-
- expect(typeSystem.isObject(T1), isTrue, reason: 'isObject: $T1_str');
- expect(typeSystem.isObject(T2), isTrue, reason: 'isObject: $T2_str');
+ _assertObject(T1);
+ _assertObject(T2);
_checkLeastUpperBound(T1, T2, T2);
}
@@ -2052,48 +2795,42 @@
test_top_any() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isTop(T2), isFalse, reason: _typeString(T2));
+ _assertTop(T1);
+ _assertNotTop(T2);
_checkLeastUpperBound(T1, T2, T1);
}
- check(voidNone, objectNone);
- check(voidNone, intNone);
- check(voidNone, intQuestion);
- check(voidNone, intStar);
- check(voidNone, listNone(intNone));
- check(voidNone, futureOrNone(intNone));
+ void check2(DartType T1) {
+ check(T1, objectNone);
+ check(T1, intNone);
+ check(T1, intQuestion);
+ check(T1, intStar);
+ check(T1, listNone(intNone));
+ check(T1, futureOrNone(intNone));
+ check(T1, functionTypeNone(returnType: voidNone));
- check(dynamicNone, objectNone);
- check(dynamicNone, intNone);
- check(dynamicNone, intQuestion);
- check(dynamicNone, intStar);
- check(dynamicNone, listNone(intNone));
- check(dynamicNone, futureOrNone(intNone));
+ {
+ var T = typeParameter('T');
+ check(T1, typeParameterTypeNone(T));
+ check(T1, typeParameterTypeQuestion(T));
+ check(T1, typeParameterTypeStar(T));
+ }
+ }
- check(objectQuestion, objectNone);
- check(objectQuestion, intNone);
- check(objectQuestion, intQuestion);
- check(objectQuestion, intStar);
- check(objectQuestion, listNone(intNone));
- check(objectQuestion, futureOrNone(intNone));
+ check2(voidNone);
+ check2(dynamicNone);
+ check2(objectQuestion);
+ check2(objectStar);
- check(objectStar, objectNone);
- check(objectStar, intNone);
- check(objectStar, intQuestion);
- check(objectStar, intStar);
- check(objectStar, listNone(intNone));
- check(objectStar, futureOrNone(intNone));
-
- check(futureOrNone(voidNone), intNone);
- check(futureOrQuestion(voidNone), intNone);
- check(futureOrStar(voidNone), intNone);
+ check2(futureOrNone(voidNone));
+ check2(futureOrQuestion(voidNone));
+ check2(futureOrStar(voidNone));
}
test_top_top() {
void check(DartType T1, DartType T2) {
- expect(typeSystem.isTop(T1), isTrue, reason: _typeString(T1));
- expect(typeSystem.isTop(T2), isTrue, reason: _typeString(T2));
+ _assertTop(T1);
+ _assertTop(T2);
_checkLeastUpperBound(T1, T2, T1);
}
@@ -2188,32 +2925,246 @@
}
}
- void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
- var expectedStr = _typeString(expected);
+ void test_typeParameter_fBounded() {
+ // class A<T> {}
+ var T = typeParameter('T');
+ var A = class_(name: 'A', typeParameters: [T]);
- var result = typeSystem.getLeastUpperBound(T1, T2);
- var resultStr = _typeString(result);
- expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
+ // <S extends A<S>>
+ var S = typeParameter('S');
+ var S_none = typeParameterTypeNone(S);
+ S.bound = interfaceTypeNone(A, typeArguments: [S_none]);
- // Check that the result is an upper bound.
- expect(typeSystem.isSubtypeOf2(T1, result), true);
- expect(typeSystem.isSubtypeOf2(T2, result), true);
+ // <U extends A<U>>
+ var U = typeParameter('U');
+ var U_none = typeParameterTypeNone(U);
+ U.bound = interfaceTypeNone(A, typeArguments: [U_none]);
- // Check for symmetry.
- result = typeSystem.getLeastUpperBound(T2, T1);
- resultStr = _typeString(result);
- expect(result, expected, reason: '''
-expected: $expectedStr
-actual: $resultStr
-''');
+ _checkLeastUpperBound(
+ S_none,
+ typeParameterTypeNone(U),
+ interfaceTypeNone(A, typeArguments: [objectNone]),
+ );
+ }
+
+ void test_typeParameter_function_bounded() {
+ var T = typeParameter('T', bound: typeProvider.functionType);
+
+ _checkLeastUpperBound(
+ typeParameterTypeNone(T),
+ functionTypeNone(returnType: voidNone),
+ typeProvider.functionType,
+ );
+ }
+
+ void test_typeParameter_function_noBound() {
+ var T = typeParameter('T', bound: objectQuestion);
+
+ _checkLeastUpperBound(
+ typeParameterTypeNone(T),
+ functionTypeNone(returnType: voidNone),
+ objectQuestion,
+ );
+ }
+
+ void test_typeParameter_interface_bounded() {
+ var A = class_(name: 'A');
+ var A_none = interfaceTypeNone(A);
+
+ var B = class_(name: 'B', superType: A_none);
+ var B_none = interfaceTypeNone(B);
+
+ var C = class_(name: 'C', superType: A_none);
+ var C_none = interfaceTypeNone(C);
+
+ var T = typeParameter('T', bound: B_none);
+ var typeT = typeParameterTypeNone(T);
+
+ _checkLeastUpperBound(typeT, C_none, A_none);
+ }
+
+ void test_typeParameter_interface_noBound() {
+ var T = typeParameter('T', bound: objectQuestion);
+
+ var A = class_(name: 'A');
+
+ _checkLeastUpperBound(
+ typeParameterTypeNone(T),
+ interfaceTypeNone(A),
+ objectQuestion,
+ );
+ }
+
+ void test_typeParameters_contravariant_different() {
+ // class A<in T>
+ var T = typeParameter('T', variance: Variance.contravariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ // A<int>
+ var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+ var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+ _checkLeastUpperBound(A_int, A_num, A_int);
+ }
+
+ void test_typeParameters_contravariant_same() {
+ // class A<in T>
+ var T = typeParameter('T', variance: Variance.contravariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+
+ _checkLeastUpperBound(A_num, A_num, A_num);
+ }
+
+ void test_typeParameters_covariant_different() {
+ // class A<out T>
+ var T = typeParameter('T', variance: Variance.covariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ // A<int>
+ var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+ var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+ _checkLeastUpperBound(A_int, A_num, A_num);
+ }
+
+ void test_typeParameters_covariant_same() {
+ // class A<out T>
+ var T = typeParameter('T', variance: Variance.covariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ var A_num = interfaceTypeStar(A, typeArguments: [numNone]);
+
+ _checkLeastUpperBound(A_num, A_num, A_num);
+ }
+
+ void test_typeParameters_invariant_object() {
+ // class A<inout T>
+ var T = typeParameter('T', variance: Variance.invariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ // A<int>
+ var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+ var A_int = interfaceTypeNone(A, typeArguments: [intNone]);
+
+ _checkLeastUpperBound(A_num, A_int, objectNone);
+ }
+
+ void test_typeParameters_invariant_same() {
+ // class A<inout T>
+ var T = typeParameter('T', variance: Variance.invariant);
+ var A = class_(name: 'A', typeParameters: [T]);
+
+ // A<num>
+ var A_num = interfaceTypeNone(A, typeArguments: [numNone]);
+
+ _checkLeastUpperBound(A_num, A_num, A_num);
+ }
+
+ void test_typeParameters_multi_basic() {
+ // class A<out T, inout U, in V>
+ var T = typeParameter('T', variance: Variance.covariant);
+ var U = typeParameter('T', variance: Variance.invariant);
+ var V = typeParameter('T', variance: Variance.contravariant);
+ var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+ // A<num, num, num>
+ // A<int, num, int>
+ var A_num_num_num = interfaceTypeNone(
+ A,
+ typeArguments: [numNone, numNone, numNone],
+ );
+ var A_num_int_num = interfaceTypeNone(
+ A,
+ typeArguments: [intNone, numNone, intNone],
+ );
+
+ // We expect A<num, num, int>
+ var A_num_num_int = interfaceTypeNone(
+ A,
+ typeArguments: [numNone, numNone, intNone],
+ );
+
+ _checkLeastUpperBound(A_num_num_num, A_num_int_num, A_num_num_int);
+ }
+
+ void test_typeParameters_multi_objectInterface() {
+ // class A<out T, inout U, in V>
+ var T = typeParameter('T', variance: Variance.covariant);
+ var U = typeParameter('T', variance: Variance.invariant);
+ var V = typeParameter('T', variance: Variance.contravariant);
+ var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+ // A<num, String, num>
+ // A<int, num, int>
+ var A_num_String_num = interfaceTypeNone(
+ A,
+ typeArguments: [numNone, stringNone, numNone],
+ );
+ var A_int_num_int = interfaceTypeNone(
+ A,
+ typeArguments: [intNone, numNone, intNone],
+ );
+
+ _checkLeastUpperBound(A_num_String_num, A_int_num_int, objectNone);
+ }
+
+ void test_typeParameters_multi_objectType() {
+ // class A<out T, inout U, in V>
+ var T = typeParameter('T', variance: Variance.covariant);
+ var U = typeParameter('T', variance: Variance.invariant);
+ var V = typeParameter('T', variance: Variance.contravariant);
+ var A = class_(name: 'A', typeParameters: [T, U, V]);
+
+ // A<String, num, num>
+ // A<int, num, int>
+ var A_String_num_num = interfaceTypeNone(
+ A,
+ typeArguments: [stringNone, numNone, numNone],
+ );
+ var A_int_num_int = interfaceTypeNone(
+ A,
+ typeArguments: [intNone, numNone, intNone],
+ );
+
+ // We expect A<Object, num, int>
+ var A_Object_num_int = interfaceTypeNone(
+ A,
+ typeArguments: [objectNone, numNone, intNone],
+ );
+
+ _checkLeastUpperBound(A_String_num_num, A_int_num_int, A_Object_num_int);
+ }
+
+ /// Check least upper bound of the same class with different type parameters.
+ void test_typeParameters_noVariance_different() {
+ _checkLeastUpperBound(
+ listNone(intNone),
+ listNone(doubleNone),
+ listNone(numNone),
+ );
+ }
+
+ void test_typeParameters_noVariance_same() {
+ var listOfInt = listNone(intNone);
+ _checkLeastUpperBound(listOfInt, listOfInt, listOfInt);
}
}
@reflectiveTest
class _BoundsTestBase extends AbstractTypeSystemNullSafetyTest {
+ void _assertBottom(DartType type) {
+ if (!typeSystem.isBottom(type)) {
+ fail('isBottom must be true: ' + _typeString(type));
+ }
+ }
+
void _assertNotBottom(DartType type) {
if (typeSystem.isBottom(type)) {
fail('isBottom must be false: ' + _typeString(type));
@@ -2245,6 +3196,12 @@
}
}
+ void _assertNull(DartType type) {
+ if (!typeSystem.isNull(type)) {
+ fail('isNull must be true: ' + _typeString(type));
+ }
+ }
+
void _assertNullability(DartType type, NullabilitySuffix expected) {
if (type.nullabilitySuffix != expected) {
fail('Expected $expected in ' + _typeString(type));
@@ -2263,6 +3220,43 @@
_assertNullability(type, NullabilitySuffix.star);
}
+ void _assertObject(DartType type) {
+ if (!typeSystem.isObject(type)) {
+ fail('isObject must be true: ' + _typeString(type));
+ }
+ }
+
+ void _assertTop(DartType type) {
+ if (!typeSystem.isTop(type)) {
+ fail('isTop must be true: ' + _typeString(type));
+ }
+ }
+
+ void _checkLeastUpperBound(DartType T1, DartType T2, DartType expected) {
+ NullSafetyUnderstandingFlag.enableNullSafetyTypes(() async {
+ var expectedStr = _typeString(expected);
+
+ var result = typeSystem.getLeastUpperBound(T1, T2);
+ var resultStr = _typeString(result);
+ expect(result, expected, reason: '''
+expected: $expectedStr
+actual: $resultStr
+''');
+
+ // Check that the result is an upper bound.
+ expect(typeSystem.isSubtypeOf2(T1, result), true);
+ expect(typeSystem.isSubtypeOf2(T2, result), true);
+
+ // Check for symmetry.
+ result = typeSystem.getLeastUpperBound(T2, T1);
+ resultStr = _typeString(result);
+ expect(result, expected, reason: '''
+expected: $expectedStr
+actual: $resultStr
+''');
+ });
+ }
+
String _typeParametersStr(TypeImpl type) {
var typeStr = '';
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 0053393..eb8b108 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -152,7 +152,7 @@
num a = 0;
int b = a;
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
]);
}
@@ -167,7 +167,7 @@
num a = 0;
int b = a;
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
]);
}
@@ -184,7 +184,7 @@
num a = 0;
int b = a;
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
]);
}
@@ -383,7 +383,7 @@
num a = 0;
int b = a;
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
]);
// Implicit casts are enabled in 'bbb'.
@@ -398,7 +398,7 @@
num a = 0;
int b = a;
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 19, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 19, 1),
]);
}
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index 531f4b1..4b8a397 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -153,10 +153,10 @@
i %= 1.2;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 33, 3),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 45, 3),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 57, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 33, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 45, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 57, 3),
]);
assertType(findNode.assignment('+='), 'double');
assertType(findNode.assignment('-='), 'double');
@@ -187,7 +187,7 @@
a ??= b;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 32, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 32, 1),
]);
assertType(findNode.assignment('??='), 'num');
}
diff --git a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
index d8216d2..9bb1581 100644
--- a/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/ast_rewrite_test.dart
@@ -138,7 +138,7 @@
prefix.A.named<int>(0);
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
50, 5),
]);
@@ -220,7 +220,7 @@
A.named<int, String>(0);
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
52, 13),
]);
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 891e684..3b4f1a2 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -681,7 +681,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_GETTER, 58, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_GETTER, 58, 1),
]);
}
@@ -694,7 +694,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 56, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 56, 1),
]);
}
@@ -707,7 +707,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 1),
]);
}
@@ -720,8 +720,8 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
- error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 7),
]);
}
@@ -734,7 +734,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 70, 11),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 70, 11),
]);
}
@@ -747,7 +747,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 71, 7),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_OPERATOR, 71, 7),
]);
}
@@ -760,7 +760,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_SETTER, 49, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_SETTER, 49, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 191d6c2..b4414b36 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -149,7 +149,7 @@
c.a;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
]);
}
@@ -167,7 +167,7 @@
c.a;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
]);
}
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
index 1ae8a7d..35e383a 100644
--- a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -122,7 +122,7 @@
''', [
error(ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE, 13, 1),
error(ParserErrorCode.EXPECTED_TYPE_NAME, 15, 1),
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 33, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 33, 1),
]);
}
@@ -137,7 +137,7 @@
p.F.a;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 1),
]);
}
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index 5091559..85e42d9 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -19,7 +19,7 @@
await assertErrorsInCode(r'''
final foo = Map<int>();
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 12, 8),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 12, 8),
]);
var creation = findNode.instanceCreation('Map<int>');
@@ -42,7 +42,7 @@
new Foo.bar<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
53, 5),
]);
@@ -70,7 +70,7 @@
new p.Foo.bar<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
44, 3),
]);
@@ -97,7 +97,7 @@
Foo.bar<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
49, 5),
]);
@@ -129,7 +129,7 @@
p.Foo.bar<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
43, 5),
]);
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 35c029e..513338a 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -78,7 +78,7 @@
a.foo(0);
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 57, 3),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 57, 3),
]);
assertMethodInvocation2(
findNode.methodInvocation('a.foo(0)'),
@@ -99,7 +99,7 @@
c();
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 51, 1),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 51, 1),
]);
var invocation = findNode.functionExpressionInvocation('c();');
@@ -119,7 +119,7 @@
foo();
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 25, 3),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 25, 3),
]);
var invocation = findNode.functionExpressionInvocation('foo();');
@@ -265,7 +265,7 @@
C.foo();
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 42, 5),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 42, 5),
]);
var invocation = findNode.functionExpressionInvocation('foo();');
@@ -289,7 +289,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 46, 3),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 46, 3),
]);
var invocation = findNode.functionExpressionInvocation('foo();');
@@ -314,7 +314,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 68, 9),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 68, 9),
]);
var invocation = findNode.functionExpressionInvocation('foo();');
@@ -401,7 +401,7 @@
foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 11, 3),
+ error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 11, 3),
]);
_assertUnresolvedMethodInvocation('foo(0)');
}
@@ -414,7 +414,7 @@
math.foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_FUNCTION, 45, 3),
+ error(CompileTimeErrorCode.UNDEFINED_FUNCTION, 45, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -437,7 +437,7 @@
C.foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 24, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -451,7 +451,7 @@
C.foo(x);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 32, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 32, 3),
]);
_assertUnresolvedMethodInvocation('foo(x);');
@@ -470,7 +470,7 @@
C.foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 76, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 76, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -483,7 +483,7 @@
C.foo<int>();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
]);
_assertUnresolvedMethodInvocation(
@@ -499,7 +499,7 @@
static main() => C.T();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 34, 1),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 34, 1),
]);
_assertUnresolvedMethodInvocation('C.T();');
}
@@ -510,7 +510,7 @@
42.foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 14, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 14, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -522,7 +522,7 @@
v.foo(0);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 30, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 30, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -535,7 +535,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
}
@@ -546,7 +546,7 @@
null.foo();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 16, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 16, 3),
]);
_assertUnresolvedMethodInvocation('foo();');
}
@@ -557,7 +557,7 @@
o.call();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 21, 4),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 21, 4),
]);
}
@@ -576,7 +576,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 53, 4),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 53, 4),
]);
_assertUnresolvedMethodInvocation('_foo(0);');
}
@@ -591,7 +591,7 @@
C..foo();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 50, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 50, 3),
]);
}
@@ -604,7 +604,7 @@
A?.toString();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 8),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 8),
]);
}
@@ -618,7 +618,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 62, 3),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 62, 3),
]);
_assertUnresolvedMethodInvocation('foo(0);');
assertSuperExpression(findNode.super_('super.foo'));
@@ -637,7 +637,7 @@
}
''', [
error(
- StaticTypeWarningCode
+ CompileTimeErrorCode
.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
71,
3),
@@ -830,7 +830,7 @@
foo<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 29, 5),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 29, 5),
]);
assertMethodInvocation(
findNode.methodInvocation('foo<int>()'),
@@ -848,7 +848,7 @@
foo<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 58, 5),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 58, 5),
]);
assertMethodInvocation(
findNode.methodInvocation('foo<int>()'),
@@ -1655,7 +1655,7 @@
}
''', [
error(
- StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 32, 13),
+ CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD, 32, 13),
]);
var invocation = findNode.methodInvocation('foo<int, double>();');
assertTypeArgumentTypes(invocation, ['dynamic']);
@@ -1914,7 +1914,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 27, 1),
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 29, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 29, 3),
]);
assertMethodInvocation2(
@@ -1939,7 +1939,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 65, 1),
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 67, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 67, 3),
]);
assertMethodInvocation2(
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 3732016..5fcc5b5 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -958,7 +958,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SUPER_METHOD, 52, 3),
+ error(CompileTimeErrorCode.UNDEFINED_SUPER_METHOD, 52, 3),
]);
var invocation = findNode.methodInvocation('foo(42)');
diff --git a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
index 14dd4c2..d32b3cb 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefix_expression_test.dart
@@ -64,7 +64,7 @@
!x;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 14, 1),
+ error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 14, 1),
]);
assertPrefixExpression(
diff --git a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
index 4288df4..9222211 100644
--- a/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/prefixed_identifier_test.dart
@@ -102,7 +102,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 50, 1),
]);
var identifier = findNode.simple('a;');
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
index 1c626bd..b57b14e 100644
--- a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -51,7 +51,7 @@
return B().a; // ref
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 85, 5),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 85, 5),
]);
var identifier = findNode.simple('a; // ref');
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index df4940b..f67b736 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -322,7 +322,9 @@
assertType(ref, type);
}
- void assertImportPrefix(SimpleIdentifier identifier, PrefixElement element) {
+ /// In valid code [element] must be a [PrefixElement], but for invalid code
+ /// like `int.double v;` we want to resolve `int` somehow. Still not type.
+ void assertImportPrefix(SimpleIdentifier identifier, Element element) {
assertElement(identifier, element);
assertTypeNull(identifier);
}
@@ -655,7 +657,7 @@
void assertTypeName(
TypeName node, Element expectedElement, String expectedType,
- {PrefixElement expectedPrefix}) {
+ {Element expectedPrefix}) {
assertType(node, expectedType);
if (expectedPrefix == null) {
diff --git a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
index c62baeb..732f7b1 100644
--- a/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/simple_identifier_test.dart
@@ -151,7 +151,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 68, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 68, 1),
]);
var identifier = findNode.simple('a;');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
index 031d921..84ca28f 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/function_expression_test.dart
@@ -20,7 +20,7 @@
test_contextFunctionType_returnType_async_blockBody_futureOrVoid() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 72, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 72, 1),
],
legacy: [],
);
@@ -43,7 +43,7 @@
test_contextFunctionType_returnType_async_blockBody_futureVoid() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 48, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 48, 1),
],
legacy: [],
);
@@ -164,7 +164,7 @@
test_contextFunctionType_returnType_sync_blockBody_void() async {
var expectedErrors = expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 34, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 34, 1),
], legacy: []);
await assertErrorsInCode('''
void Function() v = () {
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
index 32c358a..53970af 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/list_literal_test.dart
@@ -43,7 +43,7 @@
test_context_noTypeArgs_noElements_typeParameter() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 39, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 39, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_LIST, 39, 2),
@@ -60,7 +60,7 @@
test_context_noTypeArgs_noElements_typeParameter_dynamic() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 43, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_LIST, 43, 2),
@@ -78,7 +78,7 @@
await assertErrorsInCode('''
List<String> a = <int>[0];
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 17, 8),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 17, 8),
]);
assertType(findNode.listLiteral('['), 'List<int>');
}
@@ -113,7 +113,7 @@
await assertErrorsInCode('''
List<String> a = <int>[];
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 17, 7),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 17, 7),
]);
assertType(findNode.listLiteral('['), 'List<int>');
}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
index c387ddf..54c5c98 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/map_literal_test.dart
@@ -66,7 +66,7 @@
test_context_noTypeArgs_noEntries_typeParameters() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 46, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 46, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_MAP, 46, 2),
@@ -83,7 +83,7 @@
test_context_noTypeArgs_noEntries_typeParameters_dynamic() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 51, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 51, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_MAP, 51, 2),
@@ -126,7 +126,7 @@
await assertErrorsInCode('''
Map<String, String> a = <int, int>{};
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 24, 12),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 12),
]);
assertType(setOrMapLiteral('{'), 'Map<int, int>');
}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
index 9a25ca0..267717e 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/set_literal_test.dart
@@ -57,7 +57,7 @@
test_context_noTypeArgs_noElements_typeParameter() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 38, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 38, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_SET, 38, 2),
@@ -74,7 +74,7 @@
test_context_noTypeArgs_noElements_typeParameter_dynamic() async {
var expectedErrors = expectedErrorsByNullability(
nullable: [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 42, 2),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 42, 2),
],
legacy: [
error(CompileTimeErrorCode.INVALID_CAST_LITERAL_SET, 42, 2),
@@ -116,7 +116,7 @@
await assertErrorsInCode('''
Set<String> a = <int>{};
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 16, 7),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 16, 7),
]);
assertType(setLiteral('{'), 'Set<int>');
}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
index ccce771..7300c58 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_name_test.dart
@@ -241,6 +241,40 @@
);
}
+ test_invalid_prefixedIdentifier_instanceCreation() async {
+ await assertErrorsInCode(r'''
+void f() {
+ new int.double.other();
+}
+''', [
+ error(CompileTimeErrorCode.NEW_WITH_NON_TYPE, 17, 10),
+ ]);
+
+ assertTypeName(
+ findNode.typeName('int.double'),
+ null,
+ 'dynamic',
+ expectedPrefix: intElement,
+ );
+ }
+
+ test_invalid_prefixedIdentifier_literal() async {
+ await assertErrorsInCode(r'''
+void f() {
+ 0 as int.double;
+}
+''', [
+ error(CompileTimeErrorCode.NOT_A_TYPE, 18, 10),
+ ]);
+
+ assertTypeName(
+ findNode.typeName('int.double'),
+ null,
+ 'dynamic',
+ expectedPrefix: intElement,
+ );
+ }
+
test_never() async {
await assertNoErrorsInCode(r'''
f(Never a) {}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
index dc9635c6..a27736a 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_member_access_test.dart
@@ -31,7 +31,7 @@
''', [
error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_MEMBER_ACCESS, 110, 1),
error(
- StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 110, 1),
+ CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 110, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 373f343..a0f5a93 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -113,10 +113,7 @@
main() {
const A(42);
}''', [
- error(
- CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
- 52,
- 2),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 52, 2),
error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
index 3361f23..ad89ea1 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
@@ -30,7 +30,7 @@
}
''', [
error(CompileTimeErrorCode.ASSIGNMENT_TO_METHOD, 87, 5),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 95, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 95, 1),
]);
}
@@ -61,7 +61,7 @@
}
''', [
error(CompileTimeErrorCode.ASSIGNMENT_TO_METHOD, 86, 8),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 97, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 97, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index 6331a80..ed901d3 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -14,10 +14,87 @@
});
}
-/// TODO(paulberry): move other tests from [CheckedModeCompileTimeErrorCodeTest]
-/// to this class.
@reflectiveTest
class ConstConstructorParamTypeMismatchTest extends DriverResolutionTest {
+ test_assignable_null() async {
+ // Null is assignable to anything (before null safety).
+ await assertNoErrorsInCode(r'''
+class A {
+ final int x;
+ const A(this.x);
+}
+var v = const A(null);
+''');
+ }
+
+ test_assignable_omittedType() async {
+ // If a field is declared without a type, and no initializer, it's type is
+ // dynamic.
+ await assertNoErrorsInCode(r'''
+class A {
+ final x;
+ const A(this.x);
+}
+var v = const A(5);
+''');
+ }
+
+ test_assignable_subtype() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+class C {
+ final A a;
+ const C(this.a);
+}
+var v = const C(const B());
+''');
+ }
+
+ test_assignable_typedef() async {
+ // foo has the type dynamic -> dynamic, so it is not assignable to A.f.
+ await assertErrorsInCode(r'''
+typedef String Int2String(int x);
+class A {
+ final Int2String f;
+ const A(this.f);
+}
+foo(x) => 1;
+var v = const A(foo);
+''', [
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 116, 3),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 116, 3),
+ ]);
+ }
+
+ test_assignable_typeSubstitution() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {
+ final T x;
+ const A(this.x);
+}
+var v = const A<int>(3);
+''');
+ }
+
+ test_assignable_unresolved_null() async {
+ // Null always passes runtime type checks, even when the type is
+ // unresolved.
+ await assertErrorsInCode(r'''
+class A {
+ final Unresolved x;
+ const A(String this.x);
+}
+var v = const A(null);
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
+ ]);
+ }
+
test_int_to_double_reference_from_other_library_other_file_after() async {
newFile('/test/lib/other.dart', content: '''
import 'test.dart';
@@ -77,15 +154,10 @@
const C([this.x = 0]);
}
''');
- await assertErrorsInCode('''
+ await assertNoErrorsInCode('''
import 'other.dart';
-
-void main() {
- const c = C();
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 44, 1),
- ]);
+const c = C();
+''');
var otherFileResult =
await resolveFile(convertPath('/test/lib/other.dart'));
expect(otherFileResult.errors, isEmpty);
@@ -102,14 +174,83 @@
await resolveFile(convertPath('/test/lib/other.dart'));
expect(otherFileResult.errors, isEmpty);
- await assertErrorsInCode('''
+ await assertNoErrorsInCode('''
import 'other.dart';
+const c = C();
+''');
+ }
-void main() {
- const c = C();
+ test_notAssignable_optional() async {
+ await assertErrorsInCode(r'''
+class A {
+ final int x;
+ const A([this.x = 'foo']);
}
+var v = const A();
''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 44, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 45, 5),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 64, 9),
+ ]);
+ }
+
+ test_notAssignable_supertype() async {
+ await assertErrorsInCode(r'''
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+class C {
+ final B b;
+ const C(this.b);
+}
+const A u = const A();
+var v = const C(u);
+''', [
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 143, 1),
+ ]);
+ }
+
+ test_notAssignable_typedef() async {
+ // foo has type String -> int, so it is not assignable to A.f
+ // (A.f requires it to be int -> String).
+ await assertErrorsInCode(r'''
+typedef String Int2String(int x);
+class A {
+ final Int2String f;
+ const A(this.f);
+}
+int foo(String x) => 1;
+var v = const A(foo);
+''', [
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 127, 3),
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 127, 3),
+ ]);
+ }
+
+ test_notAssignable_unrelated() async {
+ await assertErrorsInCode(r'''
+class A {
+ final int x;
+ const A(this.x);
+}
+var v = const A('foo');
+''', [
+ error(CompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH, 62, 5),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 62, 5),
+ ]);
+ }
+
+ test_notAssignable_unresolved() async {
+ await assertErrorsInCode(r'''
+class A {
+ final Unresolved x;
+ const A(String this.x);
+}
+var v = const A('foo');
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_CLASS, 18, 10),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
index bb4c910..37c2845 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_exception_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:analyzer/dart/analysis/declared_variables.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
@@ -20,8 +21,6 @@
});
}
-/// TODO(paulberry): move other tests from [CompileTimeErrorCodeTestBase] to
-/// this class.
@reflectiveTest
class ConstEvalThrowsExceptionTest extends DriverResolutionTest {
test_CastError_intToDouble_constructor_importAnalyzedAfter() async {
@@ -168,6 +167,30 @@
''');
}
+ test_fromEnvironment_bool_badArgs() async {
+ await assertErrorsInCode(r'''
+var b1 = const bool.fromEnvironment(1);
+var b2 = const bool.fromEnvironment('x', defaultValue: 1);
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 29),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 36, 1),
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 49, 48),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 81, 15),
+ ]);
+ }
+
+ test_fromEnvironment_bool_badDefault_whenDefined() async {
+ // The type of the defaultValue needs to be correct even when the default
+ // value isn't used (because the variable is defined in the environment).
+ driver.declaredVariables = DeclaredVariables.fromMap({'x': 'true'});
+ await assertErrorsInCode('''
+var b = const bool.fromEnvironment('x', defaultValue: 1);
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 8, 48),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 40, 15),
+ ]);
+ }
+
test_ifElement_false_thenNotEvaluated() async {
await assertErrorsInCode(
'''
@@ -257,6 +280,23 @@
]);
}
+ test_symbolConstructor_badStringArgument() async {
+ await assertErrorsInCode(r'''
+var s1 = const Symbol('3');
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 17),
+ ]);
+ }
+
+ test_symbolConstructor_nonStringArgument() async {
+ await assertErrorsInCode(r'''
+var s2 = const Symbol(3);
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 9, 15),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 22, 1),
+ ]);
+ }
+
test_unaryBitNot_null() async {
await assertErrorsInCode('''
const dynamic D = null;
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
new file mode 100644
index 0000000..a07e903
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_throws_idbze_test.dart
@@ -0,0 +1,25 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConstEvalThrowsIdbzeTest);
+ });
+}
+
+@reflectiveTest
+class ConstEvalThrowsIdbzeTest extends DriverResolutionTest {
+ test_divisionByZero() async {
+ await assertErrorsInCode('''
+const C = 1 ~/ 0;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE, 10, 6),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
new file mode 100644
index 0000000..9799548
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_int_test.dart
@@ -0,0 +1,35 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConstEvalTypeBoolIntTest);
+ });
+}
+
+@reflectiveTest
+class ConstEvalTypeBoolIntTest extends DriverResolutionTest {
+ test_binary() async {
+ await _check_constEvalTypeBoolOrInt_binary("a ^ ''");
+ await _check_constEvalTypeBoolOrInt_binary("a & ''");
+ await _check_constEvalTypeBoolOrInt_binary("a | ''");
+ await _check_constEvalTypeBoolOrInt_binary("a >> ''");
+ await _check_constEvalTypeBoolOrInt_binary("a << ''");
+ }
+
+ Future<void> _check_constEvalTypeBoolOrInt_binary(String expr) async {
+ await assertErrorsInCode('''
+const int a = 0;
+const b = $expr;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT, 27, 6),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
index 711122d..cc8982d 100644
--- a/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_bool_test.dart
@@ -20,7 +20,7 @@
const c = true && '';
''', [
error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 10, 10),
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 18, 2),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 18, 2),
]);
}
@@ -29,7 +29,7 @@
const c = (true || 0);
''', [
error(HintCode.DEAD_CODE, 19, 1),
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 19, 1),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 19, 1),
]);
}
@@ -38,7 +38,20 @@
const c = false || '';
''', [
error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 10, 11),
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 19, 2),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 19, 2),
+ ]);
+ }
+
+ test_lengthOfErroneousConstant() async {
+ // Attempting to compute the length of constant that couldn't be evaluated
+ // (due to an error) should not crash the analyzer (see dartbug.com/23383)
+ await assertErrorsInCode('''
+const int i = (1 ? 'alpha' : 'beta').length;
+''', [
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 14,
+ 29),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
+ error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, 15, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
new file mode 100644
index 0000000..8d3aeae
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_eval_type_num_test.dart
@@ -0,0 +1,40 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConstEvalTypeNumTest);
+ });
+}
+
+@reflectiveTest
+class ConstEvalTypeNumTest extends DriverResolutionTest {
+ test_binary() async {
+ await _check_constEvalTypeNum_binary("a + ''");
+ await _check_constEvalTypeNum_binary("a - ''");
+ await _check_constEvalTypeNum_binary("a * ''");
+ await _check_constEvalTypeNum_binary("a / ''");
+ await _check_constEvalTypeNum_binary("a ~/ ''");
+ await _check_constEvalTypeNum_binary("a > ''");
+ await _check_constEvalTypeNum_binary("a < ''");
+ await _check_constEvalTypeNum_binary("a >= ''");
+ await _check_constEvalTypeNum_binary("a <= ''");
+ await _check_constEvalTypeNum_binary("a % ''");
+ }
+
+ Future<void> _check_constEvalTypeNum_binary(String expr) async {
+ await assertErrorsInCode('''
+const num a = 0;
+const b = $expr;
+''', [
+ error(CompileTimeErrorCode.CONST_EVAL_TYPE_NUM, 27, 6),
+ error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 2),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
new file mode 100644
index 0000000..9fc2328
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_with_non_constant_argument_test.dart
@@ -0,0 +1,60 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ConstWithNonConstantArgumentTest);
+ });
+}
+
+@reflectiveTest
+class ConstWithNonConstantArgumentTest extends DriverResolutionTest {
+ test_annotation() async {
+ await assertErrorsInCode(r'''
+class A {
+ const A(int p);
+}
+var v = 42;
+@A(v)
+main() {
+}
+''', [
+ error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 45, 1),
+ ]);
+ }
+
+ test_classShadowedBySetter() async {
+ await assertErrorsInCode(r'''
+class Annotation {
+ const Annotation(Object obj);
+}
+
+class Bar {}
+
+class Foo {
+ @Annotation(Bar)
+ set Bar(int value) {}
+}
+''', [
+ error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 94, 3),
+ error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 94, 3),
+ ]);
+ }
+
+ test_instanceCreation() async {
+ await assertErrorsInCode(r'''
+class A {
+ const A(a);
+}
+f(p) { return const A(p); }
+''', [
+ error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 48, 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
new file mode 100644
index 0000000..73430bb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/could_not_infer_test.dart
@@ -0,0 +1,46 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(CouldNotInferTest);
+ });
+}
+
+@reflectiveTest
+class CouldNotInferTest extends DriverResolutionTest {
+ test_function() async {
+ await assertErrorsInCode(r'''
+T f<T>(T t) => null;
+main() { f(<S>(S s) => s); }
+''', [
+ error(CompileTimeErrorCode.COULD_NOT_INFER, 30, 1),
+ ]);
+ }
+
+ test_functionType() async {
+ await assertErrorsInCode(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }
+''', [
+ error(CompileTimeErrorCode.COULD_NOT_INFER, 29, 1),
+ ]);
+ }
+
+ test_method() async {
+ await assertErrorsInCode(r'''
+class C {
+ T f<T>(T t) => null;
+}
+main() { new C().f(<S>(S s) => s); }
+''', [
+ error(CompileTimeErrorCode.COULD_NOT_INFER, 52, 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
index c5b3597..c478806 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_list_type_arguments_test.dart
@@ -28,7 +28,7 @@
main() {
<int, int>[];
}''', [
- error(StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, 11, 10),
+ error(CompileTimeErrorCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, 11, 10),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
index 890ca88..2192c2b 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_one_set_type_arguments_test.dart
@@ -20,7 +20,7 @@
main() {
<int, int, int>{2, 3};
}''', [
- error(StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS, 11, 15),
+ error(CompileTimeErrorCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS, 11, 15),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
index a8b297f..5c1a840 100644
--- a/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/expected_two_map_type_arguments_test.dart
@@ -22,7 +22,7 @@
main() {
<int, int, int>{};
}''', [
- error(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
+ error(CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
]);
}
@@ -31,7 +31,7 @@
main() {
<int, int, int>{1: 2};
}''', [
- error(StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
+ error(CompileTimeErrorCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, 11, 15),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
index eb1ddf7..8824a62 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_element_type_test.dart
@@ -24,7 +24,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 75, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 80, 6),
]);
}
@@ -38,7 +38,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 64, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 85, 6),
]);
}
@@ -51,7 +51,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 86, 8),
]);
}
@@ -62,7 +62,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 22, 10),
]);
}
@@ -74,7 +74,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 27, 10),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
index a07d16bc..00e6a70 100644
--- a/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/for_in_of_invalid_type_test.dart
@@ -35,7 +35,7 @@
}
}
''', [
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, 41, 1),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 41, 1),
]);
}
@@ -57,7 +57,7 @@
}
}
''', [
- error(StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, 29, 1),
+ error(CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE, 29, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
index a5d8ce9..55ed10e 100644
--- a/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/illegal_async_return_type_test.dart
@@ -19,7 +19,7 @@
await assertErrorsInCode('''
int f() async {}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
]);
}
@@ -35,7 +35,7 @@
return 2;
}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
]);
}
@@ -47,7 +47,7 @@
return 0;
}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 73, 14),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 73, 14),
]);
}
@@ -57,7 +57,7 @@
int m() async {}
}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 12, 3),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 12, 3),
]);
}
@@ -79,7 +79,7 @@
}
}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 85, 14),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 85, 14),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
index 675931b..9e1911c 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_case_expression_types_test.dart
@@ -17,6 +17,29 @@
@reflectiveTest
class InconsistentCaseExpressionTypesTest extends DriverResolutionTest {
+ test_dynamic() async {
+ // Even though A.S and S have a static type of "dynamic", we should see
+ // that they match 'abc', because they are constant strings.
+ await assertNoErrorsInCode(r'''
+class A {
+ static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+ switch (p) {
+ case S:
+ break;
+ case A.S:
+ break;
+ case 'abc':
+ break;
+ }
+}
+''');
+ }
+
test_int() async {
await assertNoErrorsInCode(r'''
void f(var e) {
diff --git a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
index 9e8bee8..3e42a57 100644
--- a/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart
@@ -30,8 +30,8 @@
// @dart = 2.6
part of 'a.dart';
''',
- partErrors: [
- error(_errorCode, 0, 14),
+ libraryErrors: [
+ error(_errorCode, 20, 8),
],
);
}
@@ -46,7 +46,7 @@
// @dart = 2.5
part of 'a.dart';
''',
- partErrors: [],
+ libraryErrors: [],
);
}
@@ -58,7 +58,7 @@
partContent: r'''
part of 'a.dart';
''',
- partErrors: [],
+ libraryErrors: [],
);
}
@@ -71,8 +71,8 @@
partContent: r'''
part of 'a.dart';
''',
- partErrors: [
- error(_errorCode, 0, 7),
+ libraryErrors: [
+ error(_errorCode, 20, 8),
],
);
}
@@ -86,8 +86,8 @@
// @dart = 2.5
part of 'a.dart';
''',
- partErrors: [
- error(_errorCode, 0, 14),
+ libraryErrors: [
+ error(_errorCode, 5, 8),
],
);
}
@@ -95,7 +95,7 @@
Future<void> _checkLibraryAndPart({
@required String libraryContent,
@required String partContent,
- @required List<ExpectedError> partErrors,
+ @required List<ExpectedError> libraryErrors,
}) async {
var libraryPath = convertPath('/test/lib/a.dart');
var partPath = convertPath('/test/lib/b.dart');
@@ -104,8 +104,6 @@
newFile(partPath, content: partContent);
- await resolveFile(libraryPath);
-
- await assertErrorsInFile2(partPath, partErrors);
+ await assertErrorsInFile2(libraryPath, libraryErrors);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart b/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
index da96679..5064a6c 100644
--- a/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/inference_failure_on_untyped_parameter_test.dart
@@ -59,6 +59,12 @@
]);
}
+ test_namedParameter_withVar_unreferenced() async {
+ await assertNoErrorsInCode(r'''
+void fn({var a}) {}
+''');
+ }
+
test_parameter() async {
await assertErrorsInCode(r'''
void fn(a) => print(a);
@@ -70,13 +76,55 @@
test_parameter_inConstructor() async {
await assertErrorsInCode(r'''
class C {
- C(var a) {}
+ C(var a) {
+ a;
+ }
}
''', [
error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 14, 5),
]);
}
+ test_parameter_inConstructor_fieldFormal() async {
+ await assertNoErrorsInCode(r'''
+class C {
+ int a;
+ C(this.a) {
+ a;
+ }
+}
+''');
+ }
+
+ test_parameter_inConstructor_fieldFormal_withVar() async {
+ await assertNoErrorsInCode(r'''
+class C {
+ int a;
+ C(var this.a) {
+ a;
+ }
+}
+''');
+ }
+
+ test_parameter_inConstructor_referencedInInitializer() async {
+ await assertErrorsInCode(r'''
+class C {
+ C(var a) : assert(a != null);
+}
+''', [
+ error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 14, 5),
+ ]);
+ }
+
+ test_parameter_inConstructor_unreferenced() async {
+ await assertNoErrorsInCode(r'''
+class C {
+ C(var a);
+}
+''');
+ }
+
test_parameter_inConstructor_withType() async {
await assertNoErrorsInCode(r'''
class C {
@@ -88,7 +136,7 @@
test_parameter_inFunctionLiteral() async {
await assertErrorsInCode(r'''
void fn() {
- var f = (var a) {};
+ var f = (var a) => a;
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
@@ -115,13 +163,9 @@
}
test_parameter_inFunctionLiteral_withType() async {
- await assertErrorsInCode(r'''
-void fn() {
- var f = (int a) {};
-}
-''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
- ]);
+ await assertNoErrorsInCode(r'''
+var f = (int a) => false;
+''');
}
test_parameter_inGenericFunction_withType() async {
@@ -140,6 +184,16 @@
]);
}
+ test_parameter_inMethod_abstract() async {
+ await assertErrorsInCode(r'''
+abstract class C {
+ void fn(var a);
+}
+''', [
+ error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 29, 5),
+ ]);
+ }
+
test_parameter_inMethod_withType() async {
await assertNoErrorsInCode(r'''
class C {
@@ -204,6 +258,14 @@
''');
}
+ test_parameter_inTypedef_withoutType() async {
+ await assertErrorsInCode(r'''
+typedef void cb(a);
+''', [
+ error(HintCode.INFERENCE_FAILURE_ON_UNTYPED_PARAMETER, 16, 1),
+ ]);
+ }
+
test_parameter_inTypedef_withType() async {
await assertNoErrorsInCode(r'''
typedef cb = void Function(int a);
diff --git a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
index a409b21..6eb6bef 100644
--- a/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/instance_access_to_static_member_test.dart
@@ -28,7 +28,7 @@
g(c).a;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 93, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 93, 1),
]);
assertElement(
findNode.simple('a;'),
@@ -48,7 +48,7 @@
c.a();
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
]);
assertElement(
findNode.methodInvocation('a();'),
@@ -68,7 +68,7 @@
c.a = 2;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 68, 1),
]);
assertElement(
findNode.simple('a = 2;'),
@@ -85,7 +85,7 @@
a.m;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
]);
}
@@ -98,7 +98,7 @@
a.f;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 44, 1),
]);
}
@@ -111,7 +111,7 @@
a.f;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 50, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 50, 1),
]);
}
@@ -124,7 +124,7 @@
a.f = 42;
}
''', [
- error(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 49, 1),
+ error(CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, 49, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
index 348b422..d553a80 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -26,7 +26,7 @@
d ??= i;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 37, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 1),
]);
}
@@ -59,7 +59,7 @@
}
''', [
error(HintCode.DEAD_CODE, 24, 5),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 24, 4),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 24, 4),
]);
}
@@ -72,7 +72,7 @@
}
''', [
error(HintCode.DEAD_CODE, 37, 5),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 37, 4),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 37, 4),
]);
}
@@ -88,7 +88,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 58, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 58, 1),
]);
}
}
@@ -106,6 +106,17 @@
]);
}
+ test_cascadeExpression() async {
+ await assertErrorsInCode(r'''
+void f(int a) {
+ // ignore:unused_local_variable
+ String v = (a)..isEven;
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 64, 1),
+ ]);
+ }
+
test_compoundAssignment() async {
await assertErrorsInCode(r'''
class byte {
@@ -129,7 +140,7 @@
f({String x: 0}) {
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 13, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 13, 1),
]);
}
@@ -143,7 +154,7 @@
await assertErrorsInCode(r'''
f([String x = 0]) {
}''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 14, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 14, 1),
]);
}
@@ -160,7 +171,7 @@
dynamic = 1;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 1),
]);
}
@@ -170,7 +181,7 @@
String x = (() => 5)();
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 23, 11),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 23, 11),
]);
}
@@ -181,7 +192,7 @@
d ??= i;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 36, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 36, 1),
]);
}
@@ -292,7 +303,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 80, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 80, 1),
]);
}
@@ -316,7 +327,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
]);
}
@@ -329,7 +340,18 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 44, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 44, 1),
+ ]);
+ }
+
+ test_parenthesizedExpression() async {
+ await assertErrorsInCode(r'''
+void f(int a) {
+ // ignore:unused_local_variable
+ String v = (a);
+}
+''', [
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 64, 1),
]);
}
@@ -345,7 +367,7 @@
a++;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 65, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 65, 3),
]);
}
@@ -377,7 +399,7 @@
c.a++;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 91, 5),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 91, 5),
]);
}
@@ -409,7 +431,7 @@
++a;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 65, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 65, 3),
]);
}
@@ -441,7 +463,7 @@
++c.a;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 91, 5),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 91, 5),
]);
}
@@ -491,7 +513,7 @@
T t = int;
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 21, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 21, 3),
]);
}
@@ -504,7 +526,7 @@
A.x = '0';
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 46, 3),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 46, 3),
]);
}
@@ -519,7 +541,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 74, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 74, 1),
]);
}
@@ -527,7 +549,7 @@
await assertErrorsInCode('''
int x = 'string';
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 8),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 8, 8),
]);
}
@@ -541,7 +563,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 57, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 57, 1),
]);
}
@@ -559,7 +581,7 @@
}
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 131, 1),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 131, 1),
]);
}
@@ -569,7 +591,7 @@
int x = 'string';
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 20, 8),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 20, 8),
]);
}
@@ -590,7 +612,7 @@
print(n);
}
''', [
- error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 218, 7),
+ error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 218, 7),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
index 0554340..9435340 100644
--- a/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invocation_of_non_function_expression_test.dart
@@ -21,7 +21,7 @@
3(5);
}
''', [
- error(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 8, 1),
+ error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 8, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart b/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart
new file mode 100644
index 0000000..0ace42c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/no_generative_constructors_in_superclass_test.dart
@@ -0,0 +1,96 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(NoGenerativeConstructorsInSuperclassTest);
+ });
+}
+
+@reflectiveTest
+class NoGenerativeConstructorsInSuperclassTest extends DriverResolutionTest {
+ test_explicit() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+ B() : super();
+}
+''', [
+ error(
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+ ]);
+ }
+
+ test_explicit_oneFactory() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+ B() : super();
+ factory B.second() => throw '';
+}
+''', [
+ error(
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+ ]);
+ }
+
+ test_hasFactories() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+ factory B() => throw '';
+ factory B.second() => throw '';
+}
+''');
+ }
+
+ test_hasFactory() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+ factory B() => throw '';
+}
+''');
+ }
+
+ test_implicit() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+ B();
+}
+''', [
+ error(
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+ ]);
+ }
+
+ test_implicit2() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A() => throw '';
+}
+class B extends A {
+}
+''', [
+ error(
+ CompileTimeErrorCode.NO_GENERATIVE_CONSTRUCTORS_IN_SUPERCLASS, 55, 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
index 02438ae..da24c7b 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -21,7 +21,7 @@
await assertErrorsInCode('''
f() { return 3 ? 2 : 1; }
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 13, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
]);
}
@@ -31,7 +31,7 @@
do {} while (3);
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 21, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 21, 1),
]);
}
@@ -42,7 +42,31 @@
for (;3;) {}
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 14, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 14, 1),
+ ]);
+ }
+
+ test_for_declaration() async {
+ // https://github.com/dart-lang/sdk/issues/24713
+ await assertErrorsInCode(r'''
+f() {
+ for (int i = 0; 3;) {}
+}
+''', [
+ error(HintCode.UNUSED_LOCAL_VARIABLE, 17, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 24, 1),
+ ]);
+ }
+
+ test_for_expression() async {
+ // https://github.com/dart-lang/sdk/issues/24713
+ await assertErrorsInCode(r'''
+f() {
+ int i;
+ for (i = 0; 3;) {}
+}''', [
+ error(HintCode.UNUSED_LOCAL_VARIABLE, 12, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 29, 1),
]);
}
@@ -50,7 +74,7 @@
await assertErrorsInCode('''
var v = [for (; 0;) 1];
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 16, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 16, 1),
]);
}
@@ -60,7 +84,7 @@
if (3) return 2; else return 1;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 12, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 12, 1),
]);
}
@@ -68,7 +92,7 @@
await assertErrorsInCode('''
var v = [if (3) 1];
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 13, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 13, 1),
]);
}
@@ -78,7 +102,7 @@
while (3) {}
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 15, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 15, 1),
]);
}
}
@@ -93,7 +117,7 @@
if (x) {}
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 22, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 22, 1),
]);
}
@@ -104,7 +128,7 @@
x ? 0 : 1;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_CONDITION, 18, 1),
+ error(CompileTimeErrorCode.NON_BOOL_CONDITION, 18, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
index 258accb..61535c7 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_expression_test.dart
@@ -22,7 +22,7 @@
assert(makeAssertion);
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 45, 13),
+ error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 45, 13),
]);
}
@@ -33,7 +33,7 @@
assert(makeAssertion);
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 41, 13),
+ error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 41, 13),
]);
}
@@ -43,7 +43,7 @@
assert(0);
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_EXPRESSION, 15, 1),
+ error(CompileTimeErrorCode.NON_BOOL_EXPRESSION, 15, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
index 7eb4c52..f0c4ff3 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
@@ -23,7 +23,7 @@
!42;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
+ error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 9, 2),
]);
}
}
@@ -39,7 +39,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
+ error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 19, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
index 07c6c1d..f3496ef 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
@@ -23,7 +23,7 @@
return left && right;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 40, 4),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 40, 4),
]);
}
@@ -33,7 +33,7 @@
return left && right;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 51, 5),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 51, 5),
]);
}
@@ -43,7 +43,7 @@
return left || right;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 46, 4),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 46, 4),
]);
}
@@ -53,7 +53,7 @@
return left || right;
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 51, 5),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 51, 5),
]);
}
}
@@ -68,7 +68,7 @@
if(x && true) {}
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 21, 1),
]);
}
@@ -79,7 +79,7 @@
if(x || false) {}
}
''', [
- error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+ error(CompileTimeErrorCode.NON_BOOL_OPERAND, 21, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
similarity index 78%
rename from pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
rename to pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
index 408fc1a..35ecf41 100644
--- a/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_const_call_to_literal_constructor_test.dart
@@ -40,10 +40,7 @@
@literal
const A();
}
-
-void main() {
- const a = A();
-}
+const a = A();
''');
}
@@ -54,10 +51,7 @@
@literal
const A();
}
-
-void main() {
- const a = const A();
-}
+const a = const A();
''');
}
@@ -68,12 +62,9 @@
@literal
const A.named();
}
-void main() {
- var a = A.named();
-}
+var a = A.named();
''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 95, 1),
- error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 99, 9),
+ error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 83, 9),
]);
}
@@ -84,12 +75,9 @@
@literal
const A();
}
-void main() {
- var a = A();
-}
+var a = A();
''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 89, 1),
- error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 93, 3),
+ error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR, 77, 3),
]);
}
@@ -100,10 +88,7 @@
@literal
const A(List list);
}
-
-void main() {
- var a = A(new List());
-}
+var a = A(new List());
''');
}
@@ -114,12 +99,9 @@
@literal
const A();
}
-void main() {
- var a = new A();
-}
+var a = new A();
''', [
- error(HintCode.UNUSED_LOCAL_VARIABLE, 89, 1),
- error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW, 93, 7),
+ error(HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW, 77, 7),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
new file mode 100644
index 0000000..216836c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_const_map_as_expression_statement_test.dart
@@ -0,0 +1,48 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(NonConstMapAsExpressionStatementTest);
+ });
+}
+
+@reflectiveTest
+class NonConstMapAsExpressionStatementTest extends DriverResolutionTest {
+ @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42850')
+ test_beginningOfExpressiontatement() async {
+ // TODO(srawlins) Fasta is not recovering well.
+ // Ideally we would produce a single diagnostic:
+ // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+ addTestFile(r'''
+f() {
+ {'a' : 0, 'b' : 1}.length;
+}
+''');
+ await resolveTestFile();
+ expect(result.errors[0].errorCode,
+ CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT);
+ }
+
+ @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/42850')
+ test_expressionStatementOnly() async {
+ // TODO(danrubel) Fasta is not recovering well.
+ // Ideally we would produce a single diagnostic:
+ // CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT
+ addTestFile(r'''
+f() {
+ {'a' : 0, 'b' : 1};
+}
+''');
+ await resolveTestFile();
+ expect(result.errors[0].errorCode,
+ CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
index 7898167..6e01fe5 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_default_value_test.dart
@@ -61,6 +61,21 @@
''', [ExpectedError(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 67, 1)]);
}
+ test_constructor_inDifferentFile() async {
+ newFile('/test/lib/a.dart', content: '''
+import 'b.dart';
+const v = const MyClass();
+''');
+ await assertErrorsInCode('''
+class MyClass {
+ const MyClass([p = foo]);
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 37, 3),
+ error(CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE, 37, 3),
+ ]);
+ }
+
test_constructor_named() async {
await assertErrorsInCode(r'''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
index fd89b22..4879b59 100644
--- a/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_generative_constructor_test.dart
@@ -19,12 +19,13 @@
await assertErrorsInCode(r'''
class A {
factory A.named() => throw 0;
+ A.generative();
}
class B extends A {
B() : super.named();
}
''', [
- error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 72, 13),
+ error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 90, 13),
]);
}
@@ -56,24 +57,13 @@
await assertErrorsInCode(r'''
class A {
factory A() => throw 0;
+ A.named();
}
class B extends A {
B();
}
''', [
- error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 60, 1),
- ]);
- }
-
- test_implicit2() async {
- await assertErrorsInCode(r'''
-class A {
- factory A() => throw 0;
-}
-class B extends A {
-}
-''', [
- error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 44, 1),
+ error(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 73, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart
new file mode 100644
index 0000000..452a436
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_generative_implicit_constructor_test.dart
@@ -0,0 +1,30 @@
+// 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 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(NonGenerativeImplicitConstructorTest);
+ });
+}
+
+@reflectiveTest
+class NonGenerativeImplicitConstructorTest extends DriverResolutionTest {
+ test_implicit() async {
+ await assertErrorsInCode(r'''
+class A {
+ factory A() => throw 0;
+ A.named();
+}
+class B extends A {
+}
+''', [
+ error(CompileTimeErrorCode.NON_GENERATIVE_IMPLICIT_CONSTRUCTOR, 57, 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart b/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
index 576cbdb..0ec59d1 100644
--- a/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_native_function_type_argument_to_pointer_test.dart
@@ -28,7 +28,7 @@
''', [
// This changed from a method to a extension method, uses Dart semantics
// instead of manual check now.
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 98, 10),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 98, 10),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart b/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
index 82e57ab..cd93d58 100644
--- a/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_type_as_type_argument_test.dart
@@ -21,7 +21,7 @@
class B<E> {}
f(B<A> b) {}
''', [
- error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 25, 1),
+ error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 25, 1),
]);
}
@@ -30,7 +30,7 @@
class B<E> {}
f(B<A> b) {}
''', [
- error(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, 18, 1),
+ error(CompileTimeErrorCode.NON_TYPE_AS_TYPE_ARGUMENT, 18, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
index 67439cb..5e10b8c 100644
--- a/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/receiver_of_type_never_test.dart
@@ -191,7 +191,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
]);
assertIndexExpression(
@@ -209,8 +209,8 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
]);
assertIndexExpression(
@@ -230,7 +230,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 24, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
]);
assertIndexExpression(
@@ -536,7 +536,7 @@
(throw '') + (1 + 2);
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 27, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 27, 1),
]);
assertBinaryExpression(
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
index 25c414f..3b40aec 100644
--- a/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_non_const_constructor_test.dart
@@ -35,6 +35,20 @@
''');
}
+ test_constRedirector_constRedirectee_generic() async {
+ await assertNoErrorsInCode(r'''
+class A<T> {
+ const A(T value) : this._(value);
+ const A._(T value) : value = value;
+ final T value;
+}
+
+void main(){
+ const A<int>(1);
+}
+''');
+ }
+
test_constRedirector_constRedirectee_viaInitializer() async {
await assertNoErrorsInCode(r'''
class A {
diff --git a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
index 74f3305..cc19734 100644
--- a/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/return_of_invalid_type_test.dart
@@ -24,7 +24,7 @@
return () => "hello";
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 53, 7),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CLOSURE, 53, 7),
]);
}
@@ -35,7 +35,7 @@
}
''', [
error(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 33, 1),
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 33, 1),
]);
}
@@ -46,7 +46,7 @@
}
''', [
error(
- StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 27, 1),
+ CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR, 27, 1),
]);
}
@@ -68,7 +68,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 54, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 54, 1),
]);
}
@@ -85,7 +85,7 @@
return 5;
}
''', [
- error(StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
+ error(CompileTimeErrorCode.ILLEGAL_ASYNC_RETURN_TYPE, 0, 3),
]);
}
@@ -111,7 +111,7 @@
return 5;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
]);
}
@@ -121,7 +121,7 @@
return 5;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
]);
}
@@ -139,7 +139,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 39, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 39, 1),
]);
}
@@ -189,13 +189,13 @@
return 42;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 2),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 20, 2),
]);
}
test_function_sync_block_num__to_int() async {
var expectedErrors = expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 24, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 24, 1),
], legacy: []);
await assertErrorsInCode(r'''
int f(num a) {
@@ -210,7 +210,7 @@
return '0';
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 19, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 19, 3),
]);
}
@@ -246,13 +246,13 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 25, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 25, 1),
]);
}
test_function_sync_block_void__to_Null() async {
var expectedErrors = expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 26, 1),
], legacy: []);
await assertErrorsInCode('''
Null f(void a) {
@@ -279,7 +279,7 @@
await assertErrorsInCode('''
int f() => '0';
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 11, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 11, 3),
]);
}
@@ -289,7 +289,7 @@
return '0';
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 21, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 21, 3),
]);
}
@@ -297,7 +297,7 @@
await assertErrorsInCode('''
int get g => '0';
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 13, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 13, 3),
]);
}
@@ -310,7 +310,7 @@
g();
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 3),
]);
}
@@ -323,7 +323,7 @@
}
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 38, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 38, 3),
]);
}
@@ -354,7 +354,7 @@
}
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 33, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 33, 3),
]);
}
@@ -376,7 +376,7 @@
int f() => '0';
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 23, 3),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 23, 3),
]);
}
}
@@ -390,7 +390,7 @@
return 0;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 34, 1),
]);
}
@@ -400,7 +400,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 40, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 40, 1),
]);
}
@@ -412,7 +412,7 @@
return a;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 67, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 67, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
index 4c2223d..f535a32 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
@@ -30,7 +30,7 @@
await verifyVersion('2.5.0', '''
const a = 42 >>> 3;
''', expectedErrors: [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 13, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 13, 3),
]);
}
@@ -41,7 +41,7 @@
const a = 42 >>> 3;
''', expectedErrors: [
error(HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, 13, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 13, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 13, 3),
]);
}
@@ -69,7 +69,7 @@
await verifyVersion('2.5.0', '''
var a = 42 >>> 3;
''', expectedErrors: [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 11, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 11, 3),
]);
}
@@ -80,7 +80,7 @@
var a = 42 >>> 3;
''', expectedErrors: [
error(HintCode.SDK_VERSION_GT_GT_GT_OPERATOR, 11, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 11, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 11, 3),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index f5f1ba7..cc08fbb 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -71,9 +71,12 @@
as const_constructor_with_non_final_field;
import 'const_deferred_class_test.dart' as const_deferred_class;
import 'const_eval_throws_exception_test.dart' as const_eval_throws_exception;
+import 'const_eval_throws_idbze_test.dart' as const_eval_throws_idbze;
+import 'const_eval_type_bool_int_test.dart' as const_eval_type_bool_int;
import 'const_eval_type_bool_num_string_test.dart'
as const_eval_type_bool_num_string;
import 'const_eval_type_bool_test.dart' as const_eval_type_bool;
+import 'const_eval_type_num_test.dart' as const_eval_type_num;
import 'const_formal_parameter_test.dart' as const_formal_parameter;
import 'const_initialized_with_non_constant_value_from_deferred_library_test.dart'
as const_initialized_with_non_constant_value_from_deferred_library;
@@ -89,10 +92,13 @@
as const_spread_expected_list_or_set;
import 'const_spread_expected_map_test.dart' as const_spread_expected_map;
import 'const_with_non_const_test.dart' as const_with_non_const;
+import 'const_with_non_constant_argument_test.dart'
+ as const_with_non_constant_argument;
import 'const_with_non_type_test.dart' as const_with_non_type;
import 'const_with_type_parameters_test.dart' as const_with_type_parameters;
import 'const_with_undefined_constructor_test.dart'
as const_with_undefined_constructor;
+import 'could_not_infer_test.dart' as could_not_infer;
import 'dead_code_test.dart' as dead_code;
import 'dead_null_aware_expression_test.dart' as dead_null_aware_expression;
import 'default_list_constructor_test.dart' as default_list_constructor;
@@ -374,12 +380,18 @@
as no_annotation_constructor_arguments;
import 'no_combined_super_signature_test.dart' as no_combined_super_signature;
import 'no_default_super_constructor_test.dart' as no_default_super_constructor;
+import 'no_generative_constructors_in_superclass_test.dart'
+ as no_generative_constructors_in_superclass;
import 'non_abstract_class_inherits_abstract_member_test.dart'
as non_abstract_class_inherits_abstract_member;
import 'non_bool_condition_test.dart' as non_bool_condition;
import 'non_bool_expression_test.dart' as non_bool_expression;
import 'non_bool_negation_expression_test.dart' as non_bool_negation_expression;
import 'non_bool_operand_test.dart' as non_bool_operand;
+import 'non_const_call_to_literal_constructor_test.dart'
+ as non_const_call_to_literal_constructor;
+import 'non_const_map_as_expression_statement_test.dart'
+ as non_const_map_as_expression_statement;
import 'non_constant_annotation_constructor_test.dart'
as non_constant_annotation_constructor;
import 'non_constant_case_expression_from_deferred_library_test.dart'
@@ -401,6 +413,8 @@
import 'non_constant_set_element_test.dart' as non_constant_set_element;
import 'non_constant_type_argument_test.dart' as non_constant_type_argument;
import 'non_generative_constructor_test.dart' as non_generative_constructor;
+import 'non_generative_implicit_constructor_test.dart'
+ as non_generative_implicit_constructor;
import 'non_native_function_type_argument_to_pointer_test.dart'
as non_native_function_type_argument_to_pointer;
import 'non_null_opt_out_test.dart' as non_null_opt_out;
@@ -655,8 +669,11 @@
const_constructor_with_non_final_field.main();
const_deferred_class.main();
const_eval_throws_exception.main();
+ const_eval_throws_idbze.main();
+ const_eval_type_bool_int.main();
const_eval_type_bool_num_string.main();
const_eval_type_bool.main();
+ const_eval_type_num.main();
const_formal_parameter.main();
const_initialized_with_non_constant_value_from_deferred_library.main();
const_initialized_with_non_constant_value.main();
@@ -667,9 +684,11 @@
const_spread_expected_list_or_set.main();
const_spread_expected_map.main();
const_with_non_const.main();
+ const_with_non_constant_argument.main();
const_with_non_type.main();
const_with_type_parameters.main();
const_with_undefined_constructor.main();
+ could_not_infer.main();
dead_code.main();
dead_null_aware_expression.main();
default_list_constructor.main();
@@ -857,6 +876,7 @@
no_annotation_constructor_arguments.main();
no_combined_super_signature.main();
no_default_super_constructor.main();
+ no_generative_constructors_in_superclass.main();
non_abstract_class_inherits_abstract_member.main();
non_bool_condition.main();
non_bool_expression.main();
@@ -877,6 +897,7 @@
non_constant_set_element.main();
non_constant_type_argument.main();
non_generative_constructor.main();
+ non_generative_implicit_constructor.main();
non_native_function_type_argument_to_pointer.main();
non_null_opt_out.main();
non_type_as_type_argument.main();
@@ -885,6 +906,8 @@
non_void_return_for_setter.main();
not_a_type.main();
not_assigned_potentially_non_nullable_local_variable.main();
+ non_const_call_to_literal_constructor.main();
+ non_const_map_as_expression_statement.main();
not_enough_positional_arguments.main();
not_initialized_non_nullable_instance_field.main();
not_initialized_non_nullable_variable.main();
diff --git a/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart b/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
index a1993f5..873b884 100644
--- a/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_alias_cannot_reference_itself_test.dart
@@ -33,7 +33,7 @@
}
''', [
error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 37),
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 101, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 101, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
index bf4c60e..80d33b8 100644
--- a/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/type_parameter_supertype_of_its_bound_test.dart
@@ -22,7 +22,7 @@
class A<T extends T> {
}
''', [
- error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+ error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
]);
}
@@ -34,7 +34,7 @@
}
}
''', [
- error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
+ error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 11),
]);
}
@@ -43,9 +43,9 @@
class A<T1 extends T3, T2, T3 extends T1> {
}
''', [
- error(StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
+ error(CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 8, 13),
error(
- StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
+ CompileTimeErrorCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, 27, 13),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
index 1d6ca2b..866d3ce 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_enum_constant_test.dart
@@ -31,7 +31,7 @@
return E.TWO;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT, 34, 3),
+ error(CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT, 34, 3),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index 61d9896..4ba550f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -25,7 +25,7 @@
c.foo += 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 46, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 46, 3),
]);
}
@@ -39,7 +39,7 @@
C.foo += 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 50, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 50, 3),
]);
}
@@ -57,7 +57,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 95, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 95, 3),
]);
}
@@ -70,7 +70,7 @@
0.foo;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 58, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 58, 3),
]);
}
@@ -79,7 +79,7 @@
extension E on int {}
var a = 3.v;
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 32, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 32, 1),
]);
}
@@ -93,7 +93,7 @@
c.a;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 46, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 46, 1),
]);
}
@@ -111,7 +111,7 @@
c.foo;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 93, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 93, 3),
]);
}
@@ -132,7 +132,7 @@
return [if (x is String) x.length];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 6),
]);
}
@@ -150,7 +150,7 @@
return {if (x is String) x : x.length};
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 44, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 44, 6),
]);
}
@@ -168,7 +168,7 @@
return {if (x is String) x.length};
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 40, 6),
]);
}
@@ -188,7 +188,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 38, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 38, 6),
]);
}
@@ -207,7 +207,7 @@
class T {}
f(T e) { return e.m; }
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 29, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 29, 1),
]);
}
@@ -217,7 +217,7 @@
f() { return this.m; }
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 30, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 30, 1),
]);
}
@@ -228,7 +228,7 @@
_null.foo;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 28, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 3),
]);
}
@@ -238,7 +238,7 @@
return o.call;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 25, 4),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 25, 4),
]);
}
@@ -250,7 +250,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 66, 6),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 66, 6),
]);
}
@@ -266,7 +266,7 @@
new PrefixProxy().foo;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 127, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 127, 3),
]);
}
@@ -290,7 +290,7 @@
f(var p) {
f(C.g);
}''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 75, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 75, 1),
]);
}
@@ -300,7 +300,7 @@
f(var p) {
f(C.m);
}''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 28, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 28, 1),
]);
}
@@ -313,7 +313,7 @@
T..foo;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 54, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 54, 3),
]);
}
@@ -324,7 +324,7 @@
class A {}
f() => A?.hashCode;
''', [
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 21, 8),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 21, 8),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index e8f620e..26a8915 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -169,7 +169,7 @@
}
''', [
error(ParserErrorCode.MISSING_IDENTIFIER, 30, 1),
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 30, 1),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 30, 1),
error(ParserErrorCode.MISSING_IDENTIFIER, 31, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
index 20615c6..c99c251 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
@@ -39,7 +39,7 @@
b.a();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 33, 1),
]);
}
@@ -58,7 +58,7 @@
c.a();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 33, 1),
]);
}
@@ -91,7 +91,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 85, 1),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 85, 1),
]);
}
@@ -99,7 +99,7 @@
await assertErrorsInCode('''
f(bool b, int i) => (b ? null : i).foo();
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 35, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 35, 3),
]);
}
@@ -111,7 +111,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 22, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 22, 3),
]);
}
@@ -122,7 +122,7 @@
c..abs();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
]);
}
@@ -131,7 +131,7 @@
enum E { A }
f() => E.abs();
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 22, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 22, 3),
]);
}
@@ -142,7 +142,7 @@
m.abs();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 24, 3),
]);
}
@@ -153,7 +153,7 @@
m..abs();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 25, 3),
]);
}
@@ -164,7 +164,7 @@
f(42).abs();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 40, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 40, 3),
]);
}
@@ -194,7 +194,7 @@
B.named();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 96, 5),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 96, 5),
]);
}
@@ -210,7 +210,7 @@
c.c();
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 61, 1),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 61, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
index 8f1ee9f..b52b9dd 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
@@ -25,7 +25,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 58, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 58, 2),
]);
}
@@ -38,7 +38,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 44, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 44, 1),
]);
}
@@ -47,7 +47,7 @@
enum E { A }
f(E e) => e + 1;
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 1),
]);
}
@@ -63,7 +63,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 87, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 87, 1),
]);
}
@@ -72,7 +72,7 @@
mixin M {}
f(M m) => m + 1;
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 1),
]);
}
@@ -84,8 +84,8 @@
a[0]++;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
]);
}
@@ -109,7 +109,7 @@
e[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 25, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 25, 3),
]);
}
@@ -141,7 +141,7 @@
a[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 125, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 125, 3),
]);
}
@@ -153,7 +153,7 @@
a[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
]);
}
@@ -164,7 +164,7 @@
m[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
@@ -174,7 +174,7 @@
x[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 15, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 15, 3),
]);
}
@@ -192,7 +192,7 @@
a[0] = 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 125, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 125, 3),
]);
}
@@ -218,7 +218,7 @@
a[0] = 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 3),
]);
}
@@ -229,8 +229,8 @@
a[0]++;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
@@ -241,7 +241,7 @@
a[0];
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
@@ -252,7 +252,7 @@
a[0] = 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 3),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 3),
]);
}
@@ -263,7 +263,7 @@
x - 3;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 1),
]);
}
@@ -275,7 +275,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 2),
]);
}
@@ -286,7 +286,7 @@
x + 3;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 1),
]);
}
@@ -297,7 +297,7 @@
a + 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 24, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 24, 1),
]);
}
@@ -309,7 +309,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 20, 2),
]);
}
@@ -321,7 +321,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 19, 2),
]);
}
@@ -357,7 +357,7 @@
m++;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 2),
]);
}
@@ -368,7 +368,7 @@
a++;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 23, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 23, 2),
]);
}
@@ -380,7 +380,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 19, 2),
]);
}
@@ -392,7 +392,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 2),
]);
}
@@ -428,7 +428,7 @@
-m;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 22, 1),
]);
}
@@ -439,7 +439,7 @@
++a;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 22, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 22, 2),
]);
}
@@ -451,7 +451,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 2),
]);
}
@@ -470,7 +470,7 @@
}
''', [
error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 18, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
index 3485b60..0dbe857 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_prefixed_name_test.dart
@@ -21,7 +21,7 @@
import 'lib.dart' as p;
f() => p.c;
''', [
- error(StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME, 33, 1),
+ error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 33, 1),
]);
}
@@ -33,7 +33,7 @@
p.c = 0;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_PREFIXED_NAME, 34, 1),
+ error(CompileTimeErrorCode.UNDEFINED_PREFIXED_NAME, 34, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index b845ece..72afe6f 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -32,7 +32,7 @@
class T {}
f(T e1) { e1.m = 0; }
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 24, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 24, 1),
]);
}
@@ -42,7 +42,7 @@
f() { this.m = 0; }
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 23, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 23, 1),
]);
}
@@ -58,7 +58,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 80, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 80, 1),
]);
}
@@ -71,7 +71,7 @@
}
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 43, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 43, 1),
]);
}
@@ -95,7 +95,7 @@
f(var p) {
f(C.s = 1);
}''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 75, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 75, 1),
]);
}
@@ -104,7 +104,7 @@
class A {}
f() { A.B = 0;}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 19, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 19, 1),
]);
}
@@ -117,7 +117,7 @@
T..foo = 42;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 54, 3),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 54, 3),
]);
}
@@ -131,7 +131,7 @@
c.a = 1;
}
''', [
- error(StaticTypeWarningCode.UNDEFINED_SETTER, 46, 1),
+ error(CompileTimeErrorCode.UNDEFINED_SETTER, 46, 1),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
index 52ed3ad..f142a15 100644
--- a/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unqualified_reference_to_non_local_static_member_test.dart
@@ -28,8 +28,7 @@
}
''', [
error(
- StaticTypeWarningCode
- .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
80,
1),
]);
@@ -48,8 +47,7 @@
}
''', [
error(
- StaticTypeWarningCode
- .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
72,
3),
]);
@@ -67,8 +65,7 @@
}
''', [
error(
- StaticTypeWarningCode
- .UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+ CompileTimeErrorCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
66,
1),
]);
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
index 096a963..13e3cd2 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_nullable_value_test.dart
@@ -625,7 +625,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 58, 1),
- error(StaticTypeWarningCode.UNDEFINED_GETTER, 60, 3),
+ error(CompileTimeErrorCode.UNDEFINED_GETTER, 60, 3),
]);
}
@@ -876,7 +876,7 @@
}
''', [
error(CompileTimeErrorCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 54, 1),
- error(StaticTypeWarningCode.UNDEFINED_METHOD, 56, 3),
+ error(CompileTimeErrorCode.UNDEFINED_METHOD, 56, 3),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index e2fbe45..f5b79b4 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -232,7 +232,7 @@
''', [
// TODO(mfairhurst) suppress UNDEFINED_OPERATOR
error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
- error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 26, 1),
+ error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 26, 1),
error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 27, 1),
]);
}
@@ -582,7 +582,7 @@
return x;
}
''', [
- error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
+ error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 36, 1),
]);
}
diff --git a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
index 83954f2..3d53d64 100644
--- a/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/wrong_number_of_type_arguments_test.dart
@@ -20,7 +20,7 @@
class A<E, F> {}
A<A> a = null;
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 17, 4),
]);
}
@@ -29,7 +29,7 @@
class A<E> {}
A<A, A> a = null;
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 14, 7),
]);
}
@@ -39,7 +39,7 @@
class M {}
class B<F extends num> = A<F> with M;
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 4),
]);
}
@@ -53,7 +53,7 @@
return const C<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 47, 6),
]);
}
@@ -67,7 +67,7 @@
return const C<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 53, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 53, 6),
]);
}
@@ -81,7 +81,7 @@
return const C<int, int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 50, 11),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 50, 11),
]);
}
@@ -89,7 +89,7 @@
await assertErrorsInCode(r'''
dynamic<int> v;
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 0, 12),
]);
}
@@ -101,7 +101,7 @@
return new C<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 31, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 31, 6),
]);
}
@@ -113,7 +113,7 @@
return new C<int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 37, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 37, 6),
]);
}
@@ -125,7 +125,7 @@
return new C<int, int>();
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 34, 11),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 34, 11),
]);
}
@@ -138,7 +138,7 @@
a.element.anyGetterExistsInDynamic;
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 36, 6),
]);
}
@@ -151,7 +151,7 @@
a.element.anyGetterExistsInDynamic;
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 33, 10),
]);
}
@@ -161,7 +161,7 @@
T<int> f;
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 15, 6),
]);
}
@@ -173,7 +173,7 @@
return p is C<A>;
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 49, 4),
]);
}
@@ -185,7 +185,7 @@
return p is C<A, A>;
}
''', [
- error(StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
+ error(CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS, 46, 7),
]);
}
}
diff --git a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
index ba8cc06..53b3bfe 100644
--- a/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/yield_of_invalid_type_test.dart
@@ -28,7 +28,7 @@
}
''',
expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 72, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 72, 1),
], legacy: []));
}
@@ -39,7 +39,7 @@
}
''', [
error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 3),
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 25, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 25, 1),
]);
}
@@ -58,7 +58,7 @@
}
''', [
error(CompileTimeErrorCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE, 0, 13),
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 1),
]);
}
@@ -90,7 +90,7 @@
yield 0;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 58, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 58, 1),
]);
}
@@ -111,7 +111,7 @@
}
''',
expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 51, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 51, 1),
], legacy: []));
}
@@ -122,7 +122,7 @@
}
''', [
error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 0, 3),
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 24, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 24, 1),
]);
}
@@ -156,7 +156,7 @@
yield 0;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 37, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 37, 1),
]);
}
@@ -169,7 +169,7 @@
}
''', [
error(CompileTimeErrorCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE, 22, 11),
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 54, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 54, 1),
]);
}
@@ -221,7 +221,7 @@
yield* 0;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 22, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 22, 1),
]);
}
@@ -232,7 +232,7 @@
yield* a;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 41, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
]);
}
@@ -245,7 +245,7 @@
yield* a;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 75, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 75, 1),
]);
}
@@ -258,7 +258,7 @@
yield* a;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 78, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 78, 1),
]);
}
@@ -286,7 +286,7 @@
Stream g() => throw 0;
''',
expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 56, 3),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 3),
], legacy: []));
}
@@ -324,7 +324,7 @@
Stream<String> g() => throw 0;
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 56, 3),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 56, 3),
]);
}
@@ -364,7 +364,7 @@
yield* 0;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 21, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 21, 1),
]);
}
@@ -377,7 +377,7 @@
f;
}
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 41, 1),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 41, 1),
]);
}
@@ -401,7 +401,7 @@
Iterable g() => throw 0;
''',
expectedErrorsByNullability(nullable: [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 3),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
], legacy: []));
}
@@ -433,7 +433,7 @@
Iterable<String> g() => throw 0;
''', [
- error(StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, 35, 3),
+ error(CompileTimeErrorCode.YIELD_OF_INVALID_TYPE, 35, 3),
]);
}
}
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index ff939fc..9188c8c 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -80,7 +80,7 @@
['x']
]);
var invalid_assignment = AnalysisError(
- TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
+ TestSource(), 0, 1, CompileTimeErrorCode.INVALID_ASSIGNMENT, [
['x'],
['y']
]);
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index fe60337..cc8ae522 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -1110,7 +1110,7 @@
// missing_return: error
var undefined_function = AnalysisError(
- TestSource(), 0, 1, StaticTypeWarningCode.UNDEFINED_FUNCTION, [
+ TestSource(), 0, 1, CompileTimeErrorCode.UNDEFINED_FUNCTION, [
['x']
]);
expect(processorFor(undefined_function).severity, ErrorSeverity.WARNING);
diff --git a/pkg/compiler/lib/src/elements/entities.dart b/pkg/compiler/lib/src/elements/entities.dart
index e863b5b..ccd058d 100644
--- a/pkg/compiler/lib/src/elements/entities.dart
+++ b/pkg/compiler/lib/src/elements/entities.dart
@@ -33,6 +33,9 @@
abstract class LibraryEntity extends Entity {
/// Return the canonical uri that identifies this library.
Uri get canonicalUri;
+
+ /// Returns whether or not this library has opted into null safety.
+ bool get isNonNullableByDefault;
}
/// Stripped down super interface for import entities.
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 5d6d6ac..4aa804c 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -1239,26 +1239,24 @@
/// library code.
TypeInformation handleIntrisifiedSelector(
Selector selector, AbstractValue mask, InferrerEngine inferrer) {
- JClosedWorld closedWorld = inferrer.closedWorld;
+ AbstractValueDomain abstractValueDomain = inferrer.abstractValueDomain;
if (mask == null) return null;
- if (inferrer.abstractValueDomain.isIntegerOrNull(mask).isPotentiallyFalse) {
+ if (abstractValueDomain.isIntegerOrNull(mask).isPotentiallyFalse) {
return null;
}
if (!selector.isCall && !selector.isOperator) return null;
if (!arguments.named.isEmpty) return null;
if (arguments.positional.length > 1) return null;
- ClassEntity uint31Implementation = closedWorld.commonElements.jsUInt31Class;
- bool isInt(info) => info.type.containsOnlyInt(closedWorld);
- bool isEmpty(info) => info.type.isEmpty;
- bool isUInt31(info) {
- return info.type.satisfies(uint31Implementation, closedWorld);
- }
-
- bool isPositiveInt(info) {
- return info.type.satisfies(
- closedWorld.commonElements.jsPositiveIntClass, closedWorld);
- }
+ bool isInt(info) =>
+ abstractValueDomain.isIntegerOrNull(info.type).isDefinitelyTrue;
+ bool isEmpty(info) =>
+ abstractValueDomain.isEmpty(info.type).isDefinitelyTrue;
+ bool isUInt31(info) => abstractValueDomain
+ .isUInt31(abstractValueDomain.excludeNull(info.type))
+ .isDefinitelyTrue;
+ bool isPositiveInt(info) =>
+ abstractValueDomain.isPositiveIntegerOrNull(info.type).isDefinitelyTrue;
TypeInformation tryLater() => inferrer.types.nonNullEmptyType;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
index f2fda3d..5c6b9ef 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart
@@ -88,14 +88,14 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ TypeMask forwardIntersection = forwardTo.intersection(other, domain);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
return forwardIntersection.isNullable ? nullable() : nonNullable();
}
@override
- TypeMask union(dynamic other, JClosedWorld closedWorld) {
+ TypeMask union(dynamic other, CommonMasks domain) {
if (this == other) {
return this;
} else if (equalsDisregardNull(other)) {
@@ -105,10 +105,9 @@
} else if (other.isContainer &&
elementType != null &&
other.elementType != null) {
- TypeMask newElementType =
- elementType.union(other.elementType, closedWorld);
+ TypeMask newElementType = elementType.union(other.elementType, domain);
int newLength = (length == other.length) ? length : null;
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
return new ContainerTypeMask(
newForwardTo,
allocationNode == other.allocationNode ? allocationNode : null,
@@ -118,7 +117,7 @@
newElementType,
newLength);
} else {
- return forwardTo.union(other, closedWorld);
+ return forwardTo.union(other, domain);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
index ef15561..2431ba8 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
@@ -97,14 +97,14 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ TypeMask forwardIntersection = forwardTo.intersection(other, domain);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
return forwardIntersection.isNullable ? nullable() : nonNullable();
}
@override
- TypeMask union(dynamic other, JClosedWorld closedWorld) {
+ TypeMask union(dynamic other, CommonMasks domain) {
if (this == other) {
return this;
} else if (equalsDisregardNull(other)) {
@@ -112,9 +112,9 @@
} else if (other.isEmptyOrNull) {
return other.isNullable ? this.nullable() : this;
} else if (other.isDictionary) {
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
- TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
- TypeMask newValueType = valueType.union(other.valueType, closedWorld);
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
+ TypeMask newKeyType = keyType.union(other.keyType, domain);
+ TypeMask newValueType = valueType.union(other.valueType, domain);
Map<String, TypeMask> mappings = <String, TypeMask>{};
_typeMap.forEach((k, dynamic v) {
if (!other._typeMap.containsKey(k)) {
@@ -123,7 +123,7 @@
});
other._typeMap.forEach((k, v) {
if (_typeMap.containsKey(k)) {
- mappings[k] = v.union(_typeMap[k], closedWorld);
+ mappings[k] = v.union(_typeMap[k], domain);
} else {
mappings[k] = v.nullable();
}
@@ -133,13 +133,13 @@
} else if (other.isMap &&
(other.keyType != null) &&
(other.valueType != null)) {
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
- TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
- TypeMask newValueType = valueType.union(other.valueType, closedWorld);
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
+ TypeMask newKeyType = keyType.union(other.keyType, domain);
+ TypeMask newValueType = valueType.union(other.valueType, domain);
return new MapTypeMask(
newForwardTo, null, null, newKeyType, newValueType);
} else {
- return forwardTo.union(other, closedWorld);
+ return forwardTo.union(other, domain);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 175bac3..482bdc4 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -53,25 +53,24 @@
/// Ensures that the generated mask is normalized, i.e., a call to
/// [TypeMask.assertIsNormalized] with the factory's result returns `true`.
factory FlatTypeMask.normalized(
- ClassEntity base, int flags, JClosedWorld world) {
- if (base == world.commonElements.nullClass) {
+ ClassEntity base, int flags, CommonMasks domain) {
+ if (base == domain.commonElements.nullClass) {
return FlatTypeMask.empty();
}
if ((flags >> 1) == EMPTY || ((flags >> 1) == EXACT)) {
return new FlatTypeMask._(base, flags);
}
if ((flags >> 1) == SUBTYPE) {
- if (!world.classHierarchy.hasAnyStrictSubtype(base) ||
- world.classHierarchy.hasOnlySubclasses(base)) {
+ if (!domain._closedWorld.classHierarchy.hasAnyStrictSubtype(base) ||
+ domain._closedWorld.classHierarchy.hasOnlySubclasses(base)) {
flags = (flags & 0x1) | (SUBCLASS << 1);
}
}
if (((flags >> 1) == SUBCLASS) &&
- !world.classHierarchy.hasAnyStrictSubclass(base)) {
+ !domain._closedWorld.classHierarchy.hasAnyStrictSubclass(base)) {
flags = (flags & 0x1) | (EXACT << 1);
}
- CommonMasks commonMasks = world.abstractValueDomain;
- return commonMasks.getCachedMask(
+ return domain.getCachedMask(
base, flags, () => new FlatTypeMask._(base, flags));
}
@@ -298,26 +297,27 @@
}
@override
- TypeMask union(TypeMask other, JClosedWorld closedWorld) {
+ TypeMask union(TypeMask other, CommonMasks domain) {
+ JClosedWorld closedWorld = domain._closedWorld;
assert(other != null);
assert(TypeMask.assertIsNormalized(this, closedWorld));
assert(TypeMask.assertIsNormalized(other, closedWorld));
- if (other is! FlatTypeMask) return other.union(this, closedWorld);
+ if (other is! FlatTypeMask) return other.union(this, domain);
FlatTypeMask flatOther = other;
if (isEmptyOrNull) {
return isNullable ? flatOther.nullable() : flatOther;
} else if (flatOther.isEmptyOrNull) {
return flatOther.isNullable ? nullable() : this;
} else if (base == flatOther.base) {
- return unionSame(flatOther, closedWorld);
+ return unionSame(flatOther, domain);
} else if (closedWorld.classHierarchy.isSubclassOf(flatOther.base, base)) {
- return unionStrictSubclass(flatOther, closedWorld);
+ return unionStrictSubclass(flatOther, domain);
} else if (closedWorld.classHierarchy.isSubclassOf(base, flatOther.base)) {
- return flatOther.unionStrictSubclass(this, closedWorld);
+ return flatOther.unionStrictSubclass(this, domain);
} else if (closedWorld.classHierarchy.isSubtypeOf(flatOther.base, base)) {
- return unionStrictSubtype(flatOther, closedWorld);
+ return unionStrictSubtype(flatOther, domain);
} else if (closedWorld.classHierarchy.isSubtypeOf(base, flatOther.base)) {
- return flatOther.unionStrictSubtype(this, closedWorld);
+ return flatOther.unionStrictSubtype(this, domain);
} else {
return new UnionTypeMask._internal(
<FlatTypeMask>[this.nonNullable(), flatOther.nonNullable()],
@@ -325,10 +325,10 @@
}
}
- TypeMask unionSame(FlatTypeMask other, JClosedWorld closedWorld) {
+ TypeMask unionSame(FlatTypeMask other, CommonMasks domain) {
assert(base == other.base);
- assert(TypeMask.assertIsNormalized(this, closedWorld));
- assert(TypeMask.assertIsNormalized(other, closedWorld));
+ assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+ assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
// The two masks share the base type, so we must chose the least
// constraining kind (the highest) of the two. If either one of
// the masks are nullable the result should be nullable too.
@@ -341,18 +341,18 @@
} else if (other.flags == combined) {
return other;
} else {
- return new FlatTypeMask.normalized(base, combined, closedWorld);
+ return new FlatTypeMask.normalized(base, combined, domain);
}
}
- TypeMask unionStrictSubclass(FlatTypeMask other, JClosedWorld closedWorld) {
+ TypeMask unionStrictSubclass(FlatTypeMask other, CommonMasks domain) {
assert(base != other.base);
- assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
- assert(TypeMask.assertIsNormalized(this, closedWorld));
- assert(TypeMask.assertIsNormalized(other, closedWorld));
+ assert(domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
+ assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+ assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
int combined;
if ((isExact && other.isExact) ||
- base == closedWorld.commonElements.objectClass) {
+ base == domain.commonElements.objectClass) {
// Since the other mask is a subclass of this mask, we need the
// resulting union to be a subclass too. If either one of the
// masks are nullable the result should be nullable too.
@@ -368,16 +368,16 @@
// If we weaken the constraint on this type, we have to make sure that
// the result is normalized.
return (flags != combined)
- ? new FlatTypeMask.normalized(base, combined, closedWorld)
+ ? new FlatTypeMask.normalized(base, combined, domain)
: this;
}
- TypeMask unionStrictSubtype(FlatTypeMask other, JClosedWorld closedWorld) {
+ TypeMask unionStrictSubtype(FlatTypeMask other, CommonMasks domain) {
assert(base != other.base);
- assert(!closedWorld.classHierarchy.isSubclassOf(other.base, base));
- assert(closedWorld.classHierarchy.isSubtypeOf(other.base, base));
- assert(TypeMask.assertIsNormalized(this, closedWorld));
- assert(TypeMask.assertIsNormalized(other, closedWorld));
+ assert(!domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
+ assert(domain._closedWorld.classHierarchy.isSubtypeOf(other.base, base));
+ assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+ assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
// Since the other mask is a subtype of this mask, we need the
// resulting union to be a subtype too. If either one of the masks
// are nullable the result should be nullable too.
@@ -385,16 +385,16 @@
// We know there is at least one subtype, [other.base], so no need
// to normalize.
return (flags != combined)
- ? new FlatTypeMask.normalized(base, combined, closedWorld)
+ ? new FlatTypeMask.normalized(base, combined, domain)
: this;
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
assert(other != null);
- if (other is! FlatTypeMask) return other.intersection(this, closedWorld);
- assert(TypeMask.assertIsNormalized(this, closedWorld));
- assert(TypeMask.assertIsNormalized(other, closedWorld));
+ if (other is! FlatTypeMask) return other.intersection(this, domain);
+ assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
+ assert(TypeMask.assertIsNormalized(other, domain._closedWorld));
FlatTypeMask flatOther = other;
ClassEntity otherBase = flatOther.base;
@@ -407,14 +407,12 @@
return includeNull ? other : other.nonNullable();
}
- SubclassResult result = closedWorld.classHierarchy
+ SubclassResult result = domain._closedWorld.classHierarchy
.commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
switch (result.kind) {
case SubclassResultKind.EMPTY:
- return includeNull
- ? closedWorld.abstractValueDomain.nullType
- : closedWorld.abstractValueDomain.emptyType;
+ return includeNull ? domain.nullType : domain.emptyType;
case SubclassResultKind.EXACT1:
assert(isExact);
return includeNull ? this : nonNullable();
@@ -436,20 +434,19 @@
case SubclassResultKind.SET:
default:
if (result.classes.isEmpty) {
- return includeNull
- ? closedWorld.abstractValueDomain.nullType
- : closedWorld.abstractValueDomain.emptyType;
+ return includeNull ? domain.nullType : domain.emptyType;
} else if (result.classes.length == 1) {
ClassEntity cls = result.classes.first;
return includeNull
- ? new TypeMask.subclass(cls, closedWorld)
- : new TypeMask.nonNullSubclass(cls, closedWorld);
+ ? new TypeMask.subclass(cls, domain._closedWorld)
+ : new TypeMask.nonNullSubclass(cls, domain._closedWorld);
}
List<FlatTypeMask> masks = List.from(result.classes.map(
- (ClassEntity cls) => TypeMask.nonNullSubclass(cls, closedWorld)));
+ (ClassEntity cls) =>
+ TypeMask.nonNullSubclass(cls, domain._closedWorld)));
if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
- return UnionTypeMask.flatten(masks, includeNull, closedWorld);
+ return UnionTypeMask.flatten(masks, includeNull, domain);
}
return new UnionTypeMask._internal(masks, includeNull);
}
@@ -501,7 +498,7 @@
return true;
}
- TypeMask intersectionSame(FlatTypeMask other, JClosedWorld closedWorld) {
+ TypeMask intersectionSame(FlatTypeMask other, CommonMasks domain) {
assert(base == other.base);
// The two masks share the base type, so we must chose the most
// constraining kind (the lowest) of the two. Only if both masks
@@ -515,14 +512,13 @@
} else if (other.flags == combined) {
return other;
} else {
- return new FlatTypeMask.normalized(base, combined, closedWorld);
+ return new FlatTypeMask.normalized(base, combined, domain);
}
}
- TypeMask intersectionStrictSubclass(
- FlatTypeMask other, JClosedWorld closedWorld) {
+ TypeMask intersectionStrictSubclass(FlatTypeMask other, CommonMasks domain) {
assert(base != other.base);
- assert(closedWorld.classHierarchy.isSubclassOf(other.base, base));
+ assert(domain._closedWorld.classHierarchy.isSubclassOf(other.base, base));
// If this mask isn't at least a subclass mask, then the
// intersection with the other mask is empty.
if (isExact) return intersectionEmpty(other);
@@ -535,7 +531,7 @@
if (other.flags == combined) {
return other;
} else {
- return new FlatTypeMask.normalized(other.base, combined, closedWorld);
+ return new FlatTypeMask.normalized(other.base, combined, domain);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
index 8d86f0c..ee4de92 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
@@ -98,7 +98,7 @@
}
@override
- TypeMask union(other, JClosedWorld closedWorld) {
+ TypeMask union(other, CommonMasks domain) {
if (this == other) {
return this;
} else if (equalsDisregardNull(other)) {
@@ -106,7 +106,7 @@
} else if (other.isEmptyOrNull) {
return other.isNullable ? this.nullable() : this;
}
- return forwardTo.union(other, closedWorld);
+ return forwardTo.union(other, domain);
}
@override
@@ -115,8 +115,8 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- return forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ return forwardTo.intersection(other, domain);
}
@override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
index 3b4d729..f6e6dc8 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
@@ -90,14 +90,14 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ TypeMask forwardIntersection = forwardTo.intersection(other, domain);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
return forwardIntersection.isNullable ? nullable() : nonNullable();
}
@override
- TypeMask union(dynamic other, JClosedWorld closedWorld) {
+ TypeMask union(dynamic other, CommonMasks domain) {
if (this == other) {
return this;
} else if (equalsDisregardNull(other)) {
@@ -109,9 +109,9 @@
other.keyType != null &&
valueType != null &&
other.valueType != null) {
- TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
- TypeMask newValueType = valueType.union(other.valueType, closedWorld);
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+ TypeMask newKeyType = keyType.union(other.keyType, domain);
+ TypeMask newValueType = valueType.union(other.valueType, domain);
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
return new MapTypeMask(
newForwardTo, null, null, newKeyType, newValueType);
} else if (other.isDictionary) {
@@ -119,11 +119,11 @@
// doesn't need the compiler.
assert(other.keyType ==
new TypeMask.nonNullExact(
- closedWorld.commonElements.jsStringClass, closedWorld));
- TypeMask newKeyType = keyType.union(other.keyType, closedWorld);
+ domain.commonElements.jsStringClass, domain._closedWorld));
+ TypeMask newKeyType = keyType.union(other.keyType, domain);
TypeMask newValueType =
- other.typeMap.values.fold(keyType, (p, n) => p.union(n, closedWorld));
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+ other.typeMap.values.fold(keyType, (p, n) => p.union(n, domain));
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
MapTypeMask newMapTypeMask = new MapTypeMask(
newForwardTo,
allocationNode == other.allocationNode ? allocationNode : null,
@@ -134,7 +134,7 @@
newValueType);
return newMapTypeMask;
} else {
- return forwardTo.union(other, closedWorld);
+ return forwardTo.union(other, domain);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index b6944b1..0d0bada 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -225,7 +225,7 @@
@override
AbstractBool couldBeTypedArray(TypeMask mask) {
bool intersects(TypeMask type1, TypeMask type2) =>
- !type1.intersection(type2, _closedWorld).isEmpty;
+ !type1.intersection(type2, this).isEmpty;
// TODO(herhut): Maybe cache the TypeMask for typedDataClass and
// jsIndexingBehaviourInterface.
ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
@@ -428,7 +428,7 @@
AbstractValue typeMask = (cls == commonElements.nullClass)
? createNullableSubtype(cls)
: createNonNullSubtype(cls);
- if (expressionMask.union(typeMask, _closedWorld) == typeMask) {
+ if (expressionMask.union(typeMask, this) == typeMask) {
return AbstractBool.True;
} else if (expressionMask.isDisjoint(typeMask, _closedWorld)) {
return AbstractBool.False;
@@ -674,11 +674,10 @@
}
@override
- TypeMask union(TypeMask a, TypeMask b) => a.union(b, _closedWorld);
+ TypeMask union(TypeMask a, TypeMask b) => a.union(b, this);
@override
- TypeMask intersection(TypeMask a, TypeMask b) =>
- a.intersection(b, _closedWorld);
+ TypeMask intersection(TypeMask a, TypeMask b) => a.intersection(b, this);
@override
AbstractBool areDisjoint(TypeMask a, TypeMask b) =>
@@ -738,7 +737,7 @@
AbstractValue unionOfMany(Iterable<AbstractValue> values) {
TypeMask result = const TypeMask.nonNullEmpty();
for (TypeMask value in values) {
- result = result.union(value, _closedWorld);
+ result = result.union(value, this);
}
return result;
}
@@ -761,7 +760,7 @@
return const TypeMask.empty();
}
}),
- _closedWorld);
+ this);
}
@override
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
index 0b1ffb6e..c62db3e 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/set_type_mask.dart
@@ -79,14 +79,14 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ TypeMask forwardIntersection = forwardTo.intersection(other, domain);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
return forwardIntersection.isNullable ? nullable() : nonNullable();
}
@override
- TypeMask union(dynamic other, JClosedWorld closedWorld) {
+ TypeMask union(dynamic other, CommonMasks domain) {
if (this == other) {
return this;
} else if (equalsDisregardNull(other)) {
@@ -96,12 +96,11 @@
} else if (other.isSet &&
elementType != null &&
other.elementType != null) {
- TypeMask newElementType =
- elementType.union(other.elementType, closedWorld);
- TypeMask newForwardTo = forwardTo.union(other.forwardTo, closedWorld);
+ TypeMask newElementType = elementType.union(other.elementType, domain);
+ TypeMask newForwardTo = forwardTo.union(other.forwardTo, domain);
return new SetTypeMask(newForwardTo, null, null, newElementType);
} else {
- return forwardTo.union(other, closedWorld);
+ return forwardTo.union(other, domain);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index 7490ada..19d3e76 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -110,9 +110,9 @@
/// yield conservative answers that contain too many classes.
abstract class TypeMask implements AbstractValue {
factory TypeMask(
- ClassEntity base, int kind, bool isNullable, JClosedWorld closedWorld) {
+ ClassEntity base, int kind, bool isNullable, CommonMasks domain) {
return new FlatTypeMask.normalized(
- base, (kind << 1) | (isNullable ? 1 : 0), closedWorld);
+ base, (kind << 1) | (isNullable ? 1 : 0), domain);
}
const factory TypeMask.empty() = FlatTypeMask.empty;
@@ -217,8 +217,8 @@
}
}
- factory TypeMask.unionOf(Iterable<TypeMask> masks, JClosedWorld closedWorld) {
- return UnionTypeMask.unionOf(masks, closedWorld);
+ factory TypeMask.unionOf(Iterable<TypeMask> masks, CommonMasks domain) {
+ return UnionTypeMask.unionOf(masks, domain);
}
/// Deserializes a [TypeMask] object from [source].
@@ -394,13 +394,13 @@
ClassEntity singleClass(JClosedWorld closedWorld);
/// Returns a type mask representing the union of [this] and [other].
- TypeMask union(TypeMask other, JClosedWorld closedWorld);
+ TypeMask union(TypeMask other, CommonMasks domain);
/// Returns whether the intersection of this and [other] is empty.
bool isDisjoint(TypeMask other, JClosedWorld closedWorld);
/// Returns a type mask representing the intersection of [this] and [other].
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain);
/// Returns whether [element] is a potential target when being invoked on this
/// type mask.
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index e8cd0d1..762dfc4 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -50,33 +50,33 @@
sink.end(tag);
}
- static TypeMask unionOf(Iterable<TypeMask> masks, JClosedWorld closedWorld) {
- assert(
- masks.every((mask) => TypeMask.assertIsNormalized(mask, closedWorld)));
+ static TypeMask unionOf(Iterable<TypeMask> masks, CommonMasks domain) {
+ assert(masks.every(
+ (mask) => TypeMask.assertIsNormalized(mask, domain._closedWorld)));
List<FlatTypeMask> disjoint = <FlatTypeMask>[];
bool isNullable = masks.any((TypeMask mask) => mask.isNullable);
- unionOfHelper(masks, disjoint, closedWorld);
+ unionOfHelper(masks, disjoint, domain);
if (disjoint.isEmpty)
return isNullable ? TypeMask.empty() : TypeMask.nonNullEmpty();
if (disjoint.length > MAX_UNION_LENGTH) {
- return flatten(disjoint, isNullable, closedWorld);
+ return flatten(disjoint, isNullable, domain);
}
if (disjoint.length == 1)
return isNullable ? disjoint[0].nullable() : disjoint[0];
UnionTypeMask union = new UnionTypeMask._internal(disjoint, isNullable);
- assert(TypeMask.assertIsNormalized(union, closedWorld));
+ assert(TypeMask.assertIsNormalized(union, domain._closedWorld));
return union;
}
static void unionOfHelper(Iterable<TypeMask> masks,
- List<FlatTypeMask> disjoint, JClosedWorld closedWorld) {
+ List<FlatTypeMask> disjoint, CommonMasks domain) {
// TODO(johnniwinther): Impose an order on the mask to ensure subclass masks
// are preferred to subtype masks.
for (TypeMask mask in masks) {
mask = TypeMask.nonForwardingMask(mask).nonNullable();
if (mask.isUnion) {
UnionTypeMask union = mask;
- unionOfHelper(union.disjointMasks, disjoint, closedWorld);
+ unionOfHelper(union.disjointMasks, disjoint, domain);
} else if (mask.isEmpty) {
continue;
} else {
@@ -89,7 +89,7 @@
for (int i = 0; i < disjoint.length; i++) {
FlatTypeMask current = disjoint[i];
if (current == null) continue;
- TypeMask newMask = flatMask.union(current, closedWorld);
+ TypeMask newMask = flatMask.union(current, domain);
// If we have found a disjoint union, continue iterating.
if (newMask.isUnion) continue;
covered = true;
@@ -122,7 +122,7 @@
}
static TypeMask flatten(
- List<FlatTypeMask> masks, bool includeNull, JClosedWorld closedWorld) {
+ List<FlatTypeMask> masks, bool includeNull, CommonMasks domain) {
// TODO(johnniwinther): Move this computation to [ClosedWorld] and use the
// class set structures.
if (masks.isEmpty) throw ArgumentError.value(masks, 'masks');
@@ -132,7 +132,7 @@
List<ClassEntity> masksBases = masks.map((mask) => mask.base).toList();
Iterable<ClassEntity> candidates =
- closedWorld.commonSupertypesOf(masksBases);
+ domain._closedWorld.commonSupertypesOf(masksBases);
// Compute the best candidate and its kind.
ClassEntity bestElement;
@@ -141,8 +141,8 @@
for (ClassEntity candidate in candidates) {
bool isInstantiatedStrictSubclass(cls) =>
cls != candidate &&
- closedWorld.classHierarchy.isExplicitlyInstantiated(cls) &&
- closedWorld.classHierarchy.isSubclassOf(cls, candidate);
+ domain._closedWorld.classHierarchy.isExplicitlyInstantiated(cls) &&
+ domain._closedWorld.classHierarchy.isSubclassOf(cls, candidate);
int size;
int kind;
@@ -155,12 +155,13 @@
// TODO(sigmund, johnniwinther): computing length here (and below) is
// expensive. If we can't prevent `flatten` from being called a lot, it
// might be worth caching results.
- size = closedWorld.classHierarchy.strictSubclassCount(candidate);
- assert(
- size <= closedWorld.classHierarchy.strictSubtypeCount(candidate));
+ size =
+ domain._closedWorld.classHierarchy.strictSubclassCount(candidate);
+ assert(size <=
+ domain._closedWorld.classHierarchy.strictSubtypeCount(candidate));
} else {
kind = FlatTypeMask.SUBTYPE;
- size = closedWorld.classHierarchy.strictSubtypeCount(candidate);
+ size = domain._closedWorld.classHierarchy.strictSubtypeCount(candidate);
}
// Update the best candidate if the new one is better.
if (bestElement == null || size < bestSize) {
@@ -169,11 +170,11 @@
bestKind = kind;
}
}
- return new TypeMask(bestElement, bestKind, includeNull, closedWorld);
+ return new TypeMask(bestElement, bestKind, includeNull, domain);
}
@override
- TypeMask union(dynamic other, JClosedWorld closedWorld) {
+ TypeMask union(dynamic other, CommonMasks domain) {
other = TypeMask.nonForwardingMask(other);
if (other is UnionTypeMask) {
if (_containsNonNullableUnion(other)) {
@@ -195,12 +196,12 @@
assert(other is UnionTypeMask);
newList.addAll(other.disjointMasks);
}
- TypeMask newMask = new TypeMask.unionOf(newList, closedWorld);
+ TypeMask newMask = new TypeMask.unionOf(newList, domain);
return isNullable || other.isNullable ? newMask.nullable() : newMask;
}
@override
- TypeMask intersection(dynamic other, JClosedWorld closedWorld) {
+ TypeMask intersection(dynamic other, CommonMasks domain) {
other = TypeMask.nonForwardingMask(other);
if (other is UnionTypeMask) {
if (_containsNonNullableUnion(other)) {
@@ -223,14 +224,14 @@
intersections.add(current);
} else {
for (FlatTypeMask flatOther in other.disjointMasks) {
- intersections.add(current.intersection(flatOther, closedWorld));
+ intersections.add(current.intersection(flatOther, domain));
}
}
} else {
- intersections.add(current.intersection(other, closedWorld));
+ intersections.add(current.intersection(other, domain));
}
}
- TypeMask newMask = TypeMask.unionOf(intersections, closedWorld);
+ TypeMask newMask = TypeMask.unionOf(intersections, domain);
return isNullable && other.isNullable ? newMask.nullable() : newMask;
}
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
index fb475be..94e0284 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart
@@ -57,8 +57,8 @@
}
@override
- TypeMask intersection(TypeMask other, JClosedWorld closedWorld) {
- TypeMask forwardIntersection = forwardTo.intersection(other, closedWorld);
+ TypeMask intersection(TypeMask other, CommonMasks domain) {
+ TypeMask forwardIntersection = forwardTo.intersection(other, domain);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
return forwardIntersection.isNullable ? nullable() : nonNullable();
}
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 2d25175..33079f9 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -350,9 +350,9 @@
ir.DartType receiverType = visitNode(node.receiver);
ArgumentTypes argumentTypes = _visitArguments(node.arguments);
ir.DartType returnType;
- if (typeEnvironment.isOverloadedArithmeticOperator(node.target)) {
+ if (typeEnvironment.isSpecialCasedBinaryOperator(node.target)) {
ir.DartType argumentType = argumentTypes.positional[0];
- returnType = typeEnvironment.getTypeOfOverloadedArithmetic(
+ returnType = typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
receiverType, argumentType);
} else {
ir.Class superclass = node.target.enclosingClass;
@@ -386,7 +386,7 @@
/// target as to avoid visiting the argument twice.
bool isSpecialCasedBinaryOperator(ir.Member interfaceTarget) {
return interfaceTarget is ir.Procedure &&
- typeEnvironment.isOverloadedArithmeticOperator(interfaceTarget);
+ typeEnvironment.isSpecialCasedBinaryOperator(interfaceTarget);
}
ir.Member _getMember(ir.Class cls, String name) {
@@ -639,7 +639,7 @@
node, argumentTypes, getterType, interfaceTarget);
if (isSpecialCasedBinaryOperator(interfaceTarget)) {
ir.DartType argumentType = argumentTypes.positional[0];
- return typeEnvironment.getTypeOfOverloadedArithmetic(
+ return typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
receiverType, argumentType);
} else if (getterType is ir.FunctionType) {
return getterType.returnType;
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 5008ebd..4e04562 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -225,9 +225,13 @@
final bool isFinal;
final bool isLazy;
final bool isInitializedByConstant;
+ final bool usesNonNullableInitialization;
StaticField(this.element, this.name, this.getterName, this.holder, this.code,
- {this.isFinal, this.isLazy, this.isInitializedByConstant: false});
+ {this.isFinal,
+ this.isLazy,
+ this.isInitializedByConstant: false,
+ this.usesNonNullableInitialization: false});
@override
String toString() {
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index e4508fe..04d085e 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -434,7 +434,8 @@
element, name, null, _registerStaticStateHolder(), code,
isFinal: false,
isLazy: false,
- isInitializedByConstant: initialValue != null);
+ isInitializedByConstant: initialValue != null,
+ usesNonNullableInitialization: element.library.isNonNullableByDefault);
}
List<StaticField> _buildStaticLazilyInitializedFields(
@@ -463,7 +464,9 @@
// the holder-instance.
return new StaticField(
element, name, getterName, _registerStaticStateHolder(), code,
- isFinal: !element.isAssignable, isLazy: true);
+ isFinal: !element.isAssignable,
+ isLazy: true,
+ usesNonNullableInitialization: element.library.isNonNullableByDefault);
}
List<Library> _buildLibraries(LibrariesMap librariesMap) {
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 8ae8d3a3..5bd1eab 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -118,7 +118,7 @@
// A lazy field has a storage entry, [name], which holds the value, and a
// getter ([getterName]) to access the field. If the field wasn't set before
// the first access, it is initialized with the [initializer].
-function lazy(holder, name, getterName, initializer) {
+function lazyOld(holder, name, getterName, initializer) {
var uninitializedSentinel = holder;
holder[name] = uninitializedSentinel;
holder[getterName] = function() {
@@ -149,6 +149,32 @@
};
}
+// Creates a lazy field that uses non-nullable initialization semantics.
+//
+// A lazy field has a storage entry, [name], which holds the value, and a
+// getter ([getterName]) to access the field. If the field wasn't set before
+// the first access, it is initialized with the [initializer].
+function lazy(holder, name, getterName, initializer) {
+ var uninitializedSentinel = holder;
+ holder[name] = uninitializedSentinel;
+ holder[getterName] = function() {
+ var result;
+ try {
+ if (holder[name] === uninitializedSentinel) {
+ result = holder[name] = initializer();
+ } else {
+ result = holder[name];
+ }
+ } finally {
+ // Use try-finally, not try-catch/throw as it destroys the stack trace.
+ // TODO(floitsch): for performance reasons the function should probably
+ // be unique for each static.
+ holder[getterName] = function() { return this[name]; };
+ }
+ return result;
+ };
+}
+
// Given a list, marks it as constant.
//
// The runtime ensures that const-lists cannot be modified.
@@ -350,6 +376,7 @@
makeConstList: makeConstList,
lazy: lazy,
+ lazyOld: lazyOld,
updateHolder: updateHolder,
convertToFastObject: convertToFastObject,
setFunctionNamesIfNecessary: setFunctionNamesIfNecessary,
@@ -1732,7 +1759,9 @@
for (StaticField field in fields) {
assert(field.holder.isStaticStateHolder);
js.Statement statement = js.js.statement("#(#, #, #, #);", [
- locals.find('_lazy', 'hunkHelpers.lazy'),
+ field.usesNonNullableInitialization
+ ? locals.find('_lazy', 'hunkHelpers.lazy')
+ : locals.find('_lazyOld', 'hunkHelpers.lazyOld'),
field.holder.name,
js.quoteName(field.name),
js.quoteName(field.getterName),
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index c4437cd..2db2f31 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -148,8 +148,8 @@
IndexedLibrary oldLibrary = _elementMap.libraries.getEntity(libraryIndex);
KLibraryEnv oldEnv = _elementMap.libraries.getEnv(oldLibrary);
KLibraryData data = _elementMap.libraries.getData(oldLibrary);
- IndexedLibrary newLibrary =
- new JLibrary(oldLibrary.name, oldLibrary.canonicalUri);
+ IndexedLibrary newLibrary = new JLibrary(oldLibrary.name,
+ oldLibrary.canonicalUri, oldLibrary.isNonNullableByDefault);
JLibraryEnv newEnv = oldEnv.convert(_elementMap, liveMemberUsage);
libraryMap[oldEnv.library] =
libraries.register<IndexedLibrary, JLibraryData, JLibraryEnv>(
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 4929d21..05a965f 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -24,16 +24,19 @@
final String name;
@override
final Uri canonicalUri;
+ @override
+ final bool isNonNullableByDefault;
- JLibrary(this.name, this.canonicalUri);
+ JLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
/// Deserializes a [JLibrary] object from [source].
factory JLibrary.readFromDataSource(DataSource source) {
source.begin(tag);
String name = source.readString();
Uri canonicalUri = source.readUri();
+ bool isNonNullableByDefault = source.readBool();
source.end(tag);
- return new JLibrary(name, canonicalUri);
+ return new JLibrary(name, canonicalUri, isNonNullableByDefault);
}
/// Serializes this [JLibrary] to [sink].
@@ -41,6 +44,7 @@
sink.begin(tag);
sink.writeString(name);
sink.writeUri(canonicalUri);
+ sink.writeBool(isNonNullableByDefault);
sink.end(tag);
}
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index c6aa102..891c462 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -127,7 +127,7 @@
name = name.substring(4);
} else if (name.startsWith('set:')) {
kind = invocationMirrorSetterKind;
- name = name.substring(4) + '=';
+ name = name.substring(4);
} else {
kind = invocationMirrorMethodKind;
}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 0c1c106..5977113 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1191,7 +1191,8 @@
String path = canonicalUri.path;
name = path.substring(path.lastIndexOf('/') + 1);
}
- IndexedLibrary library = createLibrary(name, canonicalUri);
+ IndexedLibrary library =
+ createLibrary(name, canonicalUri, node.isNonNullableByDefault);
return libraries.register(library, new KLibraryData(node),
libraryEnv ?? env.lookupLibrary(canonicalUri));
}
@@ -1597,8 +1598,9 @@
isJsInterop: isJsInterop);
}
- IndexedLibrary createLibrary(String name, Uri canonicalUri) {
- return new KLibrary(name, canonicalUri);
+ IndexedLibrary createLibrary(
+ String name, Uri canonicalUri, bool isNonNullableByDefault) {
+ return new KLibrary(name, canonicalUri, isNonNullableByDefault);
}
IndexedClass createClass(LibraryEntity library, String name,
diff --git a/pkg/compiler/lib/src/kernel/kelements.dart b/pkg/compiler/lib/src/kernel/kelements.dart
index 0257c08..8356cb5 100644
--- a/pkg/compiler/lib/src/kernel/kelements.dart
+++ b/pkg/compiler/lib/src/kernel/kelements.dart
@@ -17,8 +17,10 @@
final String name;
@override
final Uri canonicalUri;
+ @override
+ final bool isNonNullableByDefault;
- KLibrary(this.name, this.canonicalUri);
+ KLibrary(this.name, this.canonicalUri, this.isNonNullableByDefault);
@override
String toString() => '${kElementPrefix}library($name)';
diff --git a/pkg/compiler/test/analyses/dart2js_allowed.json b/pkg/compiler/test/analyses/dart2js_allowed.json
index c916d07..1096f17 100644
--- a/pkg/compiler/test/analyses/dart2js_allowed.json
+++ b/pkg/compiler/test/analyses/dart2js_allowed.json
@@ -219,10 +219,7 @@
"pkg/compiler/lib/src/inferrer/type_graph_nodes.dart": {
"Dynamic invocation of 'add'.": 1,
"Dynamic invocation of 'remove'.": 1,
- "Dynamic access of 'type'.": 4,
- "Dynamic invocation of 'containsOnlyInt'.": 1,
- "Dynamic access of 'isEmpty'.": 1,
- "Dynamic invocation of 'satisfies'.": 2
+ "Dynamic access of 'type'.": 4
},
"pkg/compiler/lib/src/inferrer/locals_handler.dart": {
"Dynamic access of 'isEmpty'.": 1,
diff --git a/pkg/compiler/test/codegen/expect_annotations_test.dart b/pkg/compiler/test/codegen/expect_annotations_test.dart
index f25bec8..5fc56d7 100644
--- a/pkg/compiler/test/codegen/expect_annotations_test.dart
+++ b/pkg/compiler/test/codegen/expect_annotations_test.dart
@@ -9,6 +9,7 @@
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/inferrer/types.dart';
import 'package:compiler/src/world.dart' show JClosedWorld;
@@ -46,6 +47,7 @@
memorySourceFiles: MEMORY_SOURCE_FILES, options: [Flags.testMode]);
Compiler compiler = result.compiler;
JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+ AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
void testTypeMatch(FunctionEntity function, TypeMask expectedParameterType,
@@ -54,12 +56,12 @@
closedWorld.globalLocalsMap, function, (Local parameter) {
TypeMask type = results.resultOfParameter(parameter);
Expect.equals(
- expectedParameterType, simplify(type, closedWorld), "$parameter");
+ expectedParameterType, simplify(type, commonMasks), "$parameter");
});
if (expectedReturnType != null) {
TypeMask type = results.resultOfMember(function).returnType;
Expect.equals(
- expectedReturnType, simplify(type, closedWorld), "$function");
+ expectedReturnType, simplify(type, commonMasks), "$function");
}
}
diff --git a/pkg/compiler/test/inference/list_tracer_test.dart b/pkg/compiler/test/inference/list_tracer_test.dart
index f63d8c1..9658374 100644
--- a/pkg/compiler/test/inference/list_tracer_test.dart
+++ b/pkg/compiler/test/inference/list_tracer_test.dart
@@ -220,7 +220,7 @@
var element = findMember(closedWorld, name);
ContainerTypeMask mask = results.resultOfMember(element).type;
if (nullify) type = type.nullable();
- Expect.equals(type, simplify(mask.elementType, closedWorld), name);
+ Expect.equals(type, simplify(mask.elementType, commonMasks), name);
}
checkType('listInField', commonMasks.numType);
diff --git a/pkg/compiler/test/inference/map_tracer_test.dart b/pkg/compiler/test/inference/map_tracer_test.dart
index 77f899e..4cb4c1e 100644
--- a/pkg/compiler/test/inference/map_tracer_test.dart
+++ b/pkg/compiler/test/inference/map_tracer_test.dart
@@ -252,13 +252,13 @@
checkType(String name, keyType, valueType) {
MemberEntity element = findMember(closedWorld, name);
MapTypeMask mask = results.resultOfMember(element).type;
- Expect.equals(keyType, simplify(mask.keyType, closedWorld), name);
- Expect.equals(valueType, simplify(mask.valueType, closedWorld), name);
+ Expect.equals(keyType, simplify(mask.keyType, commonMasks), name);
+ Expect.equals(valueType, simplify(mask.valueType, commonMasks), name);
}
- K(TypeMask other) => simplify(keyType.union(other, closedWorld), closedWorld);
+ K(TypeMask other) => simplify(keyType.union(other, commonMasks), commonMasks);
V(TypeMask other) =>
- simplify(valueType.union(other, closedWorld), closedWorld).nullable();
+ simplify(valueType.union(other, commonMasks), commonMasks).nullable();
checkType('mapInField', K(aKeyType), V(commonMasks.numType));
checkType('mapPassedToMethod', K(aKeyType), V(commonMasks.numType));
diff --git a/pkg/compiler/test/inference/type_combination_test.dart b/pkg/compiler/test/inference/type_combination_test.dart
index e7f96a5..b949eba 100644
--- a/pkg/compiler/test/inference/type_combination_test.dart
+++ b/pkg/compiler/test/inference/type_combination_test.dart
@@ -9,6 +9,7 @@
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/world.dart';
import 'type_mask_test_helper.dart';
@@ -109,8 +110,9 @@
}
void testUnion(JClosedWorld closedWorld) {
+ AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
RuleSet ruleSet = new RuleSet(
- 'union', (t1, t2) => simplify(t1.union(t2, closedWorld), closedWorld));
+ 'union', (t1, t2) => simplify(t1.union(t2, commonMasks), commonMasks));
rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
check(type1, type2, predicate) => ruleSet.check(type1, type2, predicate);
@@ -420,8 +422,8 @@
}
void testIntersection(JClosedWorld closedWorld) {
- RuleSet ruleSet =
- new RuleSet('intersection', (t1, t2) => t1.intersection(t2, closedWorld));
+ RuleSet ruleSet = new RuleSet('intersection',
+ (t1, t2) => t1.intersection(t2, closedWorld.abstractValueDomain));
rule(type1, type2, result) => ruleSet.rule(type1, type2, result);
rule(emptyType, emptyType, emptyType);
@@ -737,8 +739,10 @@
void testRegressions(JClosedWorld closedWorld) {
TypeMask nonNullPotentialString =
new TypeMask.nonNullSubtype(patternClass, closedWorld);
- Expect.equals(potentialString,
- jsStringOrNull.union(nonNullPotentialString, closedWorld));
+ Expect.equals(
+ potentialString,
+ jsStringOrNull.union(
+ nonNullPotentialString, closedWorld.abstractValueDomain));
}
void main() {
diff --git a/pkg/compiler/test/inference/type_mask2_test.dart b/pkg/compiler/test/inference/type_mask2_test.dart
index c4d5bef..e5056f8 100644
--- a/pkg/compiler/test/inference/type_mask2_test.dart
+++ b/pkg/compiler/test/inference/type_mask2_test.dart
@@ -10,6 +10,7 @@
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/world.dart' show JClosedWorld;
import '../helpers/type_test_helper.dart';
@@ -32,26 +33,27 @@
List<FlatTypeMask> disjointMasks,
FlatTypeMask flattened,
List<ClassEntity> containedClasses}) {
+ AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
bool isNullable = masks.any((FlatTypeMask mask) => mask.isNullable);
List<FlatTypeMask> disjoint = <FlatTypeMask>[];
- UnionTypeMask.unionOfHelper(masks, disjoint, closedWorld);
+ UnionTypeMask.unionOfHelper(masks, disjoint, commonMasks);
Expect.listEquals(disjointMasks, disjoint,
'Unexpected disjoint masks: $disjoint, expected $disjointMasks.');
if (flattened == null) {
Expect.throws(
- () => UnionTypeMask.flatten(disjoint, isNullable, closedWorld),
+ () => UnionTypeMask.flatten(disjoint, isNullable, commonMasks),
(e) => e is ArgumentError,
'Expect argument error on flattening of $disjoint.');
} else {
TypeMask flattenResult =
- UnionTypeMask.flatten(disjoint, isNullable, closedWorld);
+ UnionTypeMask.flatten(disjoint, isNullable, commonMasks);
Expect.equals(
flattened,
flattenResult,
'Unexpected flattening of $disjoint: '
'$flattenResult, expected $flattened.');
}
- dynamic union = UnionTypeMask.unionOf(masks, closedWorld);
+ dynamic union = UnionTypeMask.unionOf(masks, commonMasks);
if (result == null) {
Expect.isTrue(union is UnionTypeMask,
'Expected union of $masks to be a union-type: $union.');
diff --git a/pkg/compiler/test/inference/type_mask_disjoint_test.dart b/pkg/compiler/test/inference/type_mask_disjoint_test.dart
index 13732c5..519770c 100644
--- a/pkg/compiler/test/inference/type_mask_disjoint_test.dart
+++ b/pkg/compiler/test/inference/type_mask_disjoint_test.dart
@@ -9,6 +9,7 @@
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/world.dart';
@@ -48,6 +49,7 @@
Compiler compiler = result.compiler;
JClosedWorld world = compiler.backendClosedWorldForTesting;
ElementEnvironment elementEnvironment = world.elementEnvironment;
+ AbstractValueDomain commonMasks = world.abstractValueDomain;
/// Checks the expectation of `isDisjoint` for two mask. Also checks that
/// the result is consistent with an equivalent (but slower) implementation
@@ -56,9 +58,9 @@
print('masks: $m1 $m2');
Expect.equals(areDisjoint, m1.isDisjoint(m2, world));
Expect.equals(areDisjoint, m2.isDisjoint(m1, world));
- var i1 = m1.intersection(m2, world);
+ var i1 = m1.intersection(m2, commonMasks);
Expect.equals(areDisjoint, i1.isEmpty && !i1.isNullable);
- var i2 = m2.intersection(m1, world);
+ var i2 = m2.intersection(m1, commonMasks);
Expect.equals(areDisjoint, i2.isEmpty && !i2.isNullable);
}
@@ -123,8 +125,10 @@
checkUnions(List<String> descriptors1, List<String> descriptors2,
{areDisjoint: true}) {
print('[$descriptors1] & [$descriptors2]');
- var m1 = new TypeMask.unionOf(descriptors1.map(maskOf).toList(), world);
- var m2 = new TypeMask.unionOf(descriptors2.map(maskOf).toList(), world);
+ var m1 =
+ new TypeMask.unionOf(descriptors1.map(maskOf).toList(), commonMasks);
+ var m2 =
+ new TypeMask.unionOf(descriptors2.map(maskOf).toList(), commonMasks);
checkMask(m1, m2, areDisjoint: areDisjoint);
}
diff --git a/pkg/compiler/test/inference/type_mask_test.dart b/pkg/compiler/test/inference/type_mask_test.dart
index d11d26d..ea40214 100644
--- a/pkg/compiler/test/inference/type_mask_test.dart
+++ b/pkg/compiler/test/inference/type_mask_test.dart
@@ -8,6 +8,7 @@
import 'package:compiler/src/common.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import 'package:compiler/src/world.dart';
import 'package:expect/expect.dart';
@@ -32,6 +33,7 @@
Expect.isTrue(result.isSuccess);
Compiler compiler = result.compiler;
JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+ AbstractValueDomain commonMasks = closedWorld.abstractValueDomain;
ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
dynamic classA =
@@ -54,16 +56,16 @@
var subclassObject = new TypeMask.nonNullSubclass(
closedWorld.commonElements.objectClass, closedWorld);
- var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], closedWorld);
+ var unionABC = UnionTypeMask.unionOf([exactA, exactB, exactC], commonMasks);
var unionABnC =
- UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC], closedWorld);
- var unionAB = UnionTypeMask.unionOf([exactA, exactB], closedWorld);
- var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], closedWorld);
+ UnionTypeMask.unionOf([exactA, exactB.nullable(), exactC], commonMasks);
+ var unionAB = UnionTypeMask.unionOf([exactA, exactB], commonMasks);
+ var unionSubtypeAC = UnionTypeMask.unionOf([subtypeA, exactC], commonMasks);
var unionSubclassAC =
- UnionTypeMask.unionOf([subclassA, exactC], closedWorld);
- var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], closedWorld);
+ UnionTypeMask.unionOf([subclassA, exactC], commonMasks);
+ var unionBCD = UnionTypeMask.unionOf([exactB, exactC, exactD], commonMasks);
var unionBCDn =
- UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()], closedWorld);
+ UnionTypeMask.unionOf([exactB, exactC, exactD.nullable()], commonMasks);
Expect.isFalse(unionABC.isNullable);
Expect.isTrue(unionABnC.isNullable);
diff --git a/pkg/compiler/test/inference/type_mask_test_helper.dart b/pkg/compiler/test/inference/type_mask_test_helper.dart
index 3225032..9e5d665 100644
--- a/pkg/compiler/test/inference/type_mask_test_helper.dart
+++ b/pkg/compiler/test/inference/type_mask_test_helper.dart
@@ -11,12 +11,12 @@
export 'package:compiler/src/inferrer/types.dart';
-TypeMask simplify(TypeMask mask, JClosedWorld closedWorld) {
+TypeMask simplify(TypeMask mask, CommonMasks commonMasks) {
if (mask is ForwardingTypeMask) {
- return simplify(mask.forwardTo, closedWorld);
+ return simplify(mask.forwardTo, commonMasks);
} else if (mask is UnionTypeMask) {
return UnionTypeMask.flatten(
- mask.disjointMasks, mask.isNullable, closedWorld);
+ mask.disjointMasks, mask.isNullable, commonMasks);
} else {
return mask;
}
diff --git a/pkg/compiler/test/inference/union_type_test.dart b/pkg/compiler/test/inference/union_type_test.dart
index 710264a..62b8bd4 100644
--- a/pkg/compiler/test/inference/union_type_test.dart
+++ b/pkg/compiler/test/inference/union_type_test.dart
@@ -6,6 +6,7 @@
import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
import 'package:compiler/src/inferrer/typemasks/masks.dart';
import "package:compiler/src/world.dart";
import '../helpers/type_test_helper.dart';
@@ -22,10 +23,11 @@
}
""", testBackendWorld: true);
JClosedWorld world = env.jClosedWorld;
+ AbstractValueDomain commonMasks = world.abstractValueDomain;
FlatTypeMask mask1 = new FlatTypeMask.exact(env.getClass('A'), world);
FlatTypeMask mask2 = new FlatTypeMask.exact(env.getClass('B'), world);
- UnionTypeMask union1 = mask1.nonNullable().union(mask2, world);
- UnionTypeMask union2 = mask2.nonNullable().union(mask1, world);
+ UnionTypeMask union1 = mask1.nonNullable().union(mask2, commonMasks);
+ UnionTypeMask union2 = mask2.nonNullable().union(mask1, commonMasks);
Expect.equals(union1, union2);
}
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index 16c322e..7b922fd 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,5 +1,5 @@
name: dart_internal
-version: 0.1.9
+version: 0.1.10
author: "Dart Team <misc@dartlang.org>"
homepage: http://www.dartlang.org
description: >
@@ -16,4 +16,4 @@
environment:
# Restrict the upper bound so that we can remove support for this in a later
# version of the SDK without it being a breaking change.
- sdk: ">=2.0.0-dev.12.0 <2.9.0"
+ sdk: ">=2.0.0-dev.12.0 <2.10.0"
diff --git a/pkg/dartdev/README.md b/pkg/dartdev/README.md
index 6be1917..f2662cc 100644
--- a/pkg/dartdev/README.md
+++ b/pkg/dartdev/README.md
@@ -24,8 +24,17 @@
Run "dart help <command>" for more information about a command.
```
+## Contributing
+
+If you'd like to contribute to the Dart CLI tool, please start by reading the
+[contribution guidelines][contributing] for the Dart project. Then familiarize
+yourself with the [design principles][design] that guide this tool's UX.
+
## Features and bugs
-Please file feature requests and bugs in the Dart SDK [issue tracker][tracker] with label `area-dart-cli`.
+Please file feature requests and bugs in the Dart SDK [issue tracker][tracker]
+with label `area-dart-cli`.
+[contributing]: https://github.com/dart-lang/sdk/blob/master/CONTRIBUTING.md
+[design] https://github.com/dart-lang/sdk/blob/master/pkg/dartdev/doc/design.md
[tracker]: https://github.com/dart-lang/sdk/labels/area-dart-cli
diff --git a/pkg/dartdev/doc/design.md b/pkg/dartdev/doc/design.md
new file mode 100644
index 0000000..328ead6
--- /dev/null
+++ b/pkg/dartdev/doc/design.md
@@ -0,0 +1,20 @@
+# Design Principles
+
+The purpose of this document is to capture the design principles that should be
+followed when designing new commands or updating existing ones. The goal is to
+ensure that the dartdev tool provides a consistent UX.
+
+## Status
+
+This is a work in progress. At the moment we are just capturing the ideas that
+are coming out of discussions. They will need to be organized and more fully
+documented at some point.
+
+## Command Arguments
+
+### Default Target
+
+If the command cannot have side effects (such as analyze) then the argument for
+what to operate on should default to the CWD, but if the command can have side
+effects (such as format or fix) then the argument for what to operate on should
+be required.
diff --git a/pkg/dartdev/lib/dartdev.dart b/pkg/dartdev/lib/dartdev.dart
index b21d5ab..0b4e5f9 100644
--- a/pkg/dartdev/lib/dartdev.dart
+++ b/pkg/dartdev/lib/dartdev.dart
@@ -189,6 +189,8 @@
addCommand(AnalyzeCommand());
addCommand(CreateCommand(verbose: verbose));
addCommand(CompileCommand());
+// Enable experimental `fix` command
+// addCommand(FixCommand());
addCommand(FormatCommand());
addCommand(MigrateCommand(verbose: verbose));
addCommand(PubCommand());
diff --git a/pkg/dartdev/lib/src/commands/analyze_impl.dart b/pkg/dartdev/lib/src/commands/analyze_impl.dart
index 0918864..bc3a7bd 100644
--- a/pkg/dartdev/lib/src/commands/analyze_impl.dart
+++ b/pkg/dartdev/lib/src/commands/analyze_impl.dart
@@ -6,6 +6,8 @@
import 'dart:convert';
import 'dart:io';
+import 'package:analysis_server_client/protocol.dart'
+ show EditBulkFixesResult, ResponseDecoder;
import 'package:path/path.dart' as path;
import '../core.dart';
@@ -22,18 +24,24 @@
Process _process;
final StreamController<bool> _analyzingController =
StreamController<bool>.broadcast();
+ final StreamController<EditBulkFixesResult> _bulkFixesController =
+ StreamController<EditBulkFixesResult>.broadcast();
final StreamController<FileAnalysisErrors> _errorsController =
StreamController<FileAnalysisErrors>.broadcast();
bool _didServerErrorOccur = false;
int _id = 0;
+ String _fixRequestId;
+
bool get didServerErrorOccur => _didServerErrorOccur;
Stream<bool> get onAnalyzing => _analyzingController.stream;
Stream<FileAnalysisErrors> get onErrors => _errorsController.stream;
+ Stream<EditBulkFixesResult> get onBulkFixes => _bulkFixesController.stream;
+
Future<int> get onExit => _process.exitCode;
Future<void> start() async {
@@ -81,6 +89,13 @@
});
}
+ void requestBulkFixes(String filePath) {
+ _sendCommand('edit.bulkFixes', <String, dynamic>{
+ 'included': [path.canonicalize(filePath)],
+ });
+ _fixRequestId = _id.toString();
+ }
+
void _sendCommand(String method, Map<String, dynamic> params) {
final String message = json.encode(<String, dynamic>{
'id': (++_id).toString(),
@@ -123,6 +138,11 @@
}
// Dispose of the process at this point so the process doesn't hang.
dispose();
+ } else if (response['id'] == _fixRequestId) {
+ var decoder = ResponseDecoder(null);
+ var result =
+ EditBulkFixesResult.fromJson(decoder, 'result', response['result']);
+ _bulkFixesController.add(result);
}
}
}
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 87f9480..1a804bd 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -11,6 +11,7 @@
import '../core.dart';
import '../sdk.dart';
+import '../vm_interop_handler.dart';
const int compileErrorExitCode = 64;
@@ -65,6 +66,19 @@
@override
FutureOr<int> run() async {
+ if (!Sdk.checkArtifactExists(sdk.dart2js)) {
+ return 255;
+ }
+ final String librariesPath = path.absolute(
+ sdk.sdkPath,
+ 'lib',
+ 'libraries.json',
+ );
+
+ if (!Sdk.checkArtifactExists(librariesPath)) {
+ return 255;
+ }
+
// We expect a single rest argument; the dart entry point.
if (argResults.rest.length != 1) {
log.stderr('Missing Dart entry point.');
@@ -76,9 +90,11 @@
return -1;
}
- final process = await startProcess(sdk.dart2js, argResults.arguments);
- routeToStdout(process);
- return process.exitCode;
+ VmInteropHandler.run(sdk.dart2js, [
+ '--libraries-spec=$librariesPath',
+ ...argResults.arguments,
+ ]);
+ return 0;
}
}
@@ -135,6 +151,7 @@
args.add(path.canonicalize(sourcePath));
log.stdout('Compiling $sourcePath to $commandName file $outputFile.');
+ // TODO(bkonyi): perform compilation in same process.
final process = await startProcess(sdk.dart, args);
routeToStdout(process);
return process.exitCode;
@@ -176,6 +193,10 @@
@override
FutureOr<int> run() async {
+ if (!Sdk.checkArtifactExists(genKernel) ||
+ !Sdk.checkArtifactExists(genSnapshot)) {
+ return 255;
+ }
// We expect a single rest argument; the dart entry point.
if (argResults.rest.length != 1) {
log.stderr('Missing Dart entry point.');
diff --git a/pkg/dartdev/lib/src/commands/create.dart b/pkg/dartdev/lib/src/commands/create.dart
index 55d53d8..2a2d424 100644
--- a/pkg/dartdev/lib/src/commands/create.dart
+++ b/pkg/dartdev/lib/src/commands/create.dart
@@ -96,6 +96,9 @@
);
if (argResults['pub']) {
+ if (!Sdk.checkArtifactExists(sdk.pub)) {
+ return 255;
+ }
log.stdout('');
var progress = log.progress('Running pub get');
var process = await startProcess(
diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
new file mode 100644
index 0000000..b0c09b0
--- /dev/null
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -0,0 +1,86 @@
+// 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';
+import 'dart:io';
+
+import 'package:analysis_server_client/protocol.dart' hide AnalysisError;
+import 'package:path/path.dart' as path;
+
+import '../core.dart';
+import '../sdk.dart';
+import '../utils.dart';
+import 'analyze_impl.dart';
+
+class FixCommand extends DartdevCommand {
+ FixCommand()
+ : super(
+ 'fix', 'Fix Dart source code.',
+ // Experimental.
+ hidden: true,
+ );
+
+ @override
+ FutureOr<int> run() async {
+ log.stdout('\n*** The `fix` command is provisional and subject to change '
+ 'or removal in future releases. ***\n');
+
+ if (argResults.rest.length > 1) {
+ usageException('Only one file or directory is expected.');
+ }
+
+ var dir = argResults.rest.isEmpty
+ ? Directory.current
+ : Directory(argResults.rest.single);
+ if (!dir.existsSync()) {
+ usageException("Directory doesn't exist: ${dir.path}");
+ }
+
+ var bulkFixCompleter = Completer<void>();
+ var progress =
+ log.progress('Computing fixes in ${path.basename(dir.path)}');
+
+ var server = AnalysisServer(
+ Directory(sdk.sdkPath),
+ [dir],
+ );
+
+ await server.start();
+ //ignore: unawaited_futures
+ server.onExit.then((int exitCode) {
+ if (!bulkFixCompleter.isCompleted) {
+ bulkFixCompleter.completeError('analysis server exited: $exitCode');
+ }
+ });
+
+ List<SourceFileEdit> edits;
+ server.onBulkFixes.listen((EditBulkFixesResult fixes) {
+ edits = fixes.edits;
+ bulkFixCompleter.complete();
+ });
+ server.requestBulkFixes(dir.absolute.path);
+
+ await bulkFixCompleter.future;
+ await server.dispose();
+ progress.finish(showTiming: true);
+
+ if (edits.isEmpty) {
+ log.stdout('Nothing to fix!');
+ } else {
+ // todo (pq): consider a summary if more than `n` fixes are applied
+ // (look at `dartfmt`)
+ log.stdout('Applying fixes to:');
+ for (var edit in edits) {
+ var file = File(edit.file);
+ log.stdout(' ${relativePath(file.path, dir)}');
+ var code = file.existsSync() ? file.readAsStringSync() : '';
+ code = SourceEdit.applySequence(code, edit.edits);
+ file.writeAsStringSync(code);
+ }
+ log.stdout('Done.');
+ }
+
+ return 0;
+ }
+}
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index c062eb6..94ca988 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -3,13 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
-import 'dart:io';
import 'package:args/args.dart';
import '../core.dart';
import '../experiments.dart';
import '../sdk.dart';
+import '../vm_interop_handler.dart';
class PubCommand extends DartdevCommand<int> {
PubCommand() : super('pub', 'Work with packages.');
@@ -22,26 +22,23 @@
// Override [printUsage] for invocations of 'dart help pub' which won't
// execute [run] below. Without this, the 'dart help pub' reports the
// command pub with no commands or flags.
+ if (!Sdk.checkArtifactExists(sdk.pub)) {
+ return;
+ }
final command = sdk.pub;
final args = ['help'];
log.trace('$command ${args.first}');
// Call 'pub help'
- // Process.runSync(..) is used since [printUsage] is not an async method,
- // and we want to guarantee that the result (the help text for the console)
- // is printed before command exits.
- final result = Process.runSync(command, args);
- if (result.stderr.isNotEmpty) {
- stderr.write(result.stderr);
- }
- if (result.stdout.isNotEmpty) {
- stdout.write(result.stdout);
- }
+ VmInteropHandler.run(command, args);
}
@override
FutureOr<int> run() async {
+ if (!Sdk.checkArtifactExists(sdk.pub)) {
+ return 255;
+ }
final command = sdk.pub;
var args = argResults.arguments;
@@ -65,12 +62,7 @@
}
log.trace('$command ${args.join(' ')}');
-
- // Starting in ProcessStartMode.inheritStdio mode means the child process
- // can detect support for ansi chars.
- var process =
- await Process.start(command, args, mode: ProcessStartMode.inheritStdio);
-
- return process.exitCode;
+ VmInteropHandler.run(command, args);
+ return 0;
}
}
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index 9649377..d118dbc 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -119,24 +119,33 @@
// service intermediary which implements the VM service protocol and
// provides non-VM specific extensions (e.g., log caching, client
// synchronization).
+ // TODO(bkonyi): Handle race condition made possible by Observatory
+ // listening message being printed to console before DDS is started.
+ // See https://github.com/dart-lang/sdk/issues/42727
+ launchDds = false;
_DebuggingSession debugSession;
if (launchDds) {
debugSession = _DebuggingSession();
- await debugSession.start();
+ if (!await debugSession.start()) {
+ return 255;
+ }
}
-
- final script = Directory.current.uri
- .resolve(args.firstWhere((e) => !e.startsWith('-')))
- .toFilePath();
+ final path = args.firstWhere((e) => !e.startsWith('-'));
final runArgs = args.length == 1 ? <String>[] : args.sublist(1);
- VmInteropHandler.run(script, runArgs);
+ VmInteropHandler.run(path, runArgs);
return 0;
}
}
class _DebuggingSession {
- Future<void> start() async {
+ Future<bool> start() async {
final serviceInfo = await Service.getInfo();
+ final ddsSnapshot = (dirname(sdk.dart).endsWith('bin'))
+ ? sdk.ddsSnapshot
+ : absolute(dirname(sdk.dart), 'gen', 'dds.dart.snapshot');
+ if (!Sdk.checkArtifactExists(ddsSnapshot)) {
+ return false;
+ }
final process = await Process.start(
sdk.dart,
[
@@ -157,5 +166,6 @@
});
await completer.future;
+ return true;
}
}
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index ccc8268..cf40ee1 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -3,13 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
-import 'dart:io';
import 'package:args/args.dart';
import '../core.dart';
import '../experiments.dart';
import '../sdk.dart';
+import '../vm_interop_handler.dart';
class TestCommand extends DartdevCommand<int> {
TestCommand() : super('test', 'Runs tests in this project.');
@@ -19,29 +19,34 @@
@override
void printUsage() {
+ if (!Sdk.checkArtifactExists(sdk.pub)) {
+ return;
+ }
+ if ((project.packageConfig != null) &&
+ !project.packageConfig.hasDependency('test')) {
+ _printPackageTestInstructions();
+ }
final command = sdk.pub;
final args = ['run', 'test', '--help'];
log.trace('$command ${args.join(' ')}');
-
- final result = Process.runSync(command, args);
- if (result.stderr.isNotEmpty) {
- stderr.write(result.stderr);
- }
- if (result.stdout.isNotEmpty) {
- stdout.write(result.stdout);
- }
-
- // "Could not find package "test". Did you forget to add a dependency?"
- if (result.exitCode == 65 && project.hasPackageConfigFile) {
- if (!project.packageConfig.hasDependency('test')) {
- _printPackageTestInstructions();
- }
- }
+ VmInteropHandler.run(command, args);
}
@override
FutureOr<int> run() async {
+ if (!Sdk.checkArtifactExists(sdk.pub)) {
+ return 255;
+ }
+ // "Could not find package "test". Did you forget to add a dependency?"
+ if (project.hasPackageConfigFile) {
+ if ((project.packageConfig != null) &&
+ !project.packageConfig.hasDependency('test')) {
+ _printPackageTestInstructions();
+ return 65;
+ }
+ }
+
final command = sdk.pub;
final testArgs = argResults.arguments.toList();
@@ -54,22 +59,8 @@
];
log.trace('$command ${args.join(' ')}');
-
- // Starting in ProcessStartMode.inheritStdio mode means the child process
- // can detect support for ansi chars.
- var process =
- await Process.start(command, args, mode: ProcessStartMode.inheritStdio);
-
- int exitCode = await process.exitCode;
-
- // "Could not find package "test". Did you forget to add a dependency?"
- if (exitCode == 65 && project.hasPackageConfigFile) {
- if (!project.packageConfig.hasDependency('test')) {
- _printPackageTestInstructions();
- }
- }
-
- return exitCode;
+ VmInteropHandler.run(command, args);
+ return 0;
}
void _printPackageTestInstructions() {
diff --git a/pkg/dartdev/lib/src/sdk.dart b/pkg/dartdev/lib/src/sdk.dart
index 537089f..ec20cc8 100644
--- a/pkg/dartdev/lib/src/sdk.dart
+++ b/pkg/dartdev/lib/src/sdk.dart
@@ -6,6 +6,8 @@
import 'package:path/path.dart' as path;
+import 'core.dart';
+
final Sdk sdk = Sdk();
String get _computeSdkPath {
@@ -46,17 +48,48 @@
String get dart => Platform.resolvedExecutable;
String get analysisServerSnapshot => path.absolute(
- sdkPath, 'bin', 'snapshots', 'analysis_server.dart.snapshot');
+ sdkPath,
+ 'bin',
+ 'snapshots',
+ 'analysis_server.dart.snapshot',
+ );
- String get dart2js => path.absolute(sdkPath, 'bin', _binName('dart2js'));
+ String get dart2js => path.absolute(
+ sdkPath,
+ 'bin',
+ 'snapshots',
+ 'dart2js.dart.snapshot',
+ );
- String get dartfmt => path.absolute(sdkPath, 'bin', _binName('dartfmt'));
+ String get dartfmt => path.absolute(
+ sdkPath,
+ 'bin',
+ _binName('dartfmt'),
+ );
- String get ddsSnapshot =>
- path.absolute(sdkPath, 'bin', 'snapshots', 'dds.dart.snapshot');
+ String get ddsSnapshot => path.absolute(
+ sdkPath,
+ 'bin',
+ 'snapshots',
+ 'dds.dart.snapshot',
+ );
- String get pub => path.absolute(sdkPath, 'bin', _binName('pub'));
+ String get pub => path.absolute(
+ sdkPath,
+ 'bin',
+ 'snapshots',
+ 'pub.dart.snapshot',
+ );
static String _binName(String base) =>
Platform.isWindows ? '$base.bat' : base;
+
+ static bool checkArtifactExists(String path) {
+ if (!File(path).existsSync()) {
+ log.stderr('Could not find $path. Have you built the full '
+ 'Dart SDK?');
+ return false;
+ }
+ return true;
+ }
}
diff --git a/pkg/dartdev/lib/src/utils.dart b/pkg/dartdev/lib/src/utils.dart
index a4ec262..be9dcfb 100644
--- a/pkg/dartdev/lib/src/utils.dart
+++ b/pkg/dartdev/lib/src/utils.dart
@@ -8,6 +8,15 @@
/// Emit the given word with the correct pluralization.
String pluralize(String word, int count) => count == 1 ? word : '${word}s';
+/// Make an absolute [filePath] relative to [dir] (for display purposes).
+String relativePath(String filePath, Directory dir) {
+ var root = dir.absolute.path;
+ if (filePath.startsWith(root)) {
+ return filePath.substring(root.length + 1);
+ }
+ return filePath;
+}
+
/// String utility to trim some suffix from the end of a [String].
String trimEnd(String s, String suffix) {
if (s != null && suffix != null && suffix.isNotEmpty && s.endsWith(suffix)) {
diff --git a/pkg/dartdev/lib/src/vm_interop_handler.dart b/pkg/dartdev/lib/src/vm_interop_handler.dart
index 3a8fea9..fcf419c 100644
--- a/pkg/dartdev/lib/src/vm_interop_handler.dart
+++ b/pkg/dartdev/lib/src/vm_interop_handler.dart
@@ -17,7 +17,8 @@
final message = List<dynamic>.filled(3, null)
..[0] = _kResultRun
..[1] = script
- ..[2] = args;
+ // Copy the list so it doesn't get GC'd underneath us.
+ ..[2] = args.toList();
_port.send(message);
}
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
new file mode 100644
index 0000000..4da8ddb
--- /dev/null
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -0,0 +1,15 @@
+// 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 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+ group('fix', defineFix, timeout: longTimeout);
+}
+
+void defineFix() {
+ // todo (pq): add tests when the `fix` command is enabled.
+}
diff --git a/pkg/dartdev/test/smoke/implicit_smoke_test.dart b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
new file mode 100644
index 0000000..95053da
--- /dev/null
+++ b/pkg/dartdev/test/smoke/implicit_smoke_test.dart
@@ -0,0 +1,55 @@
+// 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:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+ group(
+ 'implicit dartdev smoke -',
+ () {
+ test('dart smoke.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ script,
+ ],
+ );
+ expect(result.exitCode, 0);
+ expect(result.stdout, contains('Smoke test!'));
+ expect(result.stderr, isEmpty);
+ }
+ });
+
+ // This test forces dartdev to run implicitly and for
+ // DDS to spawn in a separate process.
+ test('dart --enable-vm-service smoke.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ '--enable-vm-service=0',
+ script,
+ ],
+ );
+ expect(result.exitCode, 0);
+ expect(result.stdout, contains('Smoke test!'));
+ expect(result.stderr, isEmpty);
+ }
+ });
+ },
+ timeout: Timeout.none,
+ );
+}
diff --git a/pkg/dartdev/test/smoke/invalid_smoke_test.dart b/pkg/dartdev/test/smoke/invalid_smoke_test.dart
new file mode 100644
index 0000000..3c2d61c
--- /dev/null
+++ b/pkg/dartdev/test/smoke/invalid_smoke_test.dart
@@ -0,0 +1,119 @@
+// 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:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+ group(
+ 'implicit dartdev smoke -',
+ () {
+ test('dart invalid.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ 'invalid.dart',
+ ],
+ );
+ expect(result.exitCode, 64);
+ expect(result.stdout, isEmpty);
+ expect(
+ result.stderr,
+ contains(
+ 'Error when reading \'invalid.dart\':'
+ ' No such file or directory',
+ ),
+ );
+ }
+ });
+
+ // This test forces dartdev to run implicitly and for
+ // DDS to spawn in a separate process..
+ test('dart --enable-vm-service invalid.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ '--enable-vm-service=0',
+ 'invalid.dart',
+ ],
+ );
+ expect(result.exitCode, 64);
+ expect(result.stdout, contains('Observatory listening'));
+ expect(
+ result.stderr,
+ contains(
+ 'Error when reading \'invalid.dart\':'
+ ' No such file or directory',
+ ),
+ );
+ }
+ });
+
+ test('dart run invalid.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ 'run',
+ 'invalid.dart',
+ ],
+ );
+ expect(result.exitCode, 254);
+ expect(result.stdout, isEmpty);
+ expect(
+ result.stderr,
+ contains(
+ 'Error when reading \'invalid.dart\':'
+ ' No such file or directory',
+ ),
+ );
+ }
+ });
+
+ // This test forces DDS to spawn in a separate process.
+ test('dart run --enable-vm-service invalid.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ 'run',
+ '--enable-vm-service=0',
+ 'invalid.dart',
+ ],
+ );
+ expect(result.exitCode, 254);
+ expect(result.stdout, contains('Observatory listening'));
+ expect(
+ result.stderr,
+ contains(
+ 'Error when reading \'invalid.dart\':'
+ ' No such file or directory',
+ ),
+ );
+ }
+ });
+ },
+ timeout: Timeout.none,
+ // TODO(bkonyi): Fails consistently on bots, need to investigate.
+ skip: true,
+ );
+}
diff --git a/pkg/dartdev/test/smoke/smoke.dart b/pkg/dartdev/test/smoke/smoke.dart
new file mode 100644
index 0000000..a6a5181
--- /dev/null
+++ b/pkg/dartdev/test/smoke/smoke.dart
@@ -0,0 +1,7 @@
+// 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.
+
+void main() {
+ print('Smoke test!');
+}
diff --git a/pkg/dartdev/test/smoke/smoke_test.dart b/pkg/dartdev/test/smoke/smoke_test.dart
new file mode 100644
index 0000000..336db24
--- /dev/null
+++ b/pkg/dartdev/test/smoke/smoke_test.dart
@@ -0,0 +1,56 @@
+// 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:io';
+
+import 'package:test/test.dart';
+
+const numRuns = 10;
+final script = Platform.script.resolve('smoke.dart').toString();
+
+void main() {
+ group(
+ 'explicit dartdev smoke -',
+ () {
+ test('dart run smoke.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ 'run',
+ script,
+ ],
+ );
+ expect(result.exitCode, 0);
+ expect(result.stdout, contains('Smoke test!'));
+ expect(result.stderr, isEmpty);
+ }
+ });
+
+ // This test forces DDS to spawn in a separate process.
+ test('dart run --enable-vm-service smoke.dart', () async {
+ for (int i = 1; i <= numRuns; ++i) {
+ if (i % 5 == 0) {
+ print('Done [$i/$numRuns]');
+ }
+ final result = await Process.run(
+ Platform.executable,
+ [
+ 'run',
+ '--enable-vm-service=0',
+ script,
+ ],
+ );
+ expect(result.exitCode, 0);
+ expect(result.stdout, contains('Smoke test!'));
+ expect(result.stderr, isEmpty);
+ }
+ });
+ },
+ timeout: Timeout.none,
+ );
+}
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 153ebb9..0c45d45 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -8,6 +8,7 @@
import 'commands/analyze_test.dart' as analyze;
import 'commands/compile_test.dart' as compile;
import 'commands/create_test.dart' as create;
+import 'commands/fix_test.dart' as fix;
import 'commands/flag_test.dart' as flag;
import 'commands/format_test.dart' as format;
import 'commands/help_test.dart' as help;
@@ -24,6 +25,7 @@
analytics.main();
analyze.main();
create.main();
+ fix.main();
flag.main();
format.main();
help.main();
diff --git a/pkg/dartdev/test/utils_test.dart b/pkg/dartdev/test/utils_test.dart
index 1a579c8..199d461 100644
--- a/pkg/dartdev/test/utils_test.dart
+++ b/pkg/dartdev/test/utils_test.dart
@@ -24,6 +24,18 @@
});
});
+ group('relativePath', () {
+ test('direct', () {
+ var dir = Directory('foo');
+ expect(relativePath('path', dir), 'path');
+ });
+
+ test('nested', () {
+ var dir = Directory('foo');
+ expect(relativePath(join(dir.absolute.path, 'path'), dir), 'path');
+ });
+ });
+
group('trimEnd', () {
test('null string', () {
expect(trimEnd(null, 'suffix'), null);
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 0801c1c..a040dc9 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -5300,11 +5300,11 @@
// Generate `is` as `dart.is` or `typeof` depending on the RHS type.
var lhs = _visitExpression(operand);
var typeofName = _typeRep.typeFor(type).primitiveTypeOf;
- // Inline primitives other than int (which requires a Math.floor check).
+ // Inline non-nullable primitive types other than int (which requires a
+ // Math.floor check).
if (typeofName != null &&
- type != _types.coreTypes.intLegacyRawType &&
- type != _types.coreTypes.intNonNullableRawType &&
- type != _types.coreTypes.intNullableRawType) {
+ type.nullability == Nullability.nonNullable &&
+ type != _types.coreTypes.intNonNullableRawType) {
return js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
} else {
return js.call('#.is(#)', [_emitType(type), lhs]);
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 6d31716..33e19e8 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -186,10 +186,8 @@
return createInvocation('getter', [SymbolLiteral(name.substring(4))]);
}
if (name.startsWith('set:')) {
- return createInvocation('setter', [
- SymbolLiteral(name.substring(4) + '='),
- arguments.positional.single
- ]);
+ return createInvocation('setter',
+ [SymbolLiteral(name.substring(4)), arguments.positional.single]);
}
var ctorArgs = <Expression>[
SymbolLiteral(name),
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index e5b469e..1abf518 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -3,8 +3,8 @@
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '>>': JSNumber.>> (num Function(num)), int.>> (int Function(int)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '\|': JSNumber.\| (num Function(num)), int.\| (int Function(int)).
ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1659|7|5|Superinterfaces don't have a valid override for '^': JSNumber.^ (num Function(num)), int.^ (int Function(int)).
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1676|28|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1678|27|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1681|17|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|18|1|The operator '&' isn't defined for the type 'JSInt'.
-ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|44|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1676|28|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1678|27|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1681|17|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|18|1|The operator '&' isn't defined for the type 'JSInt'.
+ERROR|COMPILE_TIME_ERROR|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1686|44|1|The operator '&' isn't defined for the type 'JSInt'.
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
index bc825bc..0696d1c 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags_generated.dart
@@ -19,6 +19,7 @@
setLiterals,
spreadCollections,
tripleShift,
+ valueClass,
variance,
}
@@ -32,6 +33,7 @@
const Version enableSetLiteralsVersion = const Version(2, 2);
const Version enableSpreadCollectionsVersion = const Version(2, 2);
const Version enableTripleShiftVersion = const Version(2, 10);
+const Version enableValueClassVersion = const Version(2, 10);
const Version enableVarianceVersion = const Version(2, 10);
ExperimentalFlag parseExperimentalFlag(String flag) {
@@ -54,6 +56,8 @@
return ExperimentalFlag.spreadCollections;
case "triple-shift":
return ExperimentalFlag.tripleShift;
+ case "value-class":
+ return ExperimentalFlag.valueClass;
case "variance":
return ExperimentalFlag.variance;
}
@@ -70,6 +74,7 @@
ExperimentalFlag.setLiterals: true,
ExperimentalFlag.spreadCollections: true,
ExperimentalFlag.tripleShift: false,
+ ExperimentalFlag.valueClass: false,
ExperimentalFlag.variance: false,
};
@@ -83,6 +88,7 @@
ExperimentalFlag.setLiterals: true,
ExperimentalFlag.spreadCollections: true,
ExperimentalFlag.tripleShift: false,
+ ExperimentalFlag.valueClass: false,
ExperimentalFlag.variance: false,
};
@@ -108,6 +114,15 @@
"collection": {
ExperimentalFlag.nonNullable,
},
+ "convert": {
+ ExperimentalFlag.nonNullable,
+ },
+ "crypto": {
+ ExperimentalFlag.nonNullable,
+ },
+ "csslib": {
+ ExperimentalFlag.nonNullable,
+ },
"dart_internal": {
ExperimentalFlag.nonNullable,
},
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index a5f2286..7a7f258 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -857,10 +857,12 @@
Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
String prefix =
procedure.isGetter ? 'get:' : procedure.isSetter ? 'set:' : '';
+ String invocationName = prefix + procedure.name.name;
+ if (procedure.isSetter) invocationName += '=';
Expression invocation = target.backendTarget.instantiateInvocation(
target.loader.coreTypes,
new ThisExpression(),
- prefix + procedure.name.name,
+ invocationName,
new Arguments.forwarded(procedure.function, library.library),
procedure.fileOffset,
/*isSuper=*/ false);
@@ -1419,15 +1421,15 @@
InterfaceType supertype = cls.supertype.asInterfaceType;
Substitution substitution = Substitution.fromSupertype(cls.mixedInType);
for (Supertype constraint in cls.mixedInClass.superclassConstraints()) {
- InterfaceType interface =
+ InterfaceType requiredInterface =
substitution.substituteSupertype(constraint).asInterfaceType;
- if (hierarchy.getTypeAsInstanceOf(
- supertype, interface.classNode, library.library, coreTypes) !=
- interface) {
+ InterfaceType implementedInterface = hierarchy.getTypeAsInstanceOf(
+ supertype, requiredInterface.classNode, library.library, coreTypes);
+ if (implementedInterface != requiredInterface) {
library.addProblem(
templateMixinApplicationIncompatibleSupertype.withArguments(
supertype,
- interface,
+ requiredInterface,
cls.mixedInType.asInterfaceType,
library.isNonNullableByDefault),
cls.fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
index 7bb3453..6927bdd7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_cfe_generated.dart
@@ -2197,6 +2197,33 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
+ templateNonNullAwareSpreadIsNull = const Template<
+ Message Function(DartType _type, bool isNonNullableByDefault)>(
+ messageTemplate: r"""Can't spread a value with static type '#type'.""",
+ withArguments: _withArgumentsNonNullAwareSpreadIsNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+ codeNonNullAwareSpreadIsNull =
+ const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+ "NonNullAwareSpreadIsNull",
+ templateNonNullAwareSpreadIsNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullAwareSpreadIsNull(
+ DartType _type, bool isNonNullableByDefault) {
+ TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+ List<Object> typeParts = labeler.labelType(_type);
+ String type = typeParts.join();
+ return new Message(codeNonNullAwareSpreadIsNull,
+ message: """Can't spread a value with static type '${type}'.""" +
+ labeler.originMessages,
+ arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String name, DartType _type, bool isNonNullableByDefault)>
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 bce8e77..e6a04b2 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
@@ -17,6 +17,7 @@
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/src/nnbd_top_merge.dart';
import 'package:kernel/src/norm.dart';
+import 'package:kernel/src/standard_bounds.dart';
import 'package:kernel/src/types.dart' show Types;
import '../../testing/id_testing_utils.dart' show typeToText;
@@ -67,7 +68,7 @@
import '../source/source_loader.dart' show SourceLoader;
-import '../type_inference/standard_bounds.dart' show StandardBounds;
+import '../type_inference/standard_bounds.dart' show TypeSchemaStandardBounds;
import '../type_inference/type_constraint_gatherer.dart'
show TypeConstraintGatherer;
@@ -512,7 +513,8 @@
return asSupertypeOf(type, superclass)?.typeArguments;
}
- InterfaceType getKernelLegacyLeastUpperBound(
+ @override
+ InterfaceType getLegacyLeastUpperBound(
InterfaceType type1, InterfaceType type2, Library clientLibrary) {
if (type1 == type2) return type1;
@@ -2529,7 +2531,7 @@
}
class TypeBuilderConstraintGatherer extends TypeConstraintGatherer
- with StandardBounds {
+ with StandardBounds, TypeSchemaStandardBounds {
final ClassHierarchyBuilder hierarchy;
TypeBuilderConstraintGatherer(this.hierarchy,
@@ -2587,13 +2589,6 @@
bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
return isSubtypeOf(s, t, mode) && isSubtypeOf(t, s, mode);
}
-
- @override
- InterfaceType getLegacyLeastUpperBound(
- InterfaceType type1, InterfaceType type2, Library clientLibrary) {
- return hierarchy.getKernelLegacyLeastUpperBound(
- type1, type2, clientLibrary);
- }
}
class DelayedOverrideCheck {
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 415e851..8ed64425 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -600,11 +600,6 @@
..fileOffset = node.readOffset;
}
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, read, readType, node.binaryName, node.rhs);
- Expression binary = binaryResult.expression;
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = node.setter == null
? const ObjectAccessTarget.missing()
: new ExtensionAccessTarget(
@@ -612,6 +607,17 @@
DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ valueType,
+ read,
+ readType,
+ node.binaryName,
+ node.rhs);
+
+ Expression binary = binaryResult.expression;
+ DartType binaryType = binaryResult.inferredType;
+
Expression value = inferrer.ensureAssignable(valueType, binaryType, binary,
isVoidAllowed: true);
@@ -1322,21 +1328,27 @@
}
DartType getSpreadElementType(DartType spreadType, bool isNullAware) {
- if (spreadType is InterfaceType) {
- if (spreadType.classNode == inferrer.coreTypes.nullClass) {
- if (inferrer.isNonNullableByDefault) {
- return isNullAware ? const NeverType(Nullability.nonNullable) : null;
- } else {
- return isNullAware ? spreadType : null;
- }
+ DartType typeBound = inferrer.resolveTypeParameter(spreadType);
+ if (inferrer.coreTypes.isNull(typeBound)) {
+ if (inferrer.isNonNullableByDefault) {
+ return isNullAware ? const NeverType(Nullability.nonNullable) : null;
+ } else {
+ return isNullAware ? inferrer.coreTypes.nullType : null;
}
+ }
+ if (typeBound is InterfaceType) {
List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
.getTypeArgumentsAsInstanceOf(
- spreadType, inferrer.coreTypes.iterableClass);
- if (supertypeArguments == null) return null;
+ typeBound, inferrer.coreTypes.iterableClass);
+ if (supertypeArguments == null) {
+ return null;
+ }
return supertypeArguments.single;
+ } else if (spreadType is DynamicType) {
+ return const DynamicType();
+ } else if (inferrer.coreTypes.isBottom(spreadType)) {
+ return const NeverType(Nullability.nonNullable);
}
- if (spreadType is DynamicType) return const DynamicType();
return null;
}
@@ -1368,11 +1380,12 @@
DartType spreadElementType =
getSpreadElementType(spreadType, element.isNullAware);
if (spreadElementType == null) {
- if (spreadType is InterfaceType &&
- spreadType.classNode == inferrer.coreTypes.nullClass &&
+ if (inferrer.coreTypes
+ .isNull(inferrer.resolveTypeParameter(spreadType)) &&
!element.isNullAware) {
replacement = inferrer.helper.buildProblem(
- messageNonNullAwareSpreadIsNull,
+ templateNonNullAwareSpreadIsNull.withArguments(
+ spreadType, inferrer.isNonNullableByDefault),
element.expression.fileOffset,
1);
} else {
@@ -1728,28 +1741,28 @@
// is a function type, the original values in output are preserved.
void storeSpreadMapEntryElementTypes(DartType spreadMapEntryType,
bool isNullAware, List<DartType> output, int offset) {
- if (spreadMapEntryType is InterfaceType) {
- if (spreadMapEntryType.classNode == inferrer.coreTypes.nullClass) {
- if (isNullAware) {
- if (inferrer.isNonNullableByDefault) {
- output[offset] =
- output[offset + 1] = const NeverType(Nullability.nonNullable);
- } else {
- output[offset] = output[offset + 1] = spreadMapEntryType;
- }
- }
- } else {
- List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
- .getTypeArgumentsAsInstanceOf(
- spreadMapEntryType, inferrer.coreTypes.mapClass);
- if (supertypeArguments != null) {
- output[offset] = supertypeArguments[0];
- output[offset + 1] = supertypeArguments[1];
+ DartType typeBound = inferrer.resolveTypeParameter(spreadMapEntryType);
+ if (inferrer.coreTypes.isNull(typeBound)) {
+ if (isNullAware) {
+ if (inferrer.isNonNullableByDefault) {
+ output[offset] =
+ output[offset + 1] = const NeverType(Nullability.nonNullable);
+ } else {
+ output[offset] = output[offset + 1] = inferrer.coreTypes.nullType;
}
}
- }
- if (spreadMapEntryType is DynamicType) {
+ } else if (typeBound is InterfaceType) {
+ List<DartType> supertypeArguments = inferrer.typeSchemaEnvironment
+ .getTypeArgumentsAsInstanceOf(typeBound, inferrer.coreTypes.mapClass);
+ if (supertypeArguments != null) {
+ output[offset] = supertypeArguments[0];
+ output[offset + 1] = supertypeArguments[1];
+ }
+ } else if (spreadMapEntryType is DynamicType) {
output[offset] = output[offset + 1] = const DynamicType();
+ } else if (inferrer.coreTypes.isBottom(spreadMapEntryType)) {
+ output[offset] =
+ output[offset + 1] = const NeverType(Nullability.nonNullable);
}
}
@@ -1794,12 +1807,15 @@
MapEntry replacement = entry;
if (typeChecksNeeded) {
if (actualKeyType == null) {
- if (spreadType is InterfaceType &&
- spreadType.classNode == inferrer.coreTypes.nullClass &&
+ if (inferrer.coreTypes
+ .isNull(inferrer.resolveTypeParameter(spreadType)) &&
!entry.isNullAware) {
replacement = new MapEntry(
- inferrer.helper.buildProblem(messageNonNullAwareSpreadIsNull,
- entry.expression.fileOffset, 1),
+ inferrer.helper.buildProblem(
+ templateNonNullAwareSpreadIsNull.withArguments(
+ spreadType, inferrer.isNonNullableByDefault),
+ entry.expression.fileOffset,
+ 1),
new NullLiteral())
..fileOffset = entry.fileOffset;
} else if (actualElementType != null) {
@@ -2612,14 +2628,20 @@
Expression read = readResult.expression;
DartType readType = readResult.inferredType;
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, read, readType, node.binaryName, node.rhs);
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
receiverType, node.propertyName, node.writeOffset,
setter: true, instrumented: true, includeExtensionMethods: true);
DartType writeType = inferrer.getSetterType(writeTarget, receiverType);
+
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ writeType,
+ read,
+ readType,
+ node.binaryName,
+ node.rhs);
+ DartType binaryType = binaryResult.inferredType;
+
Expression binary =
inferrer.ensureAssignableResult(writeType, binaryResult);
@@ -3550,8 +3572,13 @@
/// [fileOffset] is used as the file offset for created nodes. [leftType] is
/// the already inferred type of the [left] expression. The inferred type of
/// [right] is computed by this method.
- ExpressionInferenceResult _computeBinaryExpression(int fileOffset,
- Expression left, DartType leftType, Name binaryName, Expression right) {
+ ExpressionInferenceResult _computeBinaryExpression(
+ int fileOffset,
+ DartType contextType,
+ Expression left,
+ DartType leftType,
+ Name binaryName,
+ Expression right) {
assert(binaryName != equalsName);
ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
@@ -3566,13 +3593,21 @@
DartType rightType =
inferrer.getPositionalParameterTypeForTarget(binaryTarget, leftType, 0);
- bool isOverloadedArithmeticOperatorAndType =
- inferrer.isOverloadedArithmeticOperatorAndType(binaryTarget, leftType);
+ bool isSpecialCasedBinaryOperator = inferrer
+ .isSpecialCasedBinaryOperatorForReceiverType(binaryTarget, leftType);
- bool typeNeeded =
- !inferrer.isTopLevel || isOverloadedArithmeticOperatorAndType;
- ExpressionInferenceResult rightResult = inferrer
- .inferExpression(right, rightType, typeNeeded, isVoidAllowed: true);
+ bool typeNeeded = !inferrer.isTopLevel || isSpecialCasedBinaryOperator;
+
+ DartType rightContextType = rightType;
+ if (isSpecialCasedBinaryOperator) {
+ rightContextType = inferrer.typeSchemaEnvironment
+ .getContextTypeOfSpecialCasedBinaryOperator(
+ contextType, leftType, rightType,
+ isNonNullableByDefault: inferrer.isNonNullableByDefault);
+ }
+ ExpressionInferenceResult rightResult = inferrer.inferExpression(
+ right, rightContextType, typeNeeded,
+ isVoidAllowed: true);
if (rightResult.inferredType == null) {
assert(!typeNeeded,
"Missing right type for overloaded arithmetic operator.");
@@ -3584,9 +3619,11 @@
right = inferrer.ensureAssignableResult(rightType, rightResult);
- if (isOverloadedArithmeticOperatorAndType) {
+ if (isSpecialCasedBinaryOperator) {
binaryType = inferrer.typeSchemaEnvironment
- .getTypeOfOverloadedArithmetic(leftType, rightResult.inferredType);
+ .getTypeOfSpecialCasedBinaryOperator(
+ leftType, rightResult.inferredType,
+ isNonNullableByDefault: inferrer.isNonNullableByDefault);
}
Expression binary;
@@ -4202,23 +4239,30 @@
left = read;
}
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
- Expression binary = binaryResult.expression;
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
receiverType, indexSetName, node.writeOffset,
includeExtensionMethods: true);
DartType writeIndexType =
inferrer.getIndexKeyType(writeTarget, receiverType);
+
+ DartType valueType =
+ inferrer.getIndexSetValueType(writeTarget, receiverType);
+
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ valueType,
+ left,
+ readType,
+ node.binaryName,
+ node.rhs);
+ Expression binary = binaryResult.expression;
+ DartType binaryType = binaryResult.inferredType;
+
Expression writeIndex = createVariableGet(indexVariable);
writeIndex = inferrer.ensureAssignable(
writeIndexType, indexResult.inferredType, writeIndex);
- DartType valueType =
- inferrer.getIndexSetValueType(writeTarget, receiverType);
binary = inferrer.ensureAssignable(valueType, binaryType, binary,
fileOffset: node.fileOffset);
@@ -4342,17 +4386,23 @@
left = read;
}
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
- Expression binary = binaryResult.expression;
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
nonNullReceiverType, node.propertyName, node.writeOffset,
setter: true, includeExtensionMethods: true);
DartType valueType =
inferrer.getSetterType(writeTarget, nonNullReceiverType);
+
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ valueType,
+ left,
+ readType,
+ node.binaryName,
+ node.rhs);
+ Expression binary = binaryResult.expression;
+ DartType binaryType = binaryResult.inferredType;
+
binary = inferrer.ensureAssignable(valueType, binaryType, binary,
fileOffset: node.fileOffset);
@@ -4477,12 +4527,6 @@
} else {
left = read;
}
-
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
- Expression binary = binaryResult.expression;
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = node.setter != null
? new ObjectAccessTarget.interfaceMember(node.setter,
isPotentiallyNullable: false)
@@ -4490,12 +4534,24 @@
DartType writeIndexType =
inferrer.getIndexKeyType(writeTarget, inferrer.thisType);
+
+ DartType valueType =
+ inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
+
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ valueType,
+ left,
+ readType,
+ node.binaryName,
+ node.rhs);
+ Expression binary = binaryResult.expression;
+ DartType binaryType = binaryResult.inferredType;
+
Expression writeIndex = createVariableGet(indexVariable);
writeIndex = inferrer.ensureAssignable(
writeIndexType, indexResult.inferredType, writeIndex);
- DartType valueType =
- inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
Expression binaryReplacement = inferrer.ensureAssignable(
valueType, binaryType, binary,
fileOffset: node.fileOffset);
@@ -4643,11 +4699,6 @@
left = read;
}
- ExpressionInferenceResult binaryResult = _computeBinaryExpression(
- node.binaryOffset, left, readType, node.binaryName, node.rhs);
- Expression binary = binaryResult.expression;
- DartType binaryType = binaryResult.inferredType;
-
ObjectAccessTarget writeTarget = node.setter != null
? new ExtensionAccessTarget(
node.setter, null, ProcedureKind.Operator, extensionTypeArguments)
@@ -4655,12 +4706,24 @@
DartType writeIndexType =
inferrer.getIndexKeyType(writeTarget, receiverType);
- Expression writeIndex = createVariableGet(indexVariable);
- writeIndex = inferrer.ensureAssignable(
- writeIndexType, indexResult.inferredType, writeIndex);
DartType valueType =
inferrer.getIndexSetValueType(writeTarget, inferrer.thisType);
+
+ ExpressionInferenceResult binaryResult = _computeBinaryExpression(
+ node.binaryOffset,
+ valueType,
+ left,
+ readType,
+ node.binaryName,
+ node.rhs);
+
+ Expression binary = binaryResult.expression;
+ DartType binaryType = binaryResult.inferredType;
+
+ Expression writeIndex = createVariableGet(indexVariable);
+ writeIndex = inferrer.ensureAssignable(
+ writeIndexType, indexResult.inferredType, writeIndex);
binary = inferrer.ensureAssignable(valueType, binaryType, binary,
fileOffset: node.fileOffset);
@@ -5832,8 +5895,13 @@
BinaryExpression node, DartType typeContext) {
ExpressionInferenceResult leftResult =
inferrer.inferExpression(node.left, const UnknownType(), true);
- return _computeBinaryExpression(node.fileOffset, leftResult.expression,
- leftResult.inferredType, node.binaryName, node.right);
+ return _computeBinaryExpression(
+ node.fileOffset,
+ typeContext,
+ leftResult.expression,
+ leftResult.inferredType,
+ node.binaryName,
+ node.right);
}
ExpressionInferenceResult visitUnary(
diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
index 76b40ba..68d00f9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -3555,6 +3555,16 @@
String toString() {
return "BinaryExpression(${toStringInternal()})";
}
+
+ @override
+ int get precedence => Precedence.binaryPrecedence[binaryName.name];
+
+ @override
+ void toTextInternal(AstPrinter printer) {
+ printer.writeExpression(left, minimumPrecedence: precedence);
+ printer.write(' ${binaryName.name} ');
+ printer.writeExpression(right, minimumPrecedence: precedence);
+ }
}
/// Internal expression for a unary expression.
@@ -3589,9 +3599,22 @@
}
@override
+ int get precedence => Precedence.PREFIX;
+
+ @override
String toString() {
return "UnaryExpression(${toStringInternal()})";
}
+
+ @override
+ void toTextInternal(AstPrinter printer) {
+ if (unaryName == unaryMinusName) {
+ printer.write('-');
+ } else {
+ printer.write('${unaryName.name}');
+ }
+ printer.writeExpression(expression, minimumPrecedence: precedence);
+ }
}
/// Internal expression for a parenthesized expression.
@@ -3625,9 +3648,19 @@
}
@override
+ int get precedence => Precedence.CALLEE;
+
+ @override
String toString() {
return "ParenthesizedExpression(${toStringInternal()})";
}
+
+ @override
+ void toTextInternal(AstPrinter printer) {
+ printer.write('(');
+ printer.writeExpression(expression);
+ printer.write(')');
+ }
}
/// Creates a [Let] of [variable] with the given [body] using
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index d6682d4..e7f565a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -154,9 +154,8 @@
}
void visitNeverType(NeverType node) {
- // TODO(askesc): Consider throwing internal error if NeverType appears in
- // diagnostics.
result.add("Never");
+ addNullability(node.declaredNullability);
}
void visitDynamicType(DynamicType node) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 81679f7..6376960 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -81,11 +81,8 @@
import '../export.dart' show Export;
-import '../import.dart' show Import;
-
import '../fasta_codes.dart'
show
- LocatedMessage,
Message,
SummaryTemplate,
Template,
@@ -100,10 +97,6 @@
templateAmbiguousSupertypes,
templateCantReadFile,
templateCyclicClassHierarchy,
- templateDuplicatedLibraryExport,
- templateDuplicatedLibraryExportContext,
- templateDuplicatedLibraryImport,
- templateDuplicatedLibraryImportContext,
templateExtendingEnum,
templateExtendingRestricted,
templateIllegalMixin,
@@ -916,82 +909,7 @@
List<SourceClassBuilder> checkSemantics(ClassBuilder objectClass) {
checkObjectClassHierarchy(objectClass);
- List<SourceClassBuilder> classes = handleHierarchyCycles(objectClass);
-
- // Check imports and exports for duplicate names.
- // This is rather silly, e.g. it makes importing 'foo' and exporting another
- // 'foo' ok.
- builders.forEach((Uri uri, LibraryBuilder library) {
- if (library is SourceLibraryBuilder && library.loader == this) {
- // Check exports.
- if (library.exports.isNotEmpty) {
- Map<String, List<Export>> nameToExports;
- bool errorExports = false;
- for (Export export in library.exports) {
- String name = export.exported?.name ?? '';
- if (name != '') {
- nameToExports ??= new Map<String, List<Export>>();
- List<Export> exports = nameToExports[name] ??= <Export>[];
- exports.add(export);
- if (exports[0].exported != export.exported) errorExports = true;
- }
- }
- if (errorExports) {
- for (String name in nameToExports.keys) {
- List<Export> exports = nameToExports[name];
- if (exports.length < 2) continue;
- List<LocatedMessage> context = <LocatedMessage>[];
- for (Export export in exports.skip(1)) {
- context.add(templateDuplicatedLibraryExportContext
- .withArguments(name)
- .withLocation(uri, export.charOffset, noLength));
- }
- library.addProblem(
- templateDuplicatedLibraryExport.withArguments(name),
- exports[0].charOffset,
- noLength,
- uri,
- context: context);
- }
- }
- }
-
- // Check imports.
- if (library.imports.isNotEmpty) {
- Map<String, List<Import>> nameToImports;
- bool errorImports;
- for (Import import in library.imports) {
- String name = import.imported?.name ?? '';
- if (name != '') {
- nameToImports ??= new Map<String, List<Import>>();
- List<Import> imports = nameToImports[name] ??= <Import>[];
- imports.add(import);
- if (imports[0].imported != import.imported) errorImports = true;
- }
- }
- if (errorImports != null) {
- for (String name in nameToImports.keys) {
- List<Import> imports = nameToImports[name];
- if (imports.length < 2) continue;
- List<LocatedMessage> context = <LocatedMessage>[];
- for (Import import in imports.skip(1)) {
- context.add(templateDuplicatedLibraryImportContext
- .withArguments(name)
- .withLocation(uri, import.charOffset, noLength));
- }
- library.addProblem(
- templateDuplicatedLibraryImport.withArguments(name),
- imports[0].charOffset,
- noLength,
- uri,
- context: context);
- }
- }
- }
- }
- });
- ticker.logMs("Checked imports and exports for duplicate names");
- return classes;
+ return handleHierarchyCycles(objectClass);
}
void buildComponent() {
@@ -1286,12 +1204,6 @@
}
}
- Expression instantiateInvocation(Expression receiver, String name,
- Arguments arguments, int offset, bool isSuper) {
- return target.backendTarget.instantiateInvocation(
- coreTypes, receiver, name, arguments, offset, isSuper);
- }
-
Expression instantiateNoSuchMethodError(
Expression receiver, String name, Arguments arguments, int offset,
{bool isMethod: false,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index d0f4ba3..2aad555 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -106,16 +106,8 @@
class _SyncClosureContext implements ClosureContext {
bool get isAsync => false;
- /// The typing expectation for the subexpression of a `return` or `yield`
- /// statement inside the function.
- ///
- /// For non-generator async functions, this will be a "FutureOr" type (since
- /// it is permissible for such a function to return either a direct value or
- /// a future).
- ///
- /// For generator functions containing a `yield*` statement, the expected type
- /// for the subexpression of the `yield*` statement is the result of wrapping
- /// this typing expectation in `Stream` or `Iterator`, as appropriate.
+ /// The typing expectation for the subexpression of a `return` statement
+ /// inside the function.
final DartType _returnContext;
@override
@@ -303,7 +295,15 @@
assert(_needToInferReturnType);
assert(hasImplicitReturn != null);
DartType inferredType;
- if (_returnStatements.isNotEmpty) {
+ if (inferrer.isNonNullableByDefault) {
+ if (hasImplicitReturn) {
+ // No explicit returns we have an implicit `return null`.
+ inferredType = inferrer.typeSchemaEnvironment.nullType;
+ } else {
+ // No explicit return and the function doesn't complete normally; that
+ // is, it throws.
+ inferredType = new NeverType(inferrer.library.nonNullable);
+ }
// Use the types seen from the explicit return statements.
for (int i = 0; i < _returnStatements.length; i++) {
ReturnStatement statement = _returnStatements[i];
@@ -322,15 +322,32 @@
inferredType, type, inferrer.library.library);
}
}
- } else if (hasImplicitReturn) {
- // No explicit returns we have an implicit `return null`.
- inferredType = inferrer.typeSchemaEnvironment.nullType;
} else {
- // No explicit return and the function doesn't complete normally; that is,
- // it throws.
- if (inferrer.isNonNullableByDefault) {
- inferredType = new NeverType(inferrer.library.nonNullable);
+ if (_returnStatements.isNotEmpty) {
+ // Use the types seen from the explicit return statements.
+ for (int i = 0; i < _returnStatements.length; i++) {
+ ReturnStatement statement = _returnStatements[i];
+ DartType type = _returnExpressionTypes[i];
+ // The return expression has to be assignable to the return type
+ // expectation from the downwards inference context.
+ if (statement.expression != null) {
+ if (!inferrer.isAssignable(_returnContext, type)) {
+ type = inferrer.computeGreatestClosure(_returnContext);
+ }
+ }
+ if (inferredType == null) {
+ inferredType = type;
+ } else {
+ inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
+ inferredType, type, inferrer.library.library);
+ }
+ }
+ } else if (hasImplicitReturn) {
+ // No explicit returns we have an implicit `return null`.
+ inferredType = inferrer.typeSchemaEnvironment.nullType;
} else {
+ // No explicit return and the function doesn't complete normally; that
+ // is, it throws.
inferredType = inferrer.typeSchemaEnvironment.nullType;
}
}
@@ -398,16 +415,11 @@
class _AsyncClosureContext implements ClosureContext {
bool get isAsync => true;
- /// The typing expectation for the subexpression of a `return` or `yield`
- /// statement inside the function.
+ /// The typing expectation for the subexpression of a `return` statement
+ /// inside the function.
///
- /// For non-generator async functions, this will be a "FutureOr" type (since
- /// it is permissible for such a function to return either a direct value or
- /// a future).
- ///
- /// For generator functions containing a `yield*` statement, the expected type
- /// for the subexpression of the `yield*` statement is the result of wrapping
- /// this typing expectation in `Stream` or `Iterator`, as appropriate.
+ /// This will be a "FutureOr" type (since it is permissible for such a
+ /// function to return either a direct value or a future).
final DartType _returnContext;
@override
@@ -649,23 +661,20 @@
assert(_needToInferReturnType);
assert(hasImplicitReturn != null);
DartType inferredType;
- if (_returnStatements.isNotEmpty) {
+
+ if (inferrer.isNonNullableByDefault) {
+ if (hasImplicitReturn) {
+ // No explicit returns we have an implicit `return null`.
+ inferredType = inferrer.typeSchemaEnvironment.nullType;
+ } else {
+ // No explicit return and the function doesn't complete normally; that
+ // is, it throws.
+ inferredType = new NeverType(inferrer.library.nonNullable);
+ }
// Use the types seen from the explicit return statements.
for (int i = 0; i < _returnStatements.length; i++) {
- ReturnStatement statement = _returnStatements[i];
DartType type = _returnExpressionTypes[i];
- // The return expression has to be assignable to the return type
- // expectation from the downwards inference context.
- if (!inferrer.isNonNullableByDefault) {
- if (statement.expression != null) {
- if (!inferrer.isAssignable(
- computeAssignableType(inferrer, _returnContext, type), type)) {
- // Not assignable, use the expectation.
- type = inferrer.computeGreatestClosure(_returnContext);
- }
- }
- }
DartType unwrappedType = inferrer.typeSchemaEnvironment.flatten(type);
if (inferredType == null) {
inferredType = unwrappedType;
@@ -674,30 +683,60 @@
inferredType, unwrappedType, inferrer.library.library);
}
}
- } else if (hasImplicitReturn) {
- // No explicit returns we have an implicit `return null`.
- inferredType = inferrer.typeSchemaEnvironment.nullType;
- } else {
- // No explicit return and the function doesn't complete normally; that is,
- // it throws.
- if (inferrer.isNonNullableByDefault) {
- inferredType = new NeverType(inferrer.library.nonNullable);
- } else {
- inferredType = inferrer.typeSchemaEnvironment.nullType;
- }
- }
- if (inferrer.isNonNullableByDefault) {
- if (!inferrer.typeSchemaEnvironment.isSubtypeOf(
- inferredType, _returnContext, SubtypeCheckMode.withNullabilities)) {
+ // Let `T` be the **actual returned type** of a function literal as
+ // computed above.
+
+ // Let `R` be the greatest closure of the typing context `K` as computed
+ // above. If `R` is `void`, or the function literal is marked `async` and
+ // `R` is `FutureOr<void>`, let `S` be `void`. Otherwise, if `T <: R` then
+ // let `S` be `T`. Otherwise, let `S` be `R`.
+ DartType returnContext = inferrer.computeGreatestClosure2(_returnContext);
+ if (returnContext is VoidType ||
+ returnContext is FutureOrType &&
+ returnContext.typeArgument is VoidType) {
+ inferredType = const VoidType();
+ } else if (!inferrer.typeSchemaEnvironment.isSubtypeOf(
+ inferredType, returnContext, SubtypeCheckMode.withNullabilities)) {
// If the inferred return type isn't a subtype of the context, we use
// the context.
- inferredType = inferrer.computeGreatestClosure2(_declaredReturnType);
+ inferredType = returnContext;
}
inferredType = inferrer.wrapFutureType(
inferrer.typeSchemaEnvironment.flatten(inferredType),
inferrer.library.nonNullable);
} else {
+ if (_returnStatements.isNotEmpty) {
+ // Use the types seen from the explicit return statements.
+ for (int i = 0; i < _returnStatements.length; i++) {
+ ReturnStatement statement = _returnStatements[i];
+ DartType type = _returnExpressionTypes[i];
+
+ // The return expression has to be assignable to the return type
+ // expectation from the downwards inference context.
+ if (statement.expression != null) {
+ if (!inferrer.isAssignable(
+ computeAssignableType(inferrer, _returnContext, type), type)) {
+ // Not assignable, use the expectation.
+ type = inferrer.computeGreatestClosure(_returnContext);
+ }
+ }
+ DartType unwrappedType = inferrer.typeSchemaEnvironment.flatten(type);
+ if (inferredType == null) {
+ inferredType = unwrappedType;
+ } else {
+ inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
+ inferredType, unwrappedType, inferrer.library.library);
+ }
+ }
+ } else if (hasImplicitReturn) {
+ // No explicit returns we have an implicit `return null`.
+ inferredType = inferrer.typeSchemaEnvironment.nullType;
+ } else {
+ // No explicit return and the function doesn't complete normally;
+ // that is, it throws.
+ inferredType = inferrer.typeSchemaEnvironment.nullType;
+ }
inferredType =
inferrer.wrapFutureType(inferredType, inferrer.library.nonNullable);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index 2f29335..4d04ad4 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -2,300 +2,18 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-import 'dart:math' as math;
+import 'package:kernel/ast.dart' show DartType, Library, NeverType, Nullability;
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:kernel/ast.dart'
- show
- BottomType,
- Class,
- DartType,
- DynamicType,
- FunctionType,
- FutureOrType,
- InterfaceType,
- InvalidType,
- Library,
- NamedType,
- NeverType,
- Nullability,
- TypeParameter,
- TypeParameterType,
- Variance,
- VoidType;
-
-import 'package:kernel/core_types.dart';
-
-import 'package:kernel/type_algebra.dart';
-
-import 'package:kernel/type_environment.dart';
-
-import 'package:kernel/src/legacy_erasure.dart';
+import 'package:kernel/src/standard_bounds.dart';
import 'type_schema.dart' show UnknownType;
import 'type_schema_elimination.dart';
-import '../problems.dart';
-
-abstract class StandardBounds {
- CoreTypes get coreTypes;
-
- bool isSubtypeOf(DartType subtype, DartType supertype, SubtypeCheckMode mode);
-
- bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode);
-
- InterfaceType getLegacyLeastUpperBound(
- InterfaceType type1, InterfaceType type2, Library clientLibrary);
-
- /// Checks the value of the MORETOP predicate for [s] and [t].
- ///
- /// For the definition of MORETOP see the following:
- /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
- bool moretop(DartType s, DartType t) {
- assert(coreTypes.isTop(s) || coreTypes.isObject(s));
- assert(coreTypes.isTop(t) || coreTypes.isObject(t));
-
- // MORETOP(void, T) = true.
- if (s is VoidType) return true;
-
- // MORETOP(S, void) = false.
- if (t is VoidType) return false;
-
- // MORETOP(dynamic, T) = true.
- if (s is DynamicType) return true;
-
- // MORETOP(S, dynamic) = false.
- if (t is DynamicType) return false;
-
- // MORETOP(Object, T) = true.
- if (s is InterfaceType &&
- s.classNode == coreTypes.objectClass &&
- s.declaredNullability == Nullability.nonNullable) {
- return true;
- }
-
- // MORETOP(S, Object) = false.
- if (t is InterfaceType &&
- t.classNode == coreTypes.objectClass &&
- t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // MORETOP(S*, T*) = MORETOP(S, T).
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.legacy) {
- DartType nonNullableS =
- s.withDeclaredNullability(Nullability.nonNullable);
- assert(!identical(s, nonNullableS));
- DartType nonNullableT =
- t.withDeclaredNullability(Nullability.nonNullable);
- assert(!identical(t, nonNullableT));
- return moretop(nonNullableS, nonNullableT);
- }
-
- // MORETOP(S, T*) = true.
- if (s.declaredNullability == Nullability.nonNullable &&
- t.declaredNullability == Nullability.legacy) {
- return true;
- }
-
- // MORETOP(S*, T) = false.
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // MORETOP(S?, T?) == MORETOP(S, T).
- if (s.declaredNullability == Nullability.nullable &&
- t.declaredNullability == Nullability.nullable) {
- DartType nonNullableS =
- s.withDeclaredNullability(Nullability.nonNullable);
- assert(!identical(s, nonNullableS));
- DartType nonNullableT =
- t.withDeclaredNullability(Nullability.nonNullable);
- assert(!identical(t, nonNullableT));
- return moretop(nonNullableS, nonNullableT);
- }
-
- // MORETOP(S, T?) = true.
- if (s.declaredNullability == Nullability.nonNullable &&
- t.declaredNullability == Nullability.nullable) {
- return true;
- }
-
- // MORETOP(S?, T) = false.
- if (s.declaredNullability == Nullability.nullable &&
- t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // TODO(dmitryas): Update the following after the spec is updated.
- if (s.declaredNullability == Nullability.nullable &&
- t.declaredNullability == Nullability.legacy) {
- return true;
- }
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.nullable) {
- return false;
- }
-
- // MORETOP(FutureOr<S>, FutureOr<T>) = MORETOP(S, T).
- if (s is FutureOrType &&
- s.declaredNullability == Nullability.nonNullable &&
- t is FutureOrType &&
- t.declaredNullability == Nullability.nonNullable) {
- return moretop(s.typeArgument, t.typeArgument);
- }
-
- return internalProblem(
- templateInternalProblemUnsupported.withArguments("moretop($s, $t)"),
- -1,
- null);
- }
-
- /// Checks the value of the MOREBOTTOM predicate for [s] and [t].
- ///
- /// For the definition of MOREBOTTOM see the following:
- /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
- bool morebottom(DartType s, DartType t) {
- assert(coreTypes.isBottom(s) || coreTypes.isNull(s));
- assert(coreTypes.isBottom(t) || coreTypes.isNull(t));
-
- // MOREBOTTOM(Never, T) = true.
- if (s is NeverType && s.declaredNullability == Nullability.nonNullable) {
- return true;
- }
-
- // MOREBOTTOM(S, Never) = false.
- if (t is NeverType && t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // MOREBOTTOM(Null, T) = true.
- if (s == coreTypes.nullType) {
- return true;
- }
-
- // MOREBOTTOM(S, Null) = false.
- if (t == coreTypes.nullType) {
- return false;
- }
-
- // MOREBOTTOM(S?, T?) = MOREBOTTOM(S, T).
- if (t.declaredNullability == Nullability.nullable &&
- s.declaredNullability == Nullability.nullable) {
- DartType nonNullableS =
- s.withDeclaredNullability(Nullability.nonNullable);
- assert(s != nonNullableS);
- DartType nonNullableT =
- t.withDeclaredNullability(Nullability.nonNullable);
- assert(t != nonNullableT);
- return morebottom(nonNullableS, nonNullableT);
- }
-
- // MOREBOTTOM(S, T?) = true.
- if (s.declaredNullability == Nullability.nonNullable &&
- t.declaredNullability == Nullability.nullable) {
- return true;
- }
-
- // MOREBOTTOM(S?, T) = false.
- if (s.declaredNullability == Nullability.nullable &&
- t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // MOREBOTTOM(S*, T*) = MOREBOTTOM(S, T)
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.legacy) {
- DartType nonNullableS =
- s.withDeclaredNullability(Nullability.nonNullable);
- assert(s != nonNullableS);
- DartType nonNullableT =
- t.withDeclaredNullability(Nullability.nonNullable);
- assert(t != nonNullableT);
- return morebottom(nonNullableS, nonNullableT);
- }
-
- // MOREBOTTOM(S, T*) = true.
- if (s.declaredNullability == Nullability.nonNullable &&
- t.declaredNullability == Nullability.legacy) {
- return true;
- }
-
- // MOREBOTTOM(S*, T) = false.
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.nonNullable) {
- return false;
- }
-
- // TODO(dmitryas): Update the following after the spec is updated.
- if (s.declaredNullability == Nullability.nullable &&
- t.declaredNullability == Nullability.legacy) {
- return true;
- }
- if (s.declaredNullability == Nullability.legacy &&
- t.declaredNullability == Nullability.nullable) {
- return false;
- }
-
- // MOREBOTTOM(X&S, Y&T) = MOREBOTTOM(S, T).
- if (s is TypeParameterType &&
- s.promotedBound != null &&
- t is TypeParameterType &&
- t.promotedBound != null) {
- return morebottom(s.promotedBound, t.promotedBound);
- }
-
- // MOREBOTTOM(X&S, T) = true.
- if (s is TypeParameterType && s.promotedBound != null) {
- return true;
- }
-
- // MOREBOTTOM(S, X&T) = false.
- if (t is TypeParameterType && t.promotedBound != null) {
- return false;
- }
-
- // MOREBOTTOM(X extends S, Y extends T) = MOREBOTTOM(S, T).
- if (s is TypeParameterType && t is TypeParameterType) {
- assert(s.promotedBound == null);
- assert(t.promotedBound == null);
- return morebottom(s.parameter.bound, t.parameter.bound);
- }
-
- return internalProblem(
- templateInternalProblemUnsupported.withArguments("morebottom($s, $t)"),
- -1,
- null);
- }
-
- /// Computes the standard lower bound of [type1] and [type2].
- ///
- /// Standard lower bound is a lower bound function that imposes an
- /// ordering on the top types `void`, `dynamic`, and `object`. This function
- /// additionally handles the unknown type that appears during type inference.
- DartType getStandardLowerBound(
+mixin TypeSchemaStandardBounds on StandardBounds {
+ @override
+ DartType getNullabilityAwareStandardLowerBoundInternal(
DartType type1, DartType type2, Library clientLibrary) {
- if (type1 is InvalidType || type2 is InvalidType) {
- return const InvalidType();
- }
- if (clientLibrary.isNonNullableByDefault) {
- return _getNullabilityAwareStandardLowerBound(
- type1, type2, clientLibrary);
- }
- return _getNullabilityObliviousStandardLowerBound(
- legacyErasure(coreTypes, type1),
- legacyErasure(coreTypes, type2),
- clientLibrary);
- }
-
- DartType _getNullabilityAwareStandardLowerBound(
- DartType type1, DartType type2, Library clientLibrary) {
- // DOWN(T, T) = T.
- if (identical(type1, type2)) return type1;
-
// - We add the axiom that `DOWN(T, _) == T` and the symmetric version.
// - We replace all uses of `T1 <: T2` in the `DOWN` algorithm by `S1 <:
// S2` where `Si` is the greatest closure of `Ti` with respect to `_`.
@@ -306,199 +24,13 @@
type2 = greatestClosure(type2, coreTypes.objectNullableRawType,
const NeverType(Nullability.nonNullable));
- // DOWN(T1, T2) where TOP(T1) and TOP(T2) =
- // T1 if MORETOP(T2, T1)
- // T2 otherwise
- // DOWN(T1, T2) = T2 if TOP(T1)
- // DOWN(T1, T2) = T1 if TOP(T2)
- if (coreTypes.isTop(type1)) {
- if (coreTypes.isTop(type2)) return moretop(type2, type1) ? type1 : type2;
- return type2;
- } else if (coreTypes.isTop(type2)) {
- return type1;
- }
-
- // DOWN(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
- // T1 if MOREBOTTOM(T1, T2)
- // T2 otherwise
- // DOWN(T1, T2) = T2 if BOTTOM(T2)
- // DOWN(T1, T2) = T1 if BOTTOM(T1)
- if (coreTypes.isBottom(type1)) {
- if (coreTypes.isBottom(type2)) {
- return morebottom(type1, type2) ? type1 : type2;
- }
- return type1;
- } else if (coreTypes.isBottom(type2)) {
- return type2;
- }
-
- // DOWN(T1, T2) where NULL(T1) and NULL(T2) =
- // T1 if MOREBOTTOM(T1, T2)
- // T2 otherwise
- // DOWN(Null, T2) =
- // Null if Null <: T2
- // Never otherwise
- // DOWN(T1, Null) =
- // Null if Null <: T1
- // Never otherwise
- if (coreTypes.isNull(type1)) {
- if (coreTypes.isNull(type2)) {
- return morebottom(type1, type2) ? type1 : type2;
- }
- Nullability type2Nullability = type2.declaredNullability;
- if (type2Nullability == Nullability.legacy ||
- type2Nullability == Nullability.nullable) {
- return type1;
- }
- return const NeverType(Nullability.nonNullable);
- } else if (coreTypes.isNull(type2)) {
- Nullability type1Nullability = type1.declaredNullability;
- if (type1Nullability == Nullability.legacy ||
- type1Nullability == Nullability.nullable) {
- return type2;
- }
- return const NeverType(Nullability.nonNullable);
- }
-
- // DOWN(T1, T2) where OBJECT(T1) and OBJECT(T2) =
- // T1 if MORETOP(T2, T1)
- // T2 otherwise
- // DOWN(T1, T2) where OBJECT(T1) =
- // T2 if T2 is non-nullable
- // NonNull(T2) if NonNull(T2) is non-nullable
- // Never otherwise
- // DOWN(T1, T2) where OBJECT(T2) =
- // T1 if T1 is non-nullable
- // NonNull(T1) if NonNull(T1) is non-nullable
- // Never otherwise
- if (coreTypes.isObject(type1)) {
- if (coreTypes.isObject(type2)) {
- return moretop(type2, type1) ? type1 : type2;
- }
- if (type2.declaredNullability == Nullability.nonNullable) {
- return type2;
- }
- type2 = type2.withDeclaredNullability(Nullability.nonNullable);
- if (type2.declaredNullability == Nullability.nonNullable) {
- return type2;
- }
- return const NeverType(Nullability.nonNullable);
- } else if (coreTypes.isObject(type2)) {
- if (type1.declaredNullability == Nullability.nonNullable) {
- return type1;
- }
- type1 = type1.withDeclaredNullability(Nullability.nonNullable);
- if (type1.declaredNullability == Nullability.nonNullable) {
- return type1;
- }
- return const NeverType(Nullability.nonNullable);
- }
-
- // The effect of the following rules is accounted for in the code below via
- // the invocations of intersectNullabilities.
- // DOWN(T1*, T2*) = S* where S is DOWN(T1, T2)
- // DOWN(T1*, T2?) = S* where S is DOWN(T1, T2)
- // DOWN(T1?, T2*) = S* where S is DOWN(T1, T2)
- // DOWN(T1*, T2) = S where S is DOWN(T1, T2)
- // DOWN(T1, T2*) = S where S is DOWN(T1, T2)
- // DOWN(T1?, T2?) = S? where S is DOWN(T1, T2)
- // DOWN(T1?, T2) = S where S is DOWN(T1, T2)
- // DOWN(T1, T2?) = S where S is DOWN(T1, T2)
-
- if (type1 is FunctionType && type2 is FunctionType) {
- return _getNullabilityAwareFunctionStandardLowerBound(
- type1, type2, clientLibrary);
- }
-
- // DOWN(T1, T2) = T1 if T1 <: T2.
- // DOWN(T1, T2) = T2 if T2 <: T1.
-
- // We use the non-nullable variants of the two types to determine T1 <: T2
- // without using the nullability of the outermost type. The result uses
- // [intersectNullabilities] to compute the resulting type if the subtype
- // relation is established.
- DartType nonNullableType1 =
- type1.withDeclaredNullability(Nullability.nonNullable);
- DartType nonNullableType2 =
- type2.withDeclaredNullability(Nullability.nonNullable);
- if (isSubtypeOf(nonNullableType1, nonNullableType2,
- SubtypeCheckMode.withNullabilities)) {
- return type1.withDeclaredNullability(intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- if (isSubtypeOf(nonNullableType2, nonNullableType1,
- SubtypeCheckMode.withNullabilities)) {
- return type2.withDeclaredNullability(intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
-
- // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
- if (type1 is FutureOrType) {
- if (type2 is FutureOrType) {
- // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
- DartType argument = getStandardLowerBound(
- type1.typeArgument, type2.typeArgument, clientLibrary);
- return new FutureOrType(argument, argument.declaredNullability);
- }
- if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
- // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
- return new InterfaceType(
- coreTypes.futureClass,
- intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- <DartType>[
- getStandardLowerBound(
- type1.typeArgument, type2.typeArguments[0], clientLibrary)
- ]);
- }
- // GLB(FutureOr<A>, B) == GLB(A, B)
- return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
- }
- // The if-statement below handles the following rule:
- // GLB(A, FutureOr<B>) == GLB(FutureOr<B>, A)
- // It's broken down into sub-cases instead of making a recursive call to
- // avoid making the checks that were already made above. Note that at this
- // point it's not possible for type1 to be a FutureOr.
- if (type2 is FutureOrType) {
- if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
- // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
- return new InterfaceType(
- coreTypes.futureClass,
- intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- <DartType>[
- getStandardLowerBound(
- type2.typeArgument, type1.typeArguments[0], clientLibrary)
- ]);
- }
- // GLB(A, FutureOr<B>) == GLB(B, A)
- return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
- }
-
- // DOWN(T1, T2) = Never otherwise.
- return new NeverType(intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability));
+ return super.getNullabilityAwareStandardLowerBoundInternal(
+ type1, type2, clientLibrary);
}
- DartType _getNullabilityObliviousStandardLowerBound(
- DartType type1, DartType type2, Library clientLibrary) {
- // Do legacy erasure on the argument, so that the result types that are
- // computed from arguments are legacy.
- type1 = type1 == coreTypes.nullType
- ? type1
- : type1.withDeclaredNullability(Nullability.legacy);
- type2 = type2 == coreTypes.nullType
- ? type2
- : type2.withDeclaredNullability(Nullability.legacy);
-
- // For all types T, SLB(T,T) = T. Note that we don't test for equality
- // because we don't want to make the algorithm quadratic. This is ok
- // because the check is not needed for correctness; it's just a speed
- // optimization.
- if (identical(type1, type2)) {
- return type1;
- }
-
+ @override
+ DartType getNullabilityObliviousStandardLowerBoundInternal(
+ type1, type2, clientLibrary) {
// For any type T, SLB(?, T) = SLB(T, ?) = T.
if (type1 is UnknownType) {
return type2;
@@ -506,125 +38,13 @@
if (type2 is UnknownType) {
return type1;
}
-
- // SLB(void, T) = SLB(T, void) = T.
- if (type1 is VoidType) {
- return type2;
- }
- if (type2 is VoidType) {
- return type1;
- }
-
- // SLB(dynamic, T) = SLB(T, dynamic) = T if T is not void.
- if (type1 is DynamicType) {
- return type2;
- }
- if (type2 is DynamicType) {
- return type1;
- }
-
- // SLB(Object, T) = SLB(T, Object) = T if T is not void or dynamic.
- if (type1 == coreTypes.objectLegacyRawType) {
- return type2;
- }
- if (type2 == coreTypes.objectLegacyRawType) {
- return type1;
- }
-
- // SLB(bottom, T) = SLB(T, bottom) = bottom.
- if (type1 is BottomType) return type1;
- if (type2 is BottomType) return type2;
- if (type1 == coreTypes.nullType) return type1;
- if (type2 == coreTypes.nullType) return type2;
-
- // Function types have structural lower bounds.
- if (type1 is FunctionType && type2 is FunctionType) {
- return _getNullabilityObliviousFunctionStandardLowerBound(
- type1, type2, clientLibrary);
- }
-
- // Otherwise, the lower bounds of two types is one of them it if it is a
- // subtype of the other.
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
- return type1;
- }
-
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
- return type2;
- }
-
- // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
- if (type1 is FutureOrType) {
- if (type2 is FutureOrType) {
- // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
- DartType argument = getStandardLowerBound(
- type1.typeArgument, type2.typeArgument, clientLibrary);
- return new FutureOrType(argument, argument.declaredNullability);
- }
- if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
- // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
- return new InterfaceType(
- coreTypes.futureClass,
- intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- <DartType>[
- getStandardLowerBound(
- type1.typeArgument, type2.typeArguments[0], clientLibrary)
- ]);
- }
- // GLB(FutureOr<A>, B) == GLB(A, B)
- return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
- }
- // The if-statement below handles the following rule:
- // GLB(A, FutureOr<B>) == GLB(FutureOr<B>, A)
- // It's broken down into sub-cases instead of making a recursive call to
- // avoid making the checks that were already made above. Note that at this
- // point it's not possible for type1 to be a FutureOr.
- if (type2 is FutureOrType) {
- if (type1 is FutureOrType) {
- // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
- return new InterfaceType(
- coreTypes.futureClass,
- intersectNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- <DartType>[
- getStandardLowerBound(
- type2.typeArgument, type1.typeArgument, clientLibrary)
- ]);
- }
- // GLB(A, FutureOr<B>) == GLB(B, A)
- return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
- }
-
- // No subtype relation, so the lower bound is bottom.
- return const BottomType();
+ return super.getNullabilityObliviousStandardLowerBoundInternal(
+ type1, type2, clientLibrary);
}
- /// Computes the standard upper bound of two types.
- ///
- /// Standard upper bound is an upper bound function that imposes an ordering
- /// on the top types 'void', 'dynamic', and `object`. This function
- /// additionally handles the unknown type that appears during type inference.
- DartType getStandardUpperBound(
+ @override
+ DartType getNullabilityAwareStandardUpperBoundInternal(
DartType type1, DartType type2, Library clientLibrary) {
- if (type1 is InvalidType || type2 is InvalidType) {
- return const InvalidType();
- }
- if (clientLibrary.isNonNullableByDefault) {
- return _getNullabilityAwareStandardUpperBound(
- type1, type2, clientLibrary);
- }
- return _getNullabilityObliviousStandardUpperBound(
- legacyErasure(coreTypes, type1),
- legacyErasure(coreTypes, type2),
- clientLibrary);
- }
-
- DartType _getNullabilityAwareStandardUpperBound(
- DartType type1, DartType type2, Library clientLibrary) {
- // UP(T, T) = T
- if (identical(type1, type2)) return type1;
-
// - We add the axiom that `UP(T, _) == T` and the symmetric version.
// - We replace all uses of `T1 <: T2` in the `UP` algorithm by `S1 <: S2`
// where `Si` is the least closure of `Ti` with respect to `_`.
@@ -634,605 +54,13 @@
const NeverType(Nullability.nonNullable));
type2 = leastClosure(type2, coreTypes.objectNullableRawType,
const NeverType(Nullability.nonNullable));
-
- // UP(T1, T2) where TOP(T1) and TOP(T2) =
- // T1 if MORETOP(T1, T2)
- // T2 otherwise
- // UP(T1, T2) = T1 if TOP(T1)
- // UP(T1, T2) = T2 if TOP(T2)
- if (coreTypes.isTop(type1)) {
- if (coreTypes.isTop(type2)) return moretop(type1, type2) ? type1 : type2;
- return type1;
- } else if (coreTypes.isTop(type2)) {
- return type2;
- }
-
- // UP(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
- // T2 if MOREBOTTOM(T1, T2)
- // T1 otherwise
- // UP(T1, T2) = T2 if BOTTOM(T1)
- // UP(T1, T2) = T1 if BOTTOM(T2)
- if (coreTypes.isBottom(type1)) {
- if (coreTypes.isBottom(type2)) {
- return morebottom(type1, type2) ? type2 : type1;
- }
- return type2;
- } else if (coreTypes.isBottom(type2)) {
- return type1;
- }
-
- // UP(T1, T2) where NULL(T1) and NULL(T2) =
- // T2 if MOREBOTTOM(T1, T2)
- // T1 otherwise
- // UP(T1, T2) where NULL(T1) =
- // T2 if T2 is nullable
- // T2? otherwise
- // UP(T1, T2) where NULL(T2) =
- // T1 if T1 is nullable
- // T1? otherwise
- if (coreTypes.isNull(type1)) {
- if (coreTypes.isNull(type2)) {
- return morebottom(type1, type2) ? type2 : type1;
- }
- return type2.withDeclaredNullability(Nullability.nullable);
- } else if (coreTypes.isNull(type2)) {
- return type1.withDeclaredNullability(Nullability.nullable);
- }
-
- // UP(T1, T2) where OBJECT(T1) and OBJECT(T2) =
- // T1 if MORETOP(T1, T2)
- // T2 otherwise
- // UP(T1, T2) where OBJECT(T1) =
- // T1 if T2 is non-nullable
- // T1? otherwise
- // UP(T1, T2) where OBJECT(T2) =
- // T2 if T1 is non-nullable
- // T2? otherwise
- if (coreTypes.isObject(type1)) {
- if (coreTypes.isObject(type2)) {
- return moretop(type1, type2) ? type1 : type2;
- }
- if (type2.declaredNullability == Nullability.nonNullable) {
- return type1;
- }
- return type1.withDeclaredNullability(Nullability.nullable);
- } else if (coreTypes.isObject(type2)) {
- if (type1.declaredNullability == Nullability.nonNullable) {
- return type2;
- }
- return type2.withDeclaredNullability(Nullability.nullable);
- }
-
- // The effect of the following rules is accounted for in the code below via
- // the invocations of uniteNullabilities.
- // UP(T1*, T2*) = S* where S is UP(T1, T2)
- // UP(T1*, T2?) = S? where S is UP(T1, T2)
- // UP(T1?, T2*) = S? where S is UP(T1, T2)
- // UP(T1*, T2) = S* where S is UP(T1, T2)
- // UP(T1, T2*) = S* where S is UP(T1, T2)
- // UP(T1?, T2?) = S? where S is UP(T1, T2)
- // UP(T1?, T2) = S? where S is UP(T1, T2)
- // UP(T1, T2?) = S? where S is UP(T1, T2)
-
- if (type1 is TypeParameterType) {
- return _getNullabilityAwareTypeParameterStandardUpperBound(
- type1, type2, clientLibrary);
- }
-
- if (type2 is TypeParameterType) {
- return _getNullabilityAwareTypeParameterStandardUpperBound(
- type2, type1, clientLibrary);
- }
-
- if (type1 is FunctionType) {
- if (type2 is FunctionType) {
- return _getNullabilityAwareFunctionStandardUpperBound(
- type1, type2, clientLibrary);
- }
-
- if (type2 is InterfaceType &&
- type2.classNode == coreTypes.functionClass) {
- // UP(T Function<...>(...), Function) = Function
- return coreTypes.functionRawType(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
-
- // UP(T Function<...>(...), T2) = Object
- return coreTypes.objectRawType(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- } else if (type2 is FunctionType) {
- if (type1 is InterfaceType &&
- type1.classNode == coreTypes.functionClass) {
- // UP(Function, T Function<...>(...)) = Function
- return coreTypes.functionRawType(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
-
- // UP(T1, T Function<...>(...)) = Object
- return coreTypes.objectRawType(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
-
- if (type1 is FutureOrType || type2 is FutureOrType) {
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
- return type2;
- }
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
- return type1;
- }
- if (type1 is FutureOrType && type2 is FutureOrType) {
- return new FutureOrType(
- getStandardUpperBound(
- type1.typeArgument, type2.typeArgument, clientLibrary),
- uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- }
-
- // UP(T1, T2) = T2 if T1 <: T2
- // Note that both types must be class types at this point.
- assert(type1 is InterfaceType,
- "Expected type1 to be an interface type, got '${type1.runtimeType}'.");
- assert(type2 is InterfaceType,
- "Expected type2 to be an interface type, got '${type2.runtimeType}'.");
-
- // We use the non-nullable variants of the two interfaces types to determine
- // T1 <: T2 without using the nullability of the outermost type. The result
- // uses [uniteNullabilities] to compute the resulting type if the subtype
- // relation is established.
- InterfaceType nonNonNullableType1 =
- type1.withDeclaredNullability(Nullability.nonNullable);
- InterfaceType nonNonNullableType2 =
- type2.withDeclaredNullability(Nullability.nonNullable);
-
- if (isSubtypeOf(nonNonNullableType1, nonNonNullableType2,
- SubtypeCheckMode.withNullabilities)) {
- return type2.withDeclaredNullability(
- uniteNullabilities(type1.nullability, type2.nullability));
- }
-
- // UP(T1, T2) = T1 if T2 <: T1
- // Note that both types must be class types at this point.
- if (isSubtypeOf(nonNonNullableType2, nonNonNullableType1,
- SubtypeCheckMode.withNullabilities)) {
- return type1.withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
-
- // UP(C<T0, ..., Tn>, C<S0, ..., Sn>) = C<R0,..., Rn> where Ri is UP(Ti, Si)
- if (type1 is InterfaceType && type2 is InterfaceType) {
- Class klass = type1.classNode;
- if (type2.classNode == klass) {
- int n = klass.typeParameters.length;
- List<DartType> leftArguments = type1.typeArguments;
- List<DartType> rightArguments = type2.typeArguments;
- List<DartType> typeArguments = new List<DartType>(n);
- for (int i = 0; i < n; ++i) {
- int variance = klass.typeParameters[i].variance;
- if (variance == Variance.contravariant) {
- typeArguments[i] = _getNullabilityAwareStandardLowerBound(
- leftArguments[i], rightArguments[i], clientLibrary);
- } else if (variance == Variance.invariant) {
- if (!areMutualSubtypes(leftArguments[i], rightArguments[i],
- SubtypeCheckMode.withNullabilities)) {
- return getLegacyLeastUpperBound(type1, type2, clientLibrary);
- }
- } else {
- typeArguments[i] = _getNullabilityAwareStandardUpperBound(
- leftArguments[i], rightArguments[i], clientLibrary);
- }
- }
- return new InterfaceType(
- klass,
- uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- typeArguments);
- }
- }
-
- // UP(C0<T0, ..., Tn>, C1<S0, ..., Sk>)
- // = least upper bound of two interfaces as in Dart 1.
- return getLegacyLeastUpperBound(type1, type2, clientLibrary);
+ return super.getNullabilityAwareStandardUpperBoundInternal(
+ type1, type2, clientLibrary);
}
- /// Computes the nullability-aware lower bound of two function types.
- ///
- /// The algorithm is defined as follows:
- /// DOWN(
- /// <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k) -> T0,
- /// <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1l) -> T1)
- /// =
- /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
- /// if:
- /// each B0i and B1i are equal types (syntactically),
- /// q is max(k, l),
- /// R0 is DOWN(T0, T1),
- /// B2i is B0i,
- /// P2i is UP(P0i, P1i) for i <= than min(k, l),
- /// P2i is P0i for k < i <= q,
- /// P2i is P1i for l < i <= q, and
- /// P2i is optional if P0i or P1i is optional.
- ///
- /// DOWN(
- /// <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k, Named0) -> T0,
- /// <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1k, Named1) -> T1)
- /// =
- /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
- /// if:
- /// each B0i and B1i are equal types (syntactically),
- /// R0 is DOWN(T0, T1),
- /// B2i is B0i,
- /// P2i is UP(P0i, P1i),
- /// Named2 contains R2i xi for each xi in both Named0 and Named1,
- /// where R0i xi is in Named0,
- /// where R1i xi is in Named1,
- /// and R2i is UP(R0i, R1i),
- /// and R2i xi is required if xi is required in both Named0 and Named1,
- /// Named2 contains R0i xi for each xi in Named0 and not Named1,
- /// where xi is optional in Named2,
- /// Named2 contains R1i xi for each xi in Named1 and not Named0, and
- /// where xi is optional in Named2.
- /// DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
- DartType _getNullabilityAwareFunctionStandardLowerBound(
- FunctionType f, FunctionType g, Library clientLibrary) {
- bool haveNamed =
- f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
- bool haveOptionalPositional =
- f.requiredParameterCount < f.positionalParameters.length ||
- g.requiredParameterCount < g.positionalParameters.length;
-
- // The fallback result for whenever the following rule applies:
- // DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
- final DartType fallbackResult = new NeverType(
- intersectNullabilities(f.declaredNullability, g.declaredNullability));
-
- if (haveNamed && haveOptionalPositional) return fallbackResult;
- if (haveNamed &&
- f.positionalParameters.length != g.positionalParameters.length) {
- return fallbackResult;
- }
-
- int m = f.typeParameters.length;
- bool boundsMatch = false;
- Substitution substitution = Substitution.empty;
- if (g.typeParameters.length == m) {
- boundsMatch = true;
- if (m != 0) {
- Map<TypeParameter, DartType> substitutionMap =
- <TypeParameter, DartType>{};
- for (int i = 0; i < m; ++i) {
- substitutionMap[g.typeParameters[i]] =
- new TypeParameterType.forAlphaRenaming(
- g.typeParameters[i], f.typeParameters[i]);
- }
- substitution = Substitution.fromMap(substitutionMap);
- for (int i = 0; i < m && boundsMatch; ++i) {
- // TODO(dmitryas): Figure out if a procedure for syntactic equality
- // should be used instead.
- if (!areMutualSubtypes(
- f.typeParameters[i].bound,
- substitution.substituteType(g.typeParameters[i].bound),
- SubtypeCheckMode.withNullabilities)) {
- boundsMatch = false;
- }
- }
- }
- }
- if (!boundsMatch) return fallbackResult;
- int maxPos =
- math.max(f.positionalParameters.length, g.positionalParameters.length);
- int minPos =
- math.min(f.positionalParameters.length, g.positionalParameters.length);
-
- List<TypeParameter> typeParameters = f.typeParameters;
-
- List<DartType> positionalParameters =
- new List<DartType>.filled(maxPos, null);
- for (int i = 0; i < minPos; ++i) {
- positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
- f.positionalParameters[i],
- substitution.substituteType(g.positionalParameters[i]),
- clientLibrary);
- }
- for (int i = minPos; i < f.positionalParameters.length; ++i) {
- positionalParameters[i] = f.positionalParameters[i];
- }
- for (int i = minPos; i < g.positionalParameters.length; ++i) {
- positionalParameters[i] =
- substitution.substituteType(g.positionalParameters[i]);
- }
-
- List<NamedType> namedParameters = <NamedType>[];
- {
- // Assuming that the named parameters of both types are sorted
- // lexicographically.
- int i = 0;
- int j = 0;
- while (i < f.namedParameters.length && j < g.namedParameters.length) {
- NamedType named1 = f.namedParameters[i];
- NamedType named2 = g.namedParameters[j];
- int order = named1.name.compareTo(named2.name);
- NamedType named;
- if (order < 0) {
- named = new NamedType(named1.name, named1.type, isRequired: false);
- ++i;
- } else if (order > 0) {
- named = !named2.isRequired
- ? named2
- : new NamedType(
- named2.name, substitution.substituteType(named2.type),
- isRequired: false);
- ++j;
- } else {
- named = new NamedType(
- named1.name,
- _getNullabilityAwareStandardUpperBound(named1.type,
- substitution.substituteType(named2.type), clientLibrary),
- isRequired: named1.isRequired && named2.isRequired);
- ++i;
- ++j;
- }
- namedParameters.add(named);
- }
- while (i < f.namedParameters.length) {
- NamedType named1 = f.namedParameters[i];
- namedParameters.add(!named1.isRequired
- ? named1
- : new NamedType(named1.name, named1.type, isRequired: false));
- ++i;
- }
- while (j < g.namedParameters.length) {
- NamedType named2 = g.namedParameters[j];
- namedParameters.add(new NamedType(
- named2.name, substitution.substituteType(named2.type),
- isRequired: false));
- ++j;
- }
- }
-
- DartType returnType = _getNullabilityAwareStandardLowerBound(
- f.returnType, substitution.substituteType(g.returnType), clientLibrary);
-
- return new FunctionType(positionalParameters, returnType,
- intersectNullabilities(f.declaredNullability, g.declaredNullability),
- namedParameters: namedParameters,
- typeParameters: typeParameters,
- requiredParameterCount: minPos);
- }
-
- /// Computes the nullability-aware lower bound of two function types.
- ///
- /// UP(
- /// <X0 extends B00, ... Xm extends B0m>(P00, ... P0k) -> T0,
- /// <X0 extends B10, ... Xm extends B1m>(P10, ... P1l) -> T1)
- /// =
- /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
- /// if:
- /// each B0i and B1i are equal types (syntactically)
- /// Both have the same number of required positional parameters
- /// q is min(k, l)
- /// R0 is UP(T0, T1)
- /// B2i is B0i
- /// P2i is DOWN(P0i, P1i)
- /// UP(
- /// <X0 extends B00, ... Xm extends B0m>(P00, ... P0k, Named0) -> T0,
- /// <X0 extends B10, ... Xm extends B1m>(P10, ... P1k, Named1) -> T1)
- /// =
- /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
- /// if:
- /// each B0i and B1i are equal types (syntactically)
- /// All positional parameters are required
- /// R0 is UP(T0, T1)
- /// B2i is B0i
- /// P2i is DOWN(P0i, P1i)
- /// Named0 contains R0i xi
- /// if R1i xi is a required named parameter in Named1
- /// Named1 contains R1i xi
- /// if R0i xi is a required named parameter in Named0
- /// Named2 contains exactly R2i xi
- /// for each xi in both Named0 and Named1
- /// where R0i xi is in Named0
- /// where R1i xi is in Named1
- /// and R2i is DOWN(R0i, R1i)
- /// and R2i xi is required
- /// if xi is required in either Named0 or Named1
- /// UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
- DartType _getNullabilityAwareFunctionStandardUpperBound(
- FunctionType f, FunctionType g, Library clientLibrary) {
- bool haveNamed =
- f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
- bool haveOptionalPositional =
- f.requiredParameterCount < f.positionalParameters.length ||
- g.requiredParameterCount < g.positionalParameters.length;
-
- // The return value for whenever the following applies:
- // UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
- final DartType fallbackResult = coreTypes.functionRawType(
- uniteNullabilities(f.declaredNullability, g.declaredNullability));
-
- if (haveNamed && haveOptionalPositional) return fallbackResult;
- if (!haveNamed && f.requiredParameterCount != g.requiredParameterCount) {
- return fallbackResult;
- }
- // Here we perform a quick check on the function types to figure out if we
- // can compute a non-trivial upper bound for them. The check isn't merged
- // with the computation of the non-trivial upper bound itself to avoid
- // performing unnecessary computations.
- if (haveNamed) {
- if (f.positionalParameters.length != g.positionalParameters.length) {
- return fallbackResult;
- }
- // Assuming that the named parameters are sorted lexicographically in
- // both type1 and type2.
- int i = 0;
- int j = 0;
- while (i < f.namedParameters.length && j < g.namedParameters.length) {
- NamedType named1 = f.namedParameters[i];
- NamedType named2 = g.namedParameters[j];
- int order = named1.name.compareTo(named2.name);
- if (order < 0) {
- if (named1.isRequired) return fallbackResult;
- ++i;
- } else if (order > 0) {
- if (named2.isRequired) return fallbackResult;
- ++j;
- } else {
- ++i;
- ++j;
- }
- }
- while (i < f.namedParameters.length) {
- if (f.namedParameters[i].isRequired) return fallbackResult;
- ++i;
- }
- while (j < g.namedParameters.length) {
- if (g.namedParameters[j].isRequired) return fallbackResult;
- ++j;
- }
- }
-
- int m = f.typeParameters.length;
- bool boundsMatch = false;
- Substitution substitution = Substitution.empty;
- if (g.typeParameters.length == m) {
- boundsMatch = true;
- if (m != 0) {
- Map<TypeParameter, DartType> substitutionMap =
- <TypeParameter, DartType>{};
- for (int i = 0; i < m; ++i) {
- substitutionMap[g.typeParameters[i]] =
- new TypeParameterType.forAlphaRenaming(
- g.typeParameters[i], f.typeParameters[i]);
- }
- substitution = Substitution.fromMap(substitutionMap);
- for (int i = 0; i < m && boundsMatch; ++i) {
- // TODO(dmitryas): Figure out if a procedure for syntactic
- // equality should be used instead.
- if (!areMutualSubtypes(
- f.typeParameters[i].bound,
- substitution.substituteType(g.typeParameters[i].bound),
- SubtypeCheckMode.withNullabilities)) {
- boundsMatch = false;
- }
- }
- }
- }
- if (!boundsMatch) return fallbackResult;
- int minPos =
- math.min(f.positionalParameters.length, g.positionalParameters.length);
-
- List<TypeParameter> typeParameters = f.typeParameters;
-
- List<DartType> positionalParameters =
- new List<DartType>.filled(minPos, null);
- for (int i = 0; i < minPos; ++i) {
- positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
- f.positionalParameters[i],
- substitution.substituteType(g.positionalParameters[i]),
- clientLibrary);
- }
-
- List<NamedType> namedParameters = <NamedType>[];
- {
- // Assuming that the named parameters of both types are sorted
- // lexicographically.
- int i = 0;
- int j = 0;
- while (i < f.namedParameters.length && j < g.namedParameters.length) {
- NamedType named1 = f.namedParameters[i];
- NamedType named2 = g.namedParameters[j];
- int order = named1.name.compareTo(named2.name);
- if (order < 0) {
- ++i;
- } else if (order > 0) {
- ++j;
- } else {
- namedParameters.add(new NamedType(
- named1.name,
- _getNullabilityAwareStandardLowerBound(named1.type,
- substitution.substituteType(named2.type), clientLibrary),
- isRequired: named1.isRequired || named2.isRequired));
- ++i;
- ++j;
- }
- }
- }
-
- DartType returnType = _getNullabilityAwareStandardUpperBound(
- f.returnType, substitution.substituteType(g.returnType), clientLibrary);
-
- return new FunctionType(positionalParameters, returnType,
- uniteNullabilities(f.declaredNullability, g.declaredNullability),
- namedParameters: namedParameters,
- typeParameters: typeParameters,
- requiredParameterCount: f.requiredParameterCount);
- }
-
- DartType _getNullabilityAwareTypeParameterStandardUpperBound(
- TypeParameterType type1, DartType type2, Library clientLibrary) {
- if (type1.promotedBound == null) {
- // UP(X1 extends B1, T2) =
- // T2 if X1 <: T2
- // otherwise X1 if T2 <: X1
- // otherwise UP(B1[Object/X1], T2)
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
- return type2.withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
- return type1.withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
- type1.parameter: coreTypes.objectNonNullableRawType
- };
- return _getNullabilityAwareStandardUpperBound(
- substitute(type1.parameter.bound, substitution),
- type2,
- clientLibrary)
- .withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- } else {
- // UP(X1 & B1, T2) =
- // T2 if X1 <: T2
- // otherwise X1 if T2 <: X1
- // otherwise UP(B1[Object/X1], T2)
- DartType demoted =
- new TypeParameterType(type1.parameter, type1.declaredNullability);
- if (isSubtypeOf(demoted, type2, SubtypeCheckMode.withNullabilities)) {
- return type2.withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- if (isSubtypeOf(type2, demoted, SubtypeCheckMode.withNullabilities)) {
- return demoted.withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
- type1.parameter: coreTypes.objectNonNullableRawType
- };
- return _getNullabilityAwareStandardUpperBound(
- substitute(type1.promotedBound, substitution),
- type2,
- clientLibrary)
- .withDeclaredNullability(uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- }
-
- DartType _getNullabilityObliviousStandardUpperBound(
+ @override
+ DartType getNullabilityObliviousStandardUpperBoundInternal(
DartType type1, DartType type2, Library clientLibrary) {
- /*assert(type1 == legacyErasure(coreTypes, type1),
- "Non-legacy type $type1 in inference.");
- assert(type2 == legacyErasure(coreTypes, type2),
- "Non-legacy type $type2 in inference.");*/
- // For all types T, SUB(T,T) = T. Note that we don't test for equality
- // because we don't want to make the algorithm quadratic. This is ok
- // because the check is not needed for correctness; it's just a speed
- // optimization.
- if (identical(type1, type2)) {
- return type1;
- }
-
// For any type T, SUB(?, T) = SUB(T, ?) = T.
if (type1 is UnknownType) {
return type2;
@@ -1240,382 +68,7 @@
if (type2 is UnknownType) {
return type1;
}
-
- // SUB(void, T) = SUB(T, void) = void.
- if (type1 is VoidType) {
- return type1;
- }
- if (type2 is VoidType) {
- return type2;
- }
-
- // SUB(dynamic, T) = SUB(T, dynamic) = dynamic if T is not void.
- if (type1 is DynamicType) {
- return type1;
- }
- if (type2 is DynamicType) {
- return type2;
- }
-
- // SUB(Object, T) = SUB(T, Object) = Object if T is not void or dynamic.
- if (type1 == coreTypes.objectLegacyRawType) {
- return type1;
- }
- if (type2 == coreTypes.objectLegacyRawType) {
- return type2;
- }
-
- // SUB(bottom, T) = SUB(T, bottom) = T.
- if (type1 is BottomType) return type2;
- if (type2 is BottomType) return type1;
- if (type1 == coreTypes.nullType) return type2;
- if (type2 == coreTypes.nullType) return type1;
-
- if (type1 is TypeParameterType || type2 is TypeParameterType) {
- return _getNullabilityObliviousTypeParameterStandardUpperBound(
- type1, type2, clientLibrary);
- }
-
- // The standard upper bound of a function type and an interface type T is
- // the standard upper bound of Function and T.
- if (type1 is FunctionType &&
- (type2 is InterfaceType || type2 is FutureOrType)) {
- type1 = coreTypes.functionLegacyRawType;
- }
- if (type2 is FunctionType &&
- (type1 is InterfaceType || type2 is FutureOrType)) {
- type2 = coreTypes.functionLegacyRawType;
- }
-
- // At this point type1 and type2 should both either be interface types or
- // function types.
- if (type1 is InterfaceType && type2 is InterfaceType) {
- return _getInterfaceStandardUpperBound(type1, type2, clientLibrary);
- }
-
- if (type1 is FunctionType && type2 is FunctionType) {
- return _getNullabilityObliviousFunctionStandardUpperBound(
- type1, type2, clientLibrary);
- }
-
- if (type1 is FutureOrType || type2 is FutureOrType) {
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
- return type2;
- }
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
- return type1;
- }
- if (type1 is FutureOrType && type2 is FutureOrType) {
- return new FutureOrType(
- getStandardUpperBound(
- type1.typeArgument, type2.typeArgument, clientLibrary),
- uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability));
- }
- }
-
- if (type1 is InvalidType || type2 is InvalidType) {
- return const InvalidType();
- }
-
- // Should never happen. As a defensive measure, return the dynamic type.
- assert(false, "type1 = $type1; type2 = $type2");
- return const DynamicType();
- }
-
- /// Compute the standard lower bound of function types [f] and [g].
- ///
- /// The spec rules for SLB on function types, informally, are pretty simple:
- ///
- /// - If a parameter is required in both, it stays required.
- ///
- /// - If a positional parameter is optional or missing in one, it becomes
- /// optional. (This is because we're trying to build a function type which
- /// is a subtype of both [f] and [g], meaning it accepts all possible inputs
- /// that [f] and [g] accept.)
- ///
- /// - Named parameters are unioned together.
- ///
- /// - For any parameter that exists in both functions, use the SUB of them as
- /// the resulting parameter type.
- ///
- /// - Use the SLB of their return types.
- DartType _getNullabilityObliviousFunctionStandardLowerBound(
- FunctionType f, FunctionType g, Library clientLibrary) {
- // TODO(rnystrom,paulberry): Right now, this assumes f and g do not have any
- // type parameters. Revisit that in the presence of generic methods.
-
- // Calculate the SUB of each corresponding pair of parameters.
- int totalPositional =
- math.max(f.positionalParameters.length, g.positionalParameters.length);
- List<DartType> positionalParameters = new List<DartType>(totalPositional);
- for (int i = 0; i < totalPositional; i++) {
- if (i < f.positionalParameters.length) {
- DartType fType = f.positionalParameters[i];
- if (i < g.positionalParameters.length) {
- DartType gType = g.positionalParameters[i];
- positionalParameters[i] =
- getStandardUpperBound(fType, gType, clientLibrary);
- } else {
- positionalParameters[i] = fType;
- }
- } else {
- positionalParameters[i] = g.positionalParameters[i];
- }
- }
-
- // Parameters that are required in both functions are required in the
- // result. Parameters that are optional or missing in either end up
- // optional.
- int requiredParameterCount =
- math.min(f.requiredParameterCount, g.requiredParameterCount);
- bool hasPositional = requiredParameterCount < totalPositional;
-
- // Union the named parameters together.
- List<NamedType> namedParameters = [];
- {
- int i = 0;
- int j = 0;
- while (true) {
- if (i < f.namedParameters.length) {
- if (j < g.namedParameters.length) {
- String fName = f.namedParameters[i].name;
- String gName = g.namedParameters[j].name;
- int order = fName.compareTo(gName);
- if (order < 0) {
- namedParameters.add(f.namedParameters[i++]);
- } else if (order > 0) {
- namedParameters.add(g.namedParameters[j++]);
- } else {
- namedParameters.add(new NamedType(
- fName,
- getStandardUpperBound(f.namedParameters[i++].type,
- g.namedParameters[j++].type, clientLibrary)));
- }
- } else {
- namedParameters.addAll(f.namedParameters.skip(i));
- break;
- }
- } else {
- namedParameters.addAll(g.namedParameters.skip(j));
- break;
- }
- }
- }
- bool hasNamed = namedParameters.isNotEmpty;
-
- // Edge case. Dart does not support functions with both optional positional
- // and named parameters. If we would synthesize that, give up.
- if (hasPositional && hasNamed) return const BottomType();
-
- // Calculate the SLB of the return type.
- DartType returnType =
- getStandardLowerBound(f.returnType, g.returnType, clientLibrary);
- return new FunctionType(positionalParameters, returnType,
- intersectNullabilities(f.declaredNullability, g.declaredNullability),
- namedParameters: namedParameters,
- requiredParameterCount: requiredParameterCount);
- }
-
- /// Compute the standard upper bound of function types [f] and [g].
- ///
- /// The rules for SUB on function types, informally, are pretty simple:
- ///
- /// - If the functions don't have the same number of required parameters,
- /// always return `Function`.
- ///
- /// - Discard any optional named or positional parameters the two types do not
- /// have in common.
- ///
- /// - Compute the SLB of each corresponding pair of parameter types, and the
- /// SUB of the return types. Return a function type with those types.
- DartType _getNullabilityObliviousFunctionStandardUpperBound(
- FunctionType f, FunctionType g, Library clientLibrary) {
- // TODO(rnystrom): Right now, this assumes f and g do not have any type
- // parameters. Revisit that in the presence of generic methods.
-
- // If F and G differ in their number of required parameters, then the
- // standard upper bound of F and G is Function.
- // TODO(paulberry): We could do better here, e.g.:
- // SUB(([int]) -> void, (int) -> void) = (int) -> void
- if (f.requiredParameterCount != g.requiredParameterCount) {
- return new InterfaceType(
- coreTypes.functionClass,
- uniteNullabilities(f.declaredNullability, g.declaredNullability),
- const <DynamicType>[]);
- }
- int requiredParameterCount = f.requiredParameterCount;
-
- // Calculate the SLB of each corresponding pair of parameters.
- // Ignore any extra optional positional parameters if one has more than the
- // other.
- int totalPositional =
- math.min(f.positionalParameters.length, g.positionalParameters.length);
- List<DartType> positionalParameters = new List<DartType>(totalPositional);
- for (int i = 0; i < totalPositional; i++) {
- positionalParameters[i] = getStandardLowerBound(
- f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
- }
-
- // Intersect the named parameters.
- List<NamedType> namedParameters = [];
- {
- int i = 0;
- int j = 0;
- while (true) {
- if (i < f.namedParameters.length) {
- if (j < g.namedParameters.length) {
- String fName = f.namedParameters[i].name;
- String gName = g.namedParameters[j].name;
- int order = fName.compareTo(gName);
- if (order < 0) {
- i++;
- } else if (order > 0) {
- j++;
- } else {
- namedParameters.add(new NamedType(
- fName,
- getStandardLowerBound(f.namedParameters[i++].type,
- g.namedParameters[j++].type, clientLibrary)));
- }
- } else {
- break;
- }
- } else {
- break;
- }
- }
- }
-
- // Calculate the SUB of the return type.
- DartType returnType =
- getStandardUpperBound(f.returnType, g.returnType, clientLibrary);
- return new FunctionType(positionalParameters, returnType,
- uniteNullabilities(f.declaredNullability, g.declaredNullability),
- namedParameters: namedParameters,
- requiredParameterCount: requiredParameterCount);
- }
-
- DartType _getInterfaceStandardUpperBound(
- InterfaceType type1, InterfaceType type2, Library clientLibrary) {
- // This currently does not implement a very complete standard upper bound
- // algorithm, but handles a couple of the very common cases that are
- // causing pain in real code. The current algorithm is:
- // 1. If either of the types is a supertype of the other, return it.
- // This is in fact the best result in this case.
- // 2. If the two types have the same class element and is implicitly or
- // explicitly covariant, then take the pointwise standard upper bound of
- // the type arguments. This is again the best result, except that the
- // recursive calls may not return the true standard upper bounds. The
- // result is guaranteed to be a well-formed type under the assumption
- // that the input types were well-formed (and assuming that the
- // recursive calls return well-formed types).
- // If the variance of the type parameter is contravariant, we take the
- // standard lower bound of the type arguments. If the variance of the
- // type parameter is invariant, we verify if the type arguments satisfy
- // subtyping in both directions, then choose a bound.
- // 3. Otherwise return the spec-defined standard upper bound. This will
- // be an upper bound, might (or might not) be least, and might
- // (or might not) be a well-formed type.
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
- return type2;
- }
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
- return type1;
- }
- if (identical(type1.classNode, type2.classNode)) {
- List<DartType> tArgs1 = type1.typeArguments;
- List<DartType> tArgs2 = type2.typeArguments;
- List<TypeParameter> tParams = type1.classNode.typeParameters;
-
- assert(tArgs1.length == tArgs2.length);
- assert(tArgs1.length == tParams.length);
- List<DartType> tArgs = new List(tArgs1.length);
- for (int i = 0; i < tArgs1.length; i++) {
- if (tParams[i].variance == Variance.contravariant) {
- tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
- } else if (tParams[i].variance == Variance.invariant) {
- if (!areMutualSubtypes(
- tArgs1[i], tArgs2[i], SubtypeCheckMode.withNullabilities)) {
- // No bound will be valid, find bound at the interface level.
- return getLegacyLeastUpperBound(type1, type2, clientLibrary);
- }
- // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
- // parameters.
- tArgs[i] = tArgs1[i];
- } else {
- tArgs[i] = getStandardUpperBound(tArgs1[i], tArgs2[i], clientLibrary);
- }
- }
- return new InterfaceType(
- type1.classNode,
- uniteNullabilities(
- type1.declaredNullability, type2.declaredNullability),
- tArgs);
- }
- return getLegacyLeastUpperBound(type1, type2, clientLibrary);
- }
-
- DartType _getNullabilityObliviousTypeParameterStandardUpperBound(
- DartType type1, DartType type2, Library clientLibrary) {
- // This currently just implements a simple standard upper bound to
- // handle some common cases. It also avoids some termination issues
- // with the naive spec algorithm. The standard upper bound of two types
- // (at least one of which is a type parameter) is computed here as:
- // 1. If either type is a supertype of the other, return it.
- // 2. If the first type is a type parameter, replace it with its bound,
- // with recursive occurrences of itself replaced with Object.
- // The second part of this should ensure termination. Informally,
- // each type variable instantiation in one of the arguments to the
- // standard upper bound algorithm now strictly reduces the number
- // of bound variables in scope in that argument position.
- // 3. If the second type is a type parameter, do the symmetric operation
- // to #2.
- //
- // It's not immediately obvious why this is symmetric in the case that both
- // of them are type parameters. For #1, symmetry holds since subtype
- // is antisymmetric. For #2, it's clearly not symmetric if upper bounds of
- // bottom are allowed. Ignoring this (for various reasons, not least
- // of which that there's no way to write it), there's an informal
- // argument (that might even be right) that you will always either
- // end up expanding both of them or else returning the same result no matter
- // which order you expand them in. A key observation is that
- // identical(expand(type1), type2) => subtype(type1, type2)
- // and hence the contra-positive.
- //
- // TODO(leafp): Think this through and figure out what's the right
- // definition. Be careful about termination.
- //
- // I suspect in general a reasonable algorithm is to expand the innermost
- // type variable first. Alternatively, you could probably choose to treat
- // it as just an instance of the interface type upper bound problem, with
- // the "inheritance" chain extended by the bounds placed on the variables.
- if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
- return type2;
- }
- if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
- return type1;
- }
- if (type1 is TypeParameterType) {
- // TODO(paulberry): Analyzer collapses simple bounds in one step, i.e. for
- // C<T extends U, U extends List>, T gets resolved directly to List. Do
- // we need to replicate that behavior?
- return getStandardUpperBound(
- Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
- .substituteType(type1.parameter.bound),
- type2,
- clientLibrary);
- } else if (type2 is TypeParameterType) {
- return getStandardUpperBound(
- type1,
- Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
- .substituteType(type2.parameter.bound),
- clientLibrary);
- } else {
- // We should only be called when at least one of the types is a
- // TypeParameterType
- assert(false);
- return const DynamicType();
- }
+ return super.getNullabilityObliviousStandardUpperBoundInternal(
+ type1, type2, clientLibrary);
}
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 8a268cb..4586a2a 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1651,7 +1651,8 @@
InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
FunctionType calleeType, Arguments arguments,
{List<VariableDeclaration> hoistedExpressions,
- bool isOverloadedArithmeticOperator: false,
+ bool isSpecialCasedBinaryOperator: false,
+ bool isSpecialCasedTernaryOperator: false,
DartType returnType,
DartType receiverType,
bool skipTypeArgumentInference: false,
@@ -1668,7 +1669,8 @@
"Unexpected explicit return type for extension method invocation.");
return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
typeContext, offset, calleeType, arguments, hoistedExpressions,
- isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+ isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
receiverType: receiverType,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst,
@@ -1676,7 +1678,8 @@
}
return _inferInvocation(
typeContext, offset, calleeType, arguments, hoistedExpressions,
- isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+ isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
receiverType: receiverType,
returnType: returnType,
skipTypeArgumentInference: skipTypeArgumentInference,
@@ -1692,7 +1695,8 @@
FunctionType calleeType,
Arguments arguments,
List<VariableDeclaration> hoistedExpressions,
- {bool isOverloadedArithmeticOperator: false,
+ {bool isSpecialCasedBinaryOperator: false,
+ bool isSpecialCasedTernaryOperator: false,
DartType receiverType,
bool skipTypeArgumentInference: false,
bool isConst: false,
@@ -1737,7 +1741,8 @@
named: arguments.named, types: getExplicitTypeArguments(arguments));
InvocationInferenceResult result = _inferInvocation(typeContext, offset,
targetFunctionType, targetArguments, hoistedExpressions,
- isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+ isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst,
isImplicitCall: isImplicitCall);
@@ -1762,7 +1767,8 @@
FunctionType calleeType,
Arguments arguments,
List<VariableDeclaration> hoistedExpressions,
- {bool isOverloadedArithmeticOperator: false,
+ {bool isSpecialCasedBinaryOperator: false,
+ bool isSpecialCasedTernaryOperator: false,
DartType receiverType,
DartType returnType,
bool skipTypeArgumentInference: false,
@@ -1854,13 +1860,25 @@
"invocation.");
continue;
} else {
+ if (isSpecialCasedBinaryOperator) {
+ inferredFormalType =
+ typeSchemaEnvironment.getContextTypeOfSpecialCasedBinaryOperator(
+ typeContext, receiverType, inferredFormalType,
+ isNonNullableByDefault: isNonNullableByDefault);
+ } else if (isSpecialCasedTernaryOperator) {
+ inferredFormalType =
+ typeSchemaEnvironment.getContextTypeOfSpecialCasedTernaryOperator(
+ typeContext, receiverType, inferredFormalType,
+ isNonNullableByDefault: isNonNullableByDefault);
+ }
ExpressionInferenceResult result = inferExpression(
arguments.positional[position],
isNonNullableByDefault
? inferredFormalType
: legacyErasure(coreTypes, inferredFormalType),
inferenceNeeded ||
- isOverloadedArithmeticOperator ||
+ isSpecialCasedBinaryOperator ||
+ isSpecialCasedTernaryOperator ||
typeChecksNeeded);
inferredType = result.inferredType == null || isNonNullableByDefault
? result.inferredType
@@ -1873,10 +1891,14 @@
formalTypes.add(formalType);
actualTypes.add(inferredType);
}
- if (isOverloadedArithmeticOperator) {
- returnType = typeSchemaEnvironment.getTypeOfOverloadedArithmetic(
- receiverType, inferredType);
- }
+ }
+ if (isSpecialCasedBinaryOperator) {
+ returnType = typeSchemaEnvironment.getTypeOfSpecialCasedBinaryOperator(
+ receiverType, actualTypes[0],
+ isNonNullableByDefault: isNonNullableByDefault);
+ } else if (isSpecialCasedTernaryOperator) {
+ returnType = typeSchemaEnvironment.getTypeOfSpecialCasedTernaryOperator(
+ receiverType, actualTypes[0], actualTypes[1], library.library);
}
for (NamedExpression namedArgument in arguments.named) {
DartType formalType =
@@ -1889,9 +1911,7 @@
isNonNullableByDefault
? inferredFormalType
: legacyErasure(coreTypes, inferredFormalType),
- inferenceNeeded ||
- isOverloadedArithmeticOperator ||
- typeChecksNeeded);
+ inferenceNeeded || isSpecialCasedBinaryOperator || typeChecksNeeded);
DartType inferredType =
result.inferredType == null || isNonNullableByDefault
? result.inferredType
@@ -2134,12 +2154,15 @@
if (formal.isImplicitlyTyped) {
DartType inferredType;
if (formalTypesFromContext[i] != null) {
- if (coreTypes.isBottom(formalTypesFromContext[i]) ||
- coreTypes.isNull(formalTypesFromContext[i])) {
+ inferredType = computeGreatestClosure2(
+ substitution.substituteType(formalTypesFromContext[i]));
+ if (typeSchemaEnvironment.isSubtypeOf(
+ inferredType,
+ coreTypes.nullType,
+ isNonNullableByDefault
+ ? SubtypeCheckMode.withNullabilities
+ : SubtypeCheckMode.ignoringNullabilities)) {
inferredType = coreTypes.objectRawType(library.nullable);
- } else {
- inferredType = computeGreatestClosure2(
- substitution.substituteType(formalTypesFromContext[i]));
}
} else {
inferredType = const DynamicType();
@@ -2479,8 +2502,12 @@
Arguments arguments,
DartType typeContext,
List<VariableDeclaration> hoistedExpressions,
- {bool isImplicitCall}) {
+ {bool isImplicitCall,
+ bool isSpecialCasedBinaryOperator,
+ bool isSpecialCasedTernaryOperator}) {
assert(isImplicitCall != null);
+ assert(isSpecialCasedBinaryOperator != null);
+ assert(isSpecialCasedTernaryOperator != null);
assert(target.isInstanceMember || target.isNullableInstanceMember);
Procedure method = target.member;
assert(method.kind == ProcedureKind.Method,
@@ -2521,7 +2548,9 @@
typeContext, fileOffset, functionType, arguments,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
- isImplicitCall: isImplicitCall);
+ isImplicitCall: isImplicitCall,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+ isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator);
Expression replacement;
if (contravariantCheck) {
@@ -2837,6 +2866,7 @@
ObjectAccessTarget target = findInterfaceMember(
receiverType, name, fileOffset,
instrumented: true, includeExtensionMethods: true);
+
switch (target.kind) {
case ObjectAccessTargetKind.instanceMember:
case ObjectAccessTargetKind.nullableInstanceMember:
@@ -2854,6 +2884,9 @@
hoistedExpressions,
isExpressionInvocation: isExpressionInvocation);
} else {
+ bool isSpecialCasedBinaryOperator =
+ isSpecialCasedBinaryOperatorForReceiverType(
+ target, receiverType);
return _inferInstanceMethodInvocation(
fileOffset,
nullAwareGuards,
@@ -2863,7 +2896,10 @@
arguments,
typeContext,
hoistedExpressions,
- isImplicitCall: isImplicitCall);
+ isImplicitCall: isImplicitCall,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
+ isSpecialCasedTernaryOperator:
+ isSpecialCasedTernaryOperator(target));
}
} else {
return _inferInstanceFieldInvocation(
@@ -2969,12 +3005,20 @@
}
}
- bool isOverloadedArithmeticOperatorAndType(
+ bool isSpecialCasedBinaryOperatorForReceiverType(
ObjectAccessTarget target, DartType receiverType) {
return (target.isInstanceMember || target.isNullableInstanceMember) &&
target.member is Procedure &&
- typeSchemaEnvironment.isOverloadedArithmeticOperatorAndType(
- target.member, receiverType);
+ typeSchemaEnvironment.isSpecialCasesBinaryForReceiverType(
+ target.member, receiverType,
+ isNonNullableByDefault: isNonNullableByDefault);
+ }
+
+ bool isSpecialCasedTernaryOperator(ObjectAccessTarget target) {
+ return (target.isInstanceMember || target.isNullableInstanceMember) &&
+ target.member is Procedure &&
+ typeSchemaEnvironment.isSpecialCasedTernaryOperator(target.member,
+ isNonNullableByDefault: isNonNullableByDefault);
}
/// Performs the core type inference algorithm for super method invocations.
@@ -2987,14 +3031,22 @@
Name methodName = expression.name;
Arguments arguments = expression.arguments;
DartType receiverType = thisType;
- bool isOverloadedArithmeticOperator =
- isOverloadedArithmeticOperatorAndType(target, receiverType);
+ bool isSpecialCasedBinaryOperator =
+ isSpecialCasedBinaryOperatorForReceiverType(target, receiverType);
DartType calleeType = getGetterType(target, receiverType);
FunctionType functionType = getFunctionType(target, receiverType);
-
+ if (isNonNullableByDefault &&
+ expression.name == equalsName &&
+ functionType.positionalParameters.length == 1) {
+ // operator == always allows nullable arguments.
+ functionType = new FunctionType([
+ functionType.positionalParameters.single
+ .withDeclaredNullability(library.nullable)
+ ], functionType.returnType, functionType.declaredNullability);
+ }
InvocationInferenceResult result = inferInvocation(
typeContext, fileOffset, functionType, arguments,
- isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
+ isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
receiverType: receiverType,
isImplicitExtensionMember: target.isExtensionMember);
DartType inferredType = result.inferredType;
@@ -3175,7 +3227,7 @@
DartType step1 = resolveOneStep(hare);
if (step1 == null) return hare;
DartType step2 = resolveOneStep(step1);
- if (step2 == null) return hare;
+ if (step2 == null) return step1;
hare = step2;
// Tortoise takes one step
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index db7ce6d..e146a54 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -28,7 +28,7 @@
import 'package:kernel/src/hierarchy_based_type_environment.dart'
show HierarchyBasedTypeEnvironment;
-import 'standard_bounds.dart' show StandardBounds;
+import 'standard_bounds.dart' show TypeSchemaStandardBounds;
import 'type_constraint_gatherer.dart' show TypeConstraintGatherer;
@@ -38,8 +38,6 @@
import 'type_schema_elimination.dart' show greatestClosure, leastClosure;
-import '../problems.dart';
-
// TODO(paulberry): try to push this functionality into kernel.
FunctionType substituteTypeParams(
FunctionType type,
@@ -101,7 +99,7 @@
}
class TypeSchemaEnvironment extends HierarchyBasedTypeEnvironment
- with StandardBounds {
+ with TypeSchemaStandardBounds {
final ClassHierarchy hierarchy;
TypeSchemaEnvironment(CoreTypes coreTypes, this.hierarchy)
@@ -119,24 +117,6 @@
return coreTypes.objectRawType(nullability);
}
- bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
- IsSubtypeOf result = performNullabilityAwareMutualSubtypesCheck(s, t);
- switch (mode) {
- case SubtypeCheckMode.ignoringNullabilities:
- return result.isSubtypeWhenIgnoringNullabilities();
- case SubtypeCheckMode.withNullabilities:
- return result.isSubtypeWhenUsingNullabilities();
- }
- return unhandled(
- "$mode", "TypeSchemaEnvironment.areMutualSubtypes", -1, null);
- }
-
- InterfaceType getLegacyLeastUpperBound(
- InterfaceType type1, InterfaceType type2, Library clientLibrary) {
- return hierarchy.getLegacyLeastUpperBound(
- type1, type2, clientLibrary, this.coreTypes);
- }
-
/// Modify the given [constraint]'s lower bound to include [lower].
void addLowerBound(
TypeConstraint constraint, DartType lower, Library clientLibrary) {
@@ -152,19 +132,103 @@
}
@override
- DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) {
- // TODO(paulberry): this matches what is defined in the spec. It would be
- // nice if we could change kernel to match the spec and not have to
- // override.
- if (type1 is InterfaceType && type1.classNode == coreTypes.intClass) {
- if (type2 is InterfaceType && type2.classNode == coreTypes.intClass) {
- return type2.withDeclaredNullability(type1.nullability);
+ DartType getTypeOfSpecialCasedBinaryOperator(DartType type1, DartType type2,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ return super.getTypeOfSpecialCasedBinaryOperator(type1, type2,
+ isNonNullableByDefault: isNonNullableByDefault);
+ } else {
+ // TODO(paulberry): this matches what is defined in the spec. It would be
+ // nice if we could change kernel to match the spec and not have to
+ // override.
+ if (type1 is InterfaceType && type1.classNode == coreTypes.intClass) {
+ if (type2 is InterfaceType && type2.classNode == coreTypes.intClass) {
+ return type2.withDeclaredNullability(type1.nullability);
+ }
+ if (type2 is InterfaceType &&
+ type2.classNode == coreTypes.doubleClass) {
+ return type2.withDeclaredNullability(type1.nullability);
+ }
}
- if (type2 is InterfaceType && type2.classNode == coreTypes.doubleClass) {
- return type2.withDeclaredNullability(type1.nullability);
+ return coreTypes.numRawType(type1.nullability);
+ }
+ }
+
+ DartType getContextTypeOfSpecialCasedBinaryOperator(
+ DartType contextType, DartType type1, DartType type2,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ if (contextType is! NeverType &&
+ type1 is! NeverType &&
+ isSubtypeOf(contextType, coreTypes.numNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type1, coreTypes.numNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If e is an expression of the form e1 + e2, e1 - e2, e1 * e2, e1 % e2
+ // or e1.remainder(e2), where C is the context type of e and T is the
+ // static type of e1, and where T is a non-Never subtype of num, then:
+ if (isSubtypeOf(coreTypes.intNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If int <: C, not num <: C, and T <: int, then the context type of
+ // e2 is int.
+ return coreTypes.intNonNullableRawType;
+ } else if (isSubtypeOf(coreTypes.doubleNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ !isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If double <: C, not num <: C, and not T <: double, then the context
+ // type of e2 is double.
+ return coreTypes.doubleNonNullableRawType;
+ } else {
+ // Otherwise, the context type of e2 is num.
+ return coreTypes.numNonNullableRawType;
+ }
}
}
- return coreTypes.numRawType(type1.nullability);
+ return type2;
+ }
+
+ DartType getContextTypeOfSpecialCasedTernaryOperator(
+ DartType contextType, DartType receiverType, DartType operandType,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ if (receiverType is! NeverType &&
+ isSubtypeOf(receiverType, coreTypes.numNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If e is an expression of the form e1.clamp(e2, e3) where C is the
+ // context type of e and T is the static type of e1 where T is a
+ // non-Never subtype of num, then:
+ if (isSubtypeOf(coreTypes.intNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(receiverType, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If int <: C, not num <: C, and T <: int, then the context type of
+ // e2 and e3 is int.
+ return coreTypes.intNonNullableRawType;
+ } else if (isSubtypeOf(coreTypes.doubleNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ !isSubtypeOf(coreTypes.numNonNullableRawType, contextType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(receiverType, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If double <: C, not num <: C, and T <: double, then the context
+ // type of e2 and e3 is double.
+ return coreTypes.doubleNonNullableRawType;
+ } else {
+ // Otherwise the context type of e2 an e3 is num
+ return coreTypes.numNonNullableRawType;
+ }
+ }
+ }
+ return operandType;
}
/// Infers a generic type, function, method, or list/map literal
@@ -380,17 +444,22 @@
///
/// This is a case of type-based overloading, which in Dart is only supported
/// by giving special treatment to certain arithmetic operators.
- bool isOverloadedArithmeticOperatorAndType(
- Procedure member, DartType receiverType) {
- // TODO(paulberry): this matches what is defined in the spec. It would be
- // nice if we could change kernel to match the spec and not have to
- // override.
- if (member.name.name == 'remainder') return false;
- if (!(receiverType is InterfaceType &&
- identical(receiverType.classNode, coreTypes.intClass))) {
- return false;
+ bool isSpecialCasesBinaryForReceiverType(
+ Procedure member, DartType receiverType,
+ {bool isNonNullableByDefault}) {
+ assert(isNonNullableByDefault != null);
+ if (!isNonNullableByDefault) {
+ // TODO(paulberry): this matches what is defined in the spec. It would be
+ // nice if we could change kernel to match the spec and not have to
+ // override.
+ if (member.name.name == 'remainder') return false;
+ if (!(receiverType is InterfaceType &&
+ identical(receiverType.classNode, coreTypes.intClass))) {
+ return false;
+ }
}
- return isOverloadedArithmeticOperator(member);
+ return isSpecialCasedBinaryOperator(member,
+ isNonNullableByDefault: isNonNullableByDefault);
}
@override
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 3966bbe..ecf30d2 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1902,18 +1902,6 @@
lib2.dart: "class A {}"
main.dart: "export 'lib1.dart'; export 'lib2.dart';"
-DuplicatedLibraryExport:
- template: "A library with name '#name' is exported more than once."
- analyzerCode: EXPORT_DUPLICATED_LIBRARY_NAMED
- script:
- lib1.dart: "library foo;"
- lib2.dart: "library foo;"
- main.dart: "export 'lib1.dart'; export 'lib2.dart';"
-
-DuplicatedLibraryExportContext:
- template: "'#name' is also exported here."
- severity: CONTEXT
-
DuplicatedExportInType:
template: "'#name' is exported from both '#uri' and '#uri2'."
@@ -1921,19 +1909,6 @@
template: "'#name' is imported from both '#uri' and '#uri2'."
severity: IGNORED
-DuplicatedLibraryImport:
- template: "A library with name '#name' is imported more than once."
- severity: WARNING
- analyzerCode: IMPORT_DUPLICATED_LIBRARY_NAMED
- script:
- lib1.dart: "library foo;"
- lib2.dart: "library foo;"
- main.dart: "import 'lib1.dart'; import 'lib2.dart';"
-
-DuplicatedLibraryImportContext:
- template: "'#name' is also imported here."
- severity: CONTEXT
-
DuplicatedImportInType:
template: "'#name' is imported from both '#uri' and '#uri2'."
analyzerCode: AMBIGUOUS_IMPORT
@@ -3914,7 +3889,7 @@
severity: CONTEXT
NonNullAwareSpreadIsNull:
- template: "Can't spread a value with static type Null."
+ template: "Can't spread a value with static type '#type'."
script: >
main() {
<int>[...null];
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
index d5d26ac..885081b 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.expect
@@ -60,8 +60,8 @@
handleType(Object, null)
handleClassExtends(extends)
beginTypeList(M)
- handleNoTypeVariables(()
beginFunctionType(M)
+ handleNoTypeVariables(()
handleIdentifier(M, typeReference)
beginTypeArguments(<)
handleIdentifier(dynamic, typeReference)
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
index 52766bc..bceda2e 100644
--- a/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_41265.crash_dart.intertwined.expect
@@ -92,8 +92,8 @@
parseWithClauseOpt(Object)
parseTypeList(with)
listener: beginTypeList(M)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(M)
+ listener: handleNoTypeVariables(()
ensureIdentifier(with, typeReference)
listener: handleIdentifier(M, typeReference)
listener: beginTypeArguments(<)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
index 5aa54f3..5a39839 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.expect
@@ -482,8 +482,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'abstract'., null, {token: abstract}], abstract, abstract)
handleIdentifier(abstract, typedefDeclaration)
handleNoTypeVariables(=)
- handleNoTypeVariables(()
beginFunctionType(void)
+ handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -507,8 +507,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'as'., null, {token: as}], as, as)
handleIdentifier(as, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -532,8 +532,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'assert'., null, {token: assert}], assert, assert)
handleIdentifier(assert, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -555,8 +555,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(async, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -578,8 +578,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(await, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -603,8 +603,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'break'., null, {token: break}], break, break)
handleIdentifier(break, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -628,8 +628,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'case'., null, {token: case}], case, case)
handleIdentifier(case, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -653,8 +653,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'catch'., null, {token: catch}], catch, catch)
handleIdentifier(catch, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -678,8 +678,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'class'., null, {token: class}], class, class)
handleIdentifier(class, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -703,8 +703,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'const'., null, {token: const}], const, const)
handleIdentifier(const, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -728,8 +728,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'continue'., null, {token: continue}], continue, continue)
handleIdentifier(continue, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -753,8 +753,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'covariant'., null, {token: covariant}], covariant, covariant)
handleIdentifier(covariant, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -778,8 +778,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'default'., null, {token: default}], default, default)
handleIdentifier(default, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -803,8 +803,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'deferred'., null, {token: deferred}], deferred, deferred)
handleIdentifier(deferred, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -828,8 +828,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'do'., null, {token: do}], do, do)
handleIdentifier(do, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -853,8 +853,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'dynamic'., null, {token: dynamic}], dynamic, dynamic)
handleIdentifier(dynamic, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -878,8 +878,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'else'., null, {token: else}], else, else)
handleIdentifier(else, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -903,8 +903,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'enum'., null, {token: enum}], enum, enum)
handleIdentifier(enum, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -928,8 +928,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'export'., null, {token: export}], export, export)
handleIdentifier(export, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -953,8 +953,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extends'., null, {token: extends}], extends, extends)
handleIdentifier(extends, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -978,8 +978,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extension'., null, {token: extension}], extension, extension)
handleIdentifier(extension, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1003,8 +1003,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'external'., null, {token: external}], external, external)
handleIdentifier(external, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1028,8 +1028,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'factory'., null, {token: factory}], factory, factory)
handleIdentifier(factory, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1053,8 +1053,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'false'., null, {token: false}], false, false)
handleIdentifier(false, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1078,8 +1078,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'final'., null, {token: final}], final, final)
handleIdentifier(final, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1103,8 +1103,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'finally'., null, {token: finally}], finally, finally)
handleIdentifier(finally, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1128,8 +1128,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'for'., null, {token: for}], for, for)
handleIdentifier(for, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1153,8 +1153,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'Function'., null, {token: Function}], Function, Function)
handleIdentifier(Function, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1178,8 +1178,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'get'., null, {token: get}], get, get)
handleIdentifier(get, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1201,8 +1201,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(hide, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1226,8 +1226,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'if'., null, {token: if}], if, if)
handleIdentifier(if, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1251,8 +1251,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'implements'., null, {token: implements}], implements, implements)
handleIdentifier(implements, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1276,8 +1276,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'import'., null, {token: import}], import, import)
handleIdentifier(import, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1301,8 +1301,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'in'., null, {token: in}], in, in)
handleIdentifier(in, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1324,8 +1324,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(inout, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1349,8 +1349,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'interface'., null, {token: interface}], interface, interface)
handleIdentifier(interface, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1374,8 +1374,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'is'., null, {token: is}], is, is)
handleIdentifier(is, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1399,8 +1399,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'late'., null, {token: late}], late, late)
handleIdentifier(late, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1424,8 +1424,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'library'., null, {token: library}], library, library)
handleIdentifier(library, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1449,8 +1449,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'mixin'., null, {token: mixin}], mixin, mixin)
handleIdentifier(mixin, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1472,8 +1472,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(native, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1497,8 +1497,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'new'., null, {token: new}], new, new)
handleIdentifier(new, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1522,8 +1522,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'null'., null, {token: null}], null, null)
handleIdentifier(null, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1545,8 +1545,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(of, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1568,8 +1568,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(on, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1593,8 +1593,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'operator'., null, {token: operator}], operator, operator)
handleIdentifier(operator, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1616,8 +1616,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(out, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1641,8 +1641,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'part'., null, {token: part}], part, part)
handleIdentifier(part, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1664,8 +1664,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(patch, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1689,8 +1689,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'required'., null, {token: required}], required, required)
handleIdentifier(required, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1714,8 +1714,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'rethrow'., null, {token: rethrow}], rethrow, rethrow)
handleIdentifier(rethrow, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1739,8 +1739,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'return'., null, {token: return}], return, return)
handleIdentifier(return, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1764,8 +1764,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'set'., null, {token: set}], set, set)
handleIdentifier(set, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1787,8 +1787,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(show, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1810,8 +1810,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(source, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1835,8 +1835,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'static'., null, {token: static}], static, static)
handleIdentifier(static, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1860,8 +1860,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'super'., null, {token: super}], super, super)
handleIdentifier(super, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1885,8 +1885,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'switch'., null, {token: switch}], switch, switch)
handleIdentifier(switch, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1908,8 +1908,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(sync, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1933,8 +1933,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'this'., null, {token: this}], this, this)
handleIdentifier(this, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1958,8 +1958,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'throw'., null, {token: throw}], throw, throw)
handleIdentifier(throw, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -1983,8 +1983,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'true'., null, {token: true}], true, true)
handleIdentifier(true, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2008,8 +2008,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'try'., null, {token: try}], try, try)
handleIdentifier(try, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2033,8 +2033,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'typedef'., null, {token: typedef}], typedef, typedef)
handleIdentifier(typedef, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2058,8 +2058,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'var'., null, {token: var}], var, var)
handleIdentifier(var, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2127,8 +2127,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'while'., null, {token: while}], while, while)
handleIdentifier(while, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2152,8 +2152,8 @@
handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'with'., null, {token: with}], with, with)
handleIdentifier(with, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
@@ -2175,8 +2175,8 @@
beginFunctionTypeAlias(typedef)
handleIdentifier(yield, typedefDeclaration)
handleNoTypeVariables(=)
-handleNoTypeVariables(()
beginFunctionType(void)
+handleNoTypeVariables(()
handleVoidKeyword(void)
beginFormalParameters((, MemberKind.GeneralizedFunctionType)
endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
diff --git a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
index eea917a..80fc687 100644
--- a/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
+++ b/pkg/front_end/parser_testcases/error_recovery/keyword_named_typedefs.dart.intertwined.expect
@@ -36,8 +36,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'abstract'., null, {token: abstract}], abstract, abstract)
listener: handleIdentifier(abstract, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -81,8 +81,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'as'., null, {token: as}], as, as)
listener: handleIdentifier(as, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -126,8 +126,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'assert'., null, {token: assert}], assert, assert)
listener: handleIdentifier(assert, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -167,8 +167,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(async, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -208,8 +208,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(await, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -253,8 +253,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'break'., null, {token: break}], break, break)
listener: handleIdentifier(break, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -298,8 +298,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'case'., null, {token: case}], case, case)
listener: handleIdentifier(case, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -343,8 +343,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'catch'., null, {token: catch}], catch, catch)
listener: handleIdentifier(catch, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -388,8 +388,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'class'., null, {token: class}], class, class)
listener: handleIdentifier(class, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -433,8 +433,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'const'., null, {token: const}], const, const)
listener: handleIdentifier(const, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -478,8 +478,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'continue'., null, {token: continue}], continue, continue)
listener: handleIdentifier(continue, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -523,8 +523,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'covariant'., null, {token: covariant}], covariant, covariant)
listener: handleIdentifier(covariant, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -568,8 +568,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'default'., null, {token: default}], default, default)
listener: handleIdentifier(default, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -613,8 +613,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'deferred'., null, {token: deferred}], deferred, deferred)
listener: handleIdentifier(deferred, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -658,8 +658,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'do'., null, {token: do}], do, do)
listener: handleIdentifier(do, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -703,8 +703,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'dynamic'., null, {token: dynamic}], dynamic, dynamic)
listener: handleIdentifier(dynamic, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -748,8 +748,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'else'., null, {token: else}], else, else)
listener: handleIdentifier(else, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -793,8 +793,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'enum'., null, {token: enum}], enum, enum)
listener: handleIdentifier(enum, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -838,8 +838,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'export'., null, {token: export}], export, export)
listener: handleIdentifier(export, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -883,8 +883,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extends'., null, {token: extends}], extends, extends)
listener: handleIdentifier(extends, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -928,8 +928,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'extension'., null, {token: extension}], extension, extension)
listener: handleIdentifier(extension, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -973,8 +973,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'external'., null, {token: external}], external, external)
listener: handleIdentifier(external, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1018,8 +1018,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'factory'., null, {token: factory}], factory, factory)
listener: handleIdentifier(factory, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1063,8 +1063,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'false'., null, {token: false}], false, false)
listener: handleIdentifier(false, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1108,8 +1108,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'final'., null, {token: final}], final, final)
listener: handleIdentifier(final, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1153,8 +1153,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'finally'., null, {token: finally}], finally, finally)
listener: handleIdentifier(finally, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1198,8 +1198,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'for'., null, {token: for}], for, for)
listener: handleIdentifier(for, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1243,8 +1243,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'Function'., null, {token: Function}], Function, Function)
listener: handleIdentifier(Function, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1288,8 +1288,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'get'., null, {token: get}], get, get)
listener: handleIdentifier(get, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1329,8 +1329,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(hide, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1374,8 +1374,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'if'., null, {token: if}], if, if)
listener: handleIdentifier(if, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1419,8 +1419,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'implements'., null, {token: implements}], implements, implements)
listener: handleIdentifier(implements, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1464,8 +1464,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'import'., null, {token: import}], import, import)
listener: handleIdentifier(import, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1509,8 +1509,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'in'., null, {token: in}], in, in)
listener: handleIdentifier(in, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1550,8 +1550,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(inout, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1595,8 +1595,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'interface'., null, {token: interface}], interface, interface)
listener: handleIdentifier(interface, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1640,8 +1640,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'is'., null, {token: is}], is, is)
listener: handleIdentifier(is, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1685,8 +1685,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'late'., null, {token: late}], late, late)
listener: handleIdentifier(late, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1730,8 +1730,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'library'., null, {token: library}], library, library)
listener: handleIdentifier(library, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1775,8 +1775,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'mixin'., null, {token: mixin}], mixin, mixin)
listener: handleIdentifier(mixin, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1816,8 +1816,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(native, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1861,8 +1861,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'new'., null, {token: new}], new, new)
listener: handleIdentifier(new, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1906,8 +1906,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'null'., null, {token: null}], null, null)
listener: handleIdentifier(null, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1947,8 +1947,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(of, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -1988,8 +1988,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(on, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2033,8 +2033,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'operator'., null, {token: operator}], operator, operator)
listener: handleIdentifier(operator, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2074,8 +2074,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(out, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2119,8 +2119,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'part'., null, {token: part}], part, part)
listener: handleIdentifier(part, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2160,8 +2160,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(patch, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2205,8 +2205,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'required'., null, {token: required}], required, required)
listener: handleIdentifier(required, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2250,8 +2250,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'rethrow'., null, {token: rethrow}], rethrow, rethrow)
listener: handleIdentifier(rethrow, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2295,8 +2295,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'return'., null, {token: return}], return, return)
listener: handleIdentifier(return, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2340,8 +2340,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'set'., null, {token: set}], set, set)
listener: handleIdentifier(set, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2381,8 +2381,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(show, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2422,8 +2422,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(source, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2467,8 +2467,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'static'., null, {token: static}], static, static)
listener: handleIdentifier(static, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2512,8 +2512,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'super'., null, {token: super}], super, super)
listener: handleIdentifier(super, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2557,8 +2557,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'switch'., null, {token: switch}], switch, switch)
listener: handleIdentifier(switch, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2598,8 +2598,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(sync, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2643,8 +2643,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'this'., null, {token: this}], this, this)
listener: handleIdentifier(this, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2688,8 +2688,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'throw'., null, {token: throw}], throw, throw)
listener: handleIdentifier(throw, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2733,8 +2733,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'true'., null, {token: true}], true, true)
listener: handleIdentifier(true, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2778,8 +2778,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'try'., null, {token: try}], try, try)
listener: handleIdentifier(try, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2823,8 +2823,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'typedef'., null, {token: typedef}], typedef, typedef)
listener: handleIdentifier(typedef, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -2868,8 +2868,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'var'., null, {token: var}], var, var)
listener: handleIdentifier(var, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3001,8 +3001,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'while'., null, {token: while}], while, while)
listener: handleIdentifier(while, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3046,8 +3046,8 @@
listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'with'., null, {token: with}], with, with)
listener: handleIdentifier(with, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
@@ -3087,8 +3087,8 @@
ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
listener: handleIdentifier(yield, typedefDeclaration)
listener: handleNoTypeVariables(=)
- listener: handleNoTypeVariables(()
listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
listener: handleVoidKeyword(void)
parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart
new file mode 100644
index 0000000..4cdd14e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart
@@ -0,0 +1,41 @@
+// 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.
+
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+ Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
new file mode 100644
index 0000000..e210455
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.expect
@@ -0,0 +1,984 @@
+beginCompilationUnit(typedef)
+ beginMetadataStar(typedef)
+ endMetadataStar(0)
+ beginFunctionTypeAlias(typedef)
+ handleIdentifier(E1, typedefDeclaration)
+ beginTypeVariables(<)
+ beginMetadataStar(T)
+ endMetadataStar(0)
+ handleIdentifier(T, typeVariableDeclaration)
+ beginTypeVariable(T)
+ handleTypeVariablesDefined(T, 1)
+ handleNoType(T)
+ endTypeVariable(>, 0, null, null)
+ endTypeVariables(<, >)
+ beginFunctionType(void)
+ handleNoTypeVariables(()
+ handleVoidKeyword(void)
+ beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ endFunctionType(Function, null)
+ endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+ handleIdentifier(E2, typedefDeclaration)
+ beginTypeVariables(<)
+ beginMetadataStar(T)
+ endMetadataStar(0)
+ handleIdentifier(T, typeVariableDeclaration)
+ beginTypeVariable(T)
+ handleTypeVariablesDefined(num, 1)
+ handleIdentifier(num, typeReference)
+ handleNoTypeArguments(>)
+ handleType(num, null)
+ endTypeVariable(>, 0, extends, null)
+ endTypeVariables(<, >)
+ beginFunctionType(void)
+ handleNoTypeVariables(()
+ handleVoidKeyword(void)
+ beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E3, typedefDeclaration)
+beginTypeVariables(<)
+ beginMetadataStar(T)
+ endMetadataStar(0)
+ handleIdentifier(T, typeVariableDeclaration)
+ beginTypeVariable(T)
+ beginMetadataStar(S)
+ endMetadataStar(0)
+ handleIdentifier(S, typeVariableDeclaration)
+ beginTypeVariable(S)
+ handleTypeVariablesDefined(S, 2)
+ handleNoType(S)
+ endTypeVariable(>, 1, null, null)
+ handleNoType(T)
+ endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+ handleNoTypeVariables(()
+ handleVoidKeyword(void)
+ beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E4, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+ beginMetadataStar(S)
+ endMetadataStar(0)
+ handleIdentifier(S, typeVariableDeclaration)
+ beginTypeVariable(S)
+ handleTypeVariablesDefined(num, 2)
+ handleIdentifier(num, typeReference)
+ handleNoTypeArguments(>)
+ handleType(num, null)
+ endTypeVariable(>, 1, extends, null)
+ handleIdentifier(num, typeReference)
+ handleNoTypeArguments(,)
+ handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E5, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+ handleTypeVariablesDefined(num, 2)
+ handleIdentifier(num, typeReference)
+ handleNoTypeArguments(>)
+ handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(E6, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F1, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F2, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F3, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F4, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F5, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(F6, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G1, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(X, 1)
+handleNoType(X)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(X, 1)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G2, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(X, 1)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G3, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+beginMetadataStar(Y)
+endMetadataStar(0)
+handleIdentifier(Y, typeVariableDeclaration)
+beginTypeVariable(Y)
+handleTypeVariablesDefined(Y, 2)
+handleNoType(Y)
+endTypeVariable(>, 1, null, null)
+handleNoType(X)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(Y, 2)
+handleIdentifier(Y, typeReference)
+handleNoTypeArguments(>)
+handleType(Y, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G4, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+beginMetadataStar(Y)
+endMetadataStar(0)
+handleIdentifier(Y, typeVariableDeclaration)
+beginTypeVariable(Y)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(Y, 2)
+handleIdentifier(Y, typeReference)
+handleNoTypeArguments(>)
+handleType(Y, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G5, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(X, 2)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(>)
+handleType(X, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(G6, typedefDeclaration)
+beginTypeVariables(<)
+beginMetadataStar(X)
+endMetadataStar(0)
+handleIdentifier(X, typeVariableDeclaration)
+beginTypeVariable(X)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(X, typeReference)
+handleNoTypeArguments(,)
+handleType(X, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H1, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H2, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H3, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H4, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H5, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(typedef)
+beginMetadataStar(typedef)
+endMetadataStar(0)
+beginFunctionTypeAlias(typedef)
+handleIdentifier(H6, typedefDeclaration)
+handleNoTypeVariables(=)
+beginFunctionType(void)
+handleNoTypeVariables(()
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleNoName())
+handleFormalParameterWithoutValue())
+endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+endFunctionTypeAlias(typedef, =, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(T, 1)
+handleNoType(T)
+endTypeVariable(>, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f1, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+handleTypeVariablesDefined(num, 1)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f2, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(S, 2)
+handleNoType(S)
+endTypeVariable(>, 1, null, null)
+handleNoType(T)
+endTypeVariable(,, 0, null, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f3, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f4, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(num, 2)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(>)
+handleType(num, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(S, typeReference)
+handleNoTypeArguments(,)
+handleType(S, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f5, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(void)
+beginMetadataStar(void)
+endMetadataStar(0)
+beginTopLevelMember(void)
+beginFunctionType(void)
+beginTypeVariables(<)
+beginMetadataStar(T)
+endMetadataStar(0)
+handleIdentifier(T, typeVariableDeclaration)
+beginTypeVariable(T)
+beginMetadataStar(S)
+endMetadataStar(0)
+handleIdentifier(S, typeVariableDeclaration)
+beginTypeVariable(S)
+handleTypeVariablesDefined(T, 2)
+handleIdentifier(T, typeReference)
+handleNoTypeArguments(>)
+handleType(T, null)
+endTypeVariable(>, 1, extends, null)
+handleIdentifier(num, typeReference)
+handleNoTypeArguments(,)
+handleType(num, null)
+endTypeVariable(,, 0, extends, null)
+endTypeVariables(<, >)
+handleVoidKeyword(void)
+beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+endFunctionType(Function, null)
+handleIdentifier(f6, topLevelVariableDeclaration)
+handleNoFieldInitializer(;)
+endTopLevelFields(null, null, null, null, 1, void, ;)
+endTopLevelDeclaration(main)
+beginMetadataStar(main)
+endMetadataStar(0)
+beginTopLevelMember(main)
+beginTopLevelMethod(;, null)
+handleNoType(;)
+handleIdentifier(main, topLevelFunctionDeclaration)
+handleNoTypeVariables(()
+beginFormalParameters((, MemberKind.TopLevelMethod)
+endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+handleAsyncModifier(null, null)
+beginBlockFunctionBody({)
+endBlockFunctionBody(0, {, })
+endTopLevelMethod(main, null, })
+endTopLevelDeclaration()
+endCompilationUnit(31, )
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
new file mode 100644
index 0000000..b6c6730
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.intertwined.expect
@@ -0,0 +1,1396 @@
+parseUnit(typedef)
+ skipErrorTokens(typedef)
+ listener: beginCompilationUnit(typedef)
+ syntheticPreviousToken(typedef)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E1, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E2, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E3, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(S, 2)
+ listener: handleNoType(S)
+ listener: endTypeVariable(>, 1, null, null)
+ listener: handleNoType(T)
+ listener: endTypeVariable(,, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E4, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E5, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(S, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(S, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(E6, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(T, 2)
+ listener: handleIdentifier(T, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(T, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F1, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F2, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F3, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(S, 2)
+ listener: handleNoType(S)
+ listener: endTypeVariable(>, 1, null, null)
+ listener: handleNoType(T)
+ listener: endTypeVariable(,, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F4, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F5, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(S, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(S, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(F6, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(T, 2)
+ listener: handleIdentifier(T, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(T, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G1, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ listener: handleTypeVariablesDefined(X, 1)
+ listener: handleNoType(X)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(X, 1)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(X, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G2, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(X, 1)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(X, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G3, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Y)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(Y, typeVariableDeclaration)
+ listener: beginTypeVariable(Y)
+ listener: handleTypeVariablesDefined(Y, 2)
+ listener: handleNoType(Y)
+ listener: endTypeVariable(>, 1, null, null)
+ listener: handleNoType(X)
+ listener: endTypeVariable(,, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(Y, 2)
+ listener: handleIdentifier(Y, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(Y, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(X, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G4, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(Y)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(Y, typeVariableDeclaration)
+ listener: beginTypeVariable(Y)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(Y, 2)
+ listener: handleIdentifier(Y, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(Y, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(X, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G5, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(X, 2)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(X, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(S, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(S, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(G6, typedefDeclaration)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(X)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(X, typeVariableDeclaration)
+ listener: beginTypeVariable(X)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(T, 2)
+ listener: handleIdentifier(T, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(T, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(X, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(X, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H1, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H2, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H3, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(S, 2)
+ listener: handleNoType(S)
+ listener: endTypeVariable(>, 1, null, null)
+ listener: handleNoType(T)
+ listener: endTypeVariable(,, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H4, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H5, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(S, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(S, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(typedef)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(typedef)
+ listener: endMetadataStar(0)
+ parseTopLevelKeywordDeclaration(;, typedef, Instance of 'DirectiveContext')
+ parseTopLevelKeywordModifiers(;, typedef)
+ parseTypedef(typedef)
+ listener: beginFunctionTypeAlias(typedef)
+ ensureIdentifierPotentiallyRecovered(typedef, typedefDeclaration, true)
+ listener: handleIdentifier(H6, typedefDeclaration)
+ listener: handleNoTypeVariables(=)
+ listener: beginFunctionType(void)
+ listener: handleNoTypeVariables(()
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(Function, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ parseMetadataStar(()
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ listener: beginFormalParameter(void, MemberKind.GeneralizedFunctionType, null, null, null)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(T, 2)
+ listener: handleIdentifier(T, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(T, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ listener: handleNoName())
+ listener: handleFormalParameterWithoutValue())
+ listener: endFormalParameter(null, null, ), null, null, FormalParameterKind.mandatory, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(1, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureSemicolon())
+ listener: endFunctionTypeAlias(typedef, =, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f1, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(T, 1)
+ listener: handleNoType(T)
+ listener: endTypeVariable(>, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f1, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f1, f1, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f2, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ listener: handleTypeVariablesDefined(num, 1)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f2, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f2, f2, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f3, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(S, 2)
+ listener: handleNoType(S)
+ listener: endTypeVariable(>, 1, null, null)
+ listener: handleNoType(T)
+ listener: endTypeVariable(,, 0, null, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f3, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f3, f3, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f4, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f4, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f4, f4, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f5, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(num, 2)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(num, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(S, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(S, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f5, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f5, f5, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(void)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(void)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(void)
+ parseFields(;, null, null, null, null, null, null, ;, Instance of 'ComplexTypeInfo', f6, DeclarationKind.TopLevel, null, false)
+ listener: beginFunctionType(void)
+ listener: beginTypeVariables(<)
+ parseMetadataStar(<)
+ listener: beginMetadataStar(T)
+ listener: endMetadataStar(0)
+ ensureIdentifier(<, typeVariableDeclaration)
+ listener: handleIdentifier(T, typeVariableDeclaration)
+ listener: beginTypeVariable(T)
+ parseMetadataStar(,)
+ listener: beginMetadataStar(S)
+ listener: endMetadataStar(0)
+ ensureIdentifier(,, typeVariableDeclaration)
+ listener: handleIdentifier(S, typeVariableDeclaration)
+ listener: beginTypeVariable(S)
+ listener: handleTypeVariablesDefined(T, 2)
+ listener: handleIdentifier(T, typeReference)
+ listener: handleNoTypeArguments(>)
+ listener: handleType(T, null)
+ listener: endTypeVariable(>, 1, extends, null)
+ listener: handleIdentifier(num, typeReference)
+ listener: handleNoTypeArguments(,)
+ listener: handleType(num, null)
+ listener: endTypeVariable(,, 0, extends, null)
+ listener: endTypeVariables(<, >)
+ listener: handleVoidKeyword(void)
+ parseFormalParametersRequiredOpt(>, MemberKind.GeneralizedFunctionType)
+ parseFormalParametersRest((, MemberKind.GeneralizedFunctionType)
+ listener: beginFormalParameters((, MemberKind.GeneralizedFunctionType)
+ listener: endFormalParameters(0, (, ), MemberKind.GeneralizedFunctionType)
+ listener: endFunctionType(Function, null)
+ ensureIdentifierPotentiallyRecovered(), topLevelVariableDeclaration, false)
+ listener: handleIdentifier(f6, topLevelVariableDeclaration)
+ parseFieldInitializerOpt(f6, f6, null, null, null, null, DeclarationKind.TopLevel, null)
+ listener: handleNoFieldInitializer(;)
+ listener: endTopLevelFields(null, null, null, null, 1, void, ;)
+ listener: endTopLevelDeclaration(main)
+ parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+ parseMetadataStar(;)
+ listener: beginMetadataStar(main)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl(;)
+ listener: beginTopLevelMember(main)
+ isReservedKeyword(()
+ parseTopLevelMethod(;, null, ;, Instance of 'NoType', null, main, false)
+ listener: beginTopLevelMethod(;, null)
+ listener: handleNoType(;)
+ ensureIdentifierPotentiallyRecovered(;, topLevelFunctionDeclaration, false)
+ listener: handleIdentifier(main, topLevelFunctionDeclaration)
+ parseMethodTypeVar(main)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(main, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(0, {, })
+ listener: endTopLevelMethod(main, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(typedef)
+ listener: endCompilationUnit(31, )
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect
new file mode 100644
index 0000000..ac7315e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.parser.expect
@@ -0,0 +1,77 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
+
+
+typedef[KeywordToken] E1[StringToken]<[BeginToken]T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E2[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E3[StringToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E4[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E5[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E6[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] F1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] G1[StringToken]<[BeginToken]X[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G2[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G3[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G4[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] Y[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken]
+Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G5[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G6[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] H1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f1[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f2[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f3[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f4[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f5[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f6[StringToken];[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect
new file mode 100644
index 0000000..ac7315e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/general/generic_function_typedef.dart.scanner.expect
@@ -0,0 +1,77 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
+
+
+typedef[KeywordToken] E1[StringToken]<[BeginToken]T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E2[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E3[StringToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E4[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E5[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] E6[StringToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] F1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] F6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] G1[StringToken]<[BeginToken]X[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G2[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G3[StringToken]<[BeginToken]X[StringToken],[SimpleToken] Y[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G4[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] Y[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken]
+Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] Y[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G5[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] X[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] G6[StringToken]<[BeginToken]X[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] X[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken];[SimpleToken]
+
+typedef[KeywordToken] H1[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H2[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H3[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H4[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H5[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+typedef[KeywordToken] H6[StringToken] =[SimpleToken] void[KeywordToken] Function[KeywordToken]([BeginToken]void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken])[SimpleToken];[SimpleToken]
+
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f1[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f2[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken],[SimpleToken] S[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f3[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f4[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] S[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] num[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f5[StringToken];[SimpleToken]
+void[KeywordToken] Function[KeywordToken]<[BeginToken]T[StringToken] extends[KeywordToken] num[StringToken],[SimpleToken] S[StringToken] extends[KeywordToken] T[StringToken]>[SimpleToken]([BeginToken])[SimpleToken] f6[StringToken];[SimpleToken]
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 5f473d7..9aeb485 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -680,14 +680,15 @@
void test_computeType_gft() {
expectComplexInfo('Function() m', expectedAfter: 'm', expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType Function',
+ 'handleNoTypeVariables (',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function null',
]);
expectComplexInfo('Function<T>() m', expectedAfter: 'm', expectedCalls: [
+ 'beginFunctionType Function',
'beginTypeVariables <',
'beginMetadataStar T',
'endMetadataStar 0',
@@ -697,15 +698,14 @@
'handleNoType T',
'endTypeVariable > 0 null null',
'endTypeVariables < >',
- 'beginFunctionType Function',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function null',
]);
expectComplexInfo('Function(int) m', expectedAfter: 'm', expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType Function',
+ 'handleNoTypeVariables (',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'beginMetadataStar int',
@@ -722,6 +722,7 @@
'endFunctionType Function null',
]);
expectComplexInfo('Function<T>(int) m', expectedAfter: 'm', expectedCalls: [
+ 'beginFunctionType Function',
'beginTypeVariables <',
'beginMetadataStar T',
'endMetadataStar 0',
@@ -731,7 +732,6 @@
'handleNoType T',
'endTypeVariable > 0 null null',
'endTypeVariables < >',
- 'beginFunctionType Function',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'beginMetadataStar int',
@@ -774,8 +774,8 @@
expectComplexInfo('C Function(', // Scanner inserts synthetic ')'.
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments Function',
'handleType C null',
@@ -787,8 +787,8 @@
void test_computeType_identifierComplex_questionMark() {
expectComplexInfo('C? Function()', required: true, expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments ?',
'handleType C ?',
@@ -800,8 +800,8 @@
void test_computeType_identifierComplex_questionMark2() {
expectComplexInfo('C Function()?', required: true, expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments Function',
'handleType C null',
@@ -813,8 +813,8 @@
void test_computeType_identifierComplex_questionMark3() {
expectComplexInfo('C<T>? Function()', required: true, expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'beginTypeArguments <',
'handleIdentifier T typeReference',
@@ -830,8 +830,8 @@
void test_computeType_identifierComplex_questionMark4() {
expectComplexInfo('C<S,T>? Function()', required: true, expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'beginTypeArguments <',
'handleIdentifier S typeReference',
@@ -852,10 +852,10 @@
expectComplexInfo('C Function()? Function()',
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments Function',
'handleType C null',
@@ -872,10 +872,10 @@
expectComplexInfo('C Function() Function()?',
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments Function',
'handleType C null',
@@ -892,10 +892,10 @@
expectComplexInfo('C? Function() Function()?',
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments ?',
'handleType C ?',
@@ -912,10 +912,10 @@
expectComplexInfo('C Function()? Function()?',
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments Function',
'handleType C null',
@@ -932,10 +932,10 @@
expectComplexInfo('C? Function()? Function()?',
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'handleNoTypeArguments ?',
'handleType C ?',
@@ -1176,8 +1176,8 @@
expectComplexInfo('C<T> Function(', // Scanner inserts synthetic ')'.
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C typeReference',
'beginTypeArguments <',
'handleIdentifier T typeReference',
@@ -1289,8 +1289,8 @@
expectComplexInfo('C.a Function(', // Scanner inserts synthetic ')'.
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C prefixedTypeReference',
'handleIdentifier a typeReferenceContinuation',
'handleQualified .',
@@ -1310,8 +1310,8 @@
expectComplexInfo('C.a? Function(', // Scanner inserts synthetic ')'.
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType C',
+ 'handleNoTypeVariables (',
'handleIdentifier C prefixedTypeReference',
'handleIdentifier a typeReferenceContinuation',
'handleQualified .',
@@ -1370,6 +1370,7 @@
expectComplexInfo('C.a<T> Function<T>(int x) Function<T>(int x)',
required: true,
expectedCalls: [
+ 'beginFunctionType C',
'beginTypeVariables <',
'beginMetadataStar T',
'endMetadataStar 0',
@@ -1389,7 +1390,6 @@
'handleNoType T',
'endTypeVariable > 0 null null',
'endTypeVariables < >',
- 'beginFunctionType C',
'handleIdentifier C prefixedTypeReference',
'handleIdentifier a typeReferenceContinuation',
'handleQualified .',
@@ -1432,8 +1432,8 @@
expectComplexInfo('void Function(', // Scanner inserts synthetic ')'.
required: true,
expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType void',
+ 'handleNoTypeVariables (',
'handleVoidKeyword void',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1443,8 +1443,8 @@
void test_computeType_voidComplex() {
expectComplexInfo('void Function()', required: true, expectedCalls: [
- 'handleNoTypeVariables (',
'beginFunctionType void',
+ 'handleNoTypeVariables (',
'handleVoidKeyword void',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1700,8 +1700,8 @@
typeArgumentCount: 1,
expectedCalls: [
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType S',
+ 'handleNoTypeVariables (',
'handleIdentifier S typeReference',
'handleNoTypeArguments Function',
'handleType S null',
@@ -1714,8 +1714,8 @@
typeArgumentCount: 1,
expectedCalls: [
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType void',
+ 'handleNoTypeVariables (',
'handleVoidKeyword void',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1825,8 +1825,8 @@
'beginTypeArguments <',
'handleIdentifier S typeReference',
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType Function',
+ 'handleNoTypeVariables (',
'handleNoType <',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1842,8 +1842,8 @@
'beginTypeArguments <',
'handleIdentifier S typeReference',
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType Function',
+ 'handleNoTypeVariables (',
'handleNoType <',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1858,8 +1858,8 @@
'beginTypeArguments <',
'handleIdentifier S typeReference',
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType void', // was 'beginFunctionType Function'
+ 'handleNoTypeVariables (',
'handleVoidKeyword void', // was 'handleNoType <'
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1876,8 +1876,8 @@
'beginTypeArguments <',
'handleIdentifier T typeReference',
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType void', // was 'beginFunctionType Function'
+ 'handleNoTypeVariables (',
'handleVoidKeyword void', // was 'handleNoType <'
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -1897,8 +1897,8 @@
'beginTypeArguments <',
'handleIdentifier T typeReference',
'beginTypeArguments <',
- 'handleNoTypeVariables (',
'beginFunctionType void', // was 'beginFunctionType Function'
+ 'handleNoTypeVariables (',
'handleVoidKeyword void', // was 'handleNoType <'
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -2075,8 +2075,8 @@
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
'handleTypeVariablesDefined ) 2',
- 'handleNoTypeVariables (',
'beginFunctionType void',
+ 'handleNoTypeVariables (',
'handleVoidKeyword void',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
@@ -2329,8 +2329,8 @@
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
'handleTypeVariablesDefined ) 1',
- 'handleNoTypeVariables (',
'beginFunctionType Function',
+ 'handleNoTypeVariables (',
'handleNoType extends',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'beginMetadataStar T',
diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
index ebfcd28..0f771da 100644
--- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart
@@ -4,8 +4,6 @@
import "package:kernel/ast.dart" show DartType, Library;
-import "package:kernel/core_types.dart" show CoreTypes;
-
import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
import "package:front_end/src/api_prototype/compiler_options.dart"
@@ -55,8 +53,8 @@
@override
DartType getLegacyLeastUpperBound(
- DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes) {
- return hierarchy.getKernelLegacyLeastUpperBound(a, b, clientLibrary);
+ DartType a, DartType b, Library clientLibrary) {
+ return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
}
}
diff --git a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
index 5ffe4df..152d8d6 100644
--- a/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_legacy_upper_bound_test.dart
@@ -8,8 +8,6 @@
import "package:kernel/class_hierarchy.dart" show ClassHierarchy;
-import "package:kernel/core_types.dart" show CoreTypes;
-
class KernelLegacyUpperBoundTest extends LegacyUpperBoundTest {
ClassHierarchy hierarchy;
@@ -22,8 +20,8 @@
@override
DartType getLegacyLeastUpperBound(
- DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes) {
- return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary, coreTypes);
+ DartType a, DartType b, Library clientLibrary) {
+ return hierarchy.getLegacyLeastUpperBound(a, b, clientLibrary);
}
}
diff --git a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
index 686768e..d316988 100644
--- a/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
+++ b/pkg/front_end/test/fasta/types/legacy_upper_bound_helper.dart
@@ -50,11 +50,11 @@
}
DartType getLegacyLeastUpperBound(
- DartType a, DartType b, Library clientLibrary, CoreTypes coreTypes);
+ DartType a, DartType b, Library clientLibrary);
void checkGetLegacyLeastUpperBound(
DartType a, DartType b, Library clientLibrary, DartType expected) {
- DartType actual = getLegacyLeastUpperBound(a, b, clientLibrary, coreTypes);
+ DartType actual = getLegacyLeastUpperBound(a, b, clientLibrary);
Expect.equals(expected, actual);
}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json
new file mode 100644
index 0000000..8304b63
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/.dart_tool/package_config.json
@@ -0,0 +1,10 @@
+{
+ "configVersion": 2,
+ "packages": [
+ {
+ "name": "collection",
+ "rootUri": "../foo/",
+ "packageUri": "lib/"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart
new file mode 100644
index 0000000..80e69b3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/bin/bin_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library:
+ languageVersion=2.8,
+ packageUri=package:collection
+*/
+
+method1() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart
new file mode 100644
index 0000000..68a5188
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/lib/foo.dart
@@ -0,0 +1,7 @@
+// 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.
+
+/*library: languageVersion=2.8*/
+
+method2() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart
new file mode 100644
index 0000000..641941e
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/foo/test/test_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library:
+ languageVersion=2.8,
+ packageUri=package:collection
+*/
+
+method3() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart
new file mode 100644
index 0000000..07a2598
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_json/main.dart
@@ -0,0 +1,15 @@
+// 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.
+
+/*library: languageVersion=2.8*/
+
+import 'foo/bin/bin_file.dart';
+import 'foo/test/test_file.dart';
+import 'package:collection/foo.dart';
+
+main() {
+ method1();
+ method2();
+ method3();
+}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages
new file mode 100644
index 0000000..00d3dbb
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/.packages
@@ -0,0 +1 @@
+collection:foo/lib/
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart
new file mode 100644
index 0000000..1046332
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/bin/bin_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library:
+ languageVersion=2.7,
+ packageUri=package:collection
+*/
+
+method1() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart
new file mode 100644
index 0000000..e72d3b0
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/lib/foo.dart
@@ -0,0 +1,7 @@
+// 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.
+
+/*library: languageVersion=2.7*/
+
+method2() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart
new file mode 100644
index 0000000..4c47d9b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/foo/test/test_file.dart
@@ -0,0 +1,10 @@
+// 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.
+
+/*library:
+ languageVersion=2.7,
+ packageUri=package:collection
+*/
+
+method3() {}
diff --git a/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart
new file mode 100644
index 0000000..cb6feec
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/allowed_experiments_with_packages/main.dart
@@ -0,0 +1,11 @@
+// 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.
+
+/*library: languageVersion=2.8*/
+
+import 'foo/bin/bin_file.dart';
+import 'foo/test/test_file.dart';
+import 'package:collection/foo.dart';
+
+main() {}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 229417f..341f7ce 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -168,6 +168,7 @@
cl
claim
claimed
+clamp
clarification
clashes
class's
@@ -1199,6 +1200,7 @@
unreachable
unseen
unshadowed
+unwrapper
unwraps
unzip
upcast
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index b7ba245..0850a28 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -1911,6 +1911,7 @@
nearest
necessarily
necessary
+necessity
need
needed
needing
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 52494a6..bf40c56 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -26,6 +26,7 @@
alt
amortized
analyses
+animal
anon
aoo
approval
@@ -84,6 +85,7 @@
ccc
charcode
charset
+checkme
checkout
cipd
circular
@@ -332,6 +334,7 @@
lc
ld
le
+legs
lengths
lightly
likewise
@@ -389,9 +392,11 @@
misspelled
mistake
mistakes
+mod
modelled
month
moo
+mul
mx
mysdk
naturally
@@ -451,6 +456,7 @@
py
python
quot
+qux
r"
r"\s
r"k
@@ -594,6 +600,7 @@
walt
warmup
wherever
+whiskers
wins
workflow
worlds
diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
index 787ad07..d449d21 100644
--- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
+++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart
@@ -644,11 +644,59 @@
0 != 1''');
}
-void _testBinaryExpression() {}
+void _testBinaryExpression() {
+ testExpression(
+ new BinaryExpression(new IntLiteral(0), new Name('+'), new IntLiteral(1)),
+ '''
+0 + 1''');
+ testExpression(
+ new BinaryExpression(
+ new BinaryExpression(
+ new IntLiteral(0), new Name('-'), new IntLiteral(1)),
+ new Name('+'),
+ new BinaryExpression(
+ new IntLiteral(2), new Name('-'), new IntLiteral(3))),
+ '''
+0 - 1 + 2 - 3''');
+ testExpression(
+ new BinaryExpression(
+ new BinaryExpression(
+ new IntLiteral(0), new Name('*'), new IntLiteral(1)),
+ new Name('+'),
+ new BinaryExpression(
+ new IntLiteral(2), new Name('/'), new IntLiteral(3))),
+ '''
+0 * 1 + 2 / 3''');
+ testExpression(
+ new BinaryExpression(
+ new BinaryExpression(
+ new IntLiteral(0), new Name('+'), new IntLiteral(1)),
+ new Name('*'),
+ new BinaryExpression(
+ new IntLiteral(2), new Name('-'), new IntLiteral(3))),
+ '''
+(0 + 1) * (2 - 3)''');
+}
-void _testUnaryExpression() {}
+void _testUnaryExpression() {
+ testExpression(new UnaryExpression(new Name('unary-'), new IntLiteral(0)), '''
+-0''');
+ testExpression(new UnaryExpression(new Name('~'), new IntLiteral(0)), '''
+~0''');
-void _testParenthesizedExpression() {}
+ testExpression(
+ new UnaryExpression(
+ new Name('unary-'),
+ new BinaryExpression(
+ new IntLiteral(0), new Name('+'), new IntLiteral(1))),
+ '''
+-(0 + 1)''');
+}
+
+void _testParenthesizedExpression() {
+ testExpression(new ParenthesizedExpression(new IntLiteral(0)), '''
+(0)''');
+}
void _testSpreadElement() {
testExpression(new SpreadElement(new IntLiteral(0), false), '''
diff --git a/pkg/front_end/testcases/general/cascade_context.dart b/pkg/front_end/testcases/general/cascade_context.dart
new file mode 100644
index 0000000..4242a2f
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart
@@ -0,0 +1,15 @@
+// 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.
+
+T f<T>() => null;
+
+test() {
+ int v1 = f();
+ int v2 = f()..isEven;
+ int v3 = f()
+ ..isEven
+ ..isEven;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.outline.expect b/pkg/front_end/testcases/general/cascade_context.dart.outline.expect
new file mode 100644
index 0000000..10a6773
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+ ;
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.strong.expect b/pkg/front_end/testcases/general/cascade_context.dart.strong.expect
new file mode 100644
index 0000000..309a682
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+ return null;
+static method test() → dynamic {
+ core::int* v1 = self::f<core::int*>();
+ core::int* v2 = let final core::int* #t1 = self::f<core::int*>() in block {
+ #t1.{core::int::isEven};
+ } =>#t1;
+ core::int* v3 = let final core::int* #t2 = self::f<core::int*>() in block {
+ #t2.{core::int::isEven};
+ #t2.{core::int::isEven};
+ } =>#t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect
new file mode 100644
index 0000000..309a682
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>() → self::f::T*
+ return null;
+static method test() → dynamic {
+ core::int* v1 = self::f<core::int*>();
+ core::int* v2 = let final core::int* #t1 = self::f<core::int*>() in block {
+ #t1.{core::int::isEven};
+ } =>#t1;
+ core::int* v3 = let final core::int* #t2 = self::f<core::int*>() in block {
+ #t2.{core::int::isEven};
+ #t2.{core::int::isEven};
+ } =>#t2;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect
new file mode 100644
index 0000000..efa753c
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+T f<T>() => null;
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3be1b3a
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade_context.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+T f<T>() => null;
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart b/pkg/front_end/testcases/general/generic_function_typedef.dart
new file mode 100644
index 0000000..4cdd14e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart
@@ -0,0 +1,41 @@
+// 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.
+
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+ Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect
new file mode 100644
index 0000000..338c05f
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect
new file mode 100644
index 0000000..adf2f0d
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect
new file mode 100644
index 0000000..adf2f0d
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef E1<unrelated T extends core::Object* = dynamic> = () →* void;
+typedef E2<unrelated T extends core::num* = core::num*> = () →* void;
+typedef E3<unrelated T extends core::Object* = dynamic, unrelated S extends core::Object* = dynamic> = () →* void;
+typedef E4<unrelated T extends core::num* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E5<unrelated T extends S* = core::num*, unrelated S extends core::num* = core::num*> = () →* void;
+typedef E6<unrelated T extends core::num* = core::num*, unrelated S extends T* = core::num*> = () →* void;
+typedef F1 = <T extends core::Object* = dynamic>() →* void;
+typedef F2 = <T extends core::num* = dynamic>() →* void;
+typedef F3 = <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void;
+typedef F4 = <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F5 = <T extends S* = dynamic, S extends core::num* = dynamic>() →* void;
+typedef F6 = <T extends core::num* = dynamic, S extends T* = dynamic>() →* void;
+typedef G1<invariant X extends core::Object* = dynamic> = <T extends X* = dynamic>() →* void;
+typedef G2<invariant X extends core::num* = core::num*> = <T extends X* = dynamic>() →* void;
+typedef G3<invariant X extends core::Object* = dynamic, invariant Y extends core::Object* = dynamic> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G4<invariant X extends core::num* = core::num*, invariant Y extends core::num* = core::num*> = <T extends X* = dynamic, S extends Y* = dynamic>() →* void;
+typedef G5<invariant X extends core::num* = core::num*> = <T extends S* = dynamic, S extends X* = dynamic>() →* void;
+typedef G6<invariant X extends core::num* = core::num*> = <T extends X* = dynamic, S extends T* = dynamic>() →* void;
+typedef H1 = (<T extends core::Object* = dynamic>() →* void) →* void;
+typedef H2 = (<T extends core::num* = dynamic>() →* void) →* void;
+typedef H3 = (<T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void) →* void;
+typedef H4 = (<T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H5 = (<T extends S* = dynamic, S extends core::num* = dynamic>() →* void) →* void;
+typedef H6 = (<T extends core::num* = dynamic, S extends T* = dynamic>() →* void) →* void;
+static field <T extends core::Object* = dynamic>() →* void f1;
+static field <T extends core::num* = dynamic>() →* void f2;
+static field <T extends core::Object* = dynamic, S extends core::Object* = dynamic>() →* void f3;
+static field <T extends core::num* = dynamic, S extends core::num* = dynamic>() →* void f4;
+static field <T extends S* = dynamic, S extends core::num* = dynamic>() →* void f5;
+static field <T extends core::num* = dynamic, S extends T* = dynamic>() →* void f6;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect
new file mode 100644
index 0000000..fd63028
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline.expect
@@ -0,0 +1,32 @@
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+ Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+void Function<T>() f1;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+main() {}
diff --git a/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5df2b1e
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_typedef.dart.textual_outline_modelled.expect
@@ -0,0 +1,32 @@
+main() {}
+typedef E1<T> = void Function();
+typedef E2<T extends num> = void Function();
+typedef E3<T, S> = void Function();
+typedef E4<T extends num, S extends num> = void Function();
+typedef E5<T extends S, S extends num> = void Function();
+typedef E6<T extends num, S extends T> = void Function();
+typedef F1 = void Function<T>();
+typedef F2 = void Function<T extends num>();
+typedef F3 = void Function<T, S>();
+typedef F4 = void Function<T extends num, S extends num>();
+typedef F5 = void Function<T extends S, S extends num>();
+typedef F6 = void Function<T extends num, S extends T>();
+typedef G1<X> = void Function<T extends X>();
+typedef G2<X extends num> = void Function<T extends X>();
+typedef G3<X, Y> = void Function<T extends X, S extends Y>();
+typedef G4<X extends num, Y extends num> = void
+ Function<T extends X, S extends Y>();
+typedef G5<X extends num> = void Function<T extends S, S extends X>();
+typedef G6<X extends num> = void Function<T extends X, S extends T>();
+typedef H1 = void Function(void Function<T>());
+typedef H2 = void Function(void Function<T extends num>());
+typedef H3 = void Function(void Function<T, S>());
+typedef H4 = void Function(void Function<T extends num, S extends num>());
+typedef H5 = void Function(void Function<T extends S, S extends num>());
+typedef H6 = void Function(void Function<T extends num, S extends T>());
+void Function<T extends S, S extends num>() f5;
+void Function<T extends num, S extends T>() f6;
+void Function<T extends num, S extends num>() f4;
+void Function<T extends num>() f2;
+void Function<T, S>() f3;
+void Function<T>() f1;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
index 48f5952..ae46db2 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
@@ -76,15 +76,15 @@
// Map<String, String> map61 = <String, String>{...mapSpread};
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
// List<int> lhs70 = <int>[...null];
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
// Set<int> set70 = <int>{...null};
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
// ...null,
// ^
//
@@ -92,7 +92,7 @@
// ...null,
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
// Map<String, int> map70 = <String, int>{...null};
// ^
//
@@ -302,10 +302,10 @@
core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
Map<String, String> map61 = <String, String>{...mapSpread};
^"};
- core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+ core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
@@ -318,7 +318,7 @@
#t68.{core::Set::add}(#t70);
}
} =>#t68;
- core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+ core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
Map<String, int> map70 = <String, int>{...null};
^": null};
core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index 91386ae..e42c97f 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -76,15 +76,15 @@
// Map<String, String> map61 = <String, String>{...mapSpread};
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
// List<int> lhs70 = <int>[...null];
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
// Set<int> set70 = <int>{...null};
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Can't spread a value with static type 'Null'.
// ...null,
// ^
//
@@ -92,7 +92,7 @@
// ...null,
// ^
//
-// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
// Map<String, int> map70 = <String, int>{...null};
// ^
//
@@ -431,10 +431,10 @@
core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:129:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
Map<String, String> map61 = <String, String>{...mapSpread};
^"};
- core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type Null.
+ core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type Null.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
@@ -453,7 +453,7 @@
}
}
} =>#t68;
- core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type Null.
+ core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:142:45: Error: Can't spread a value with static type 'Null'.
Map<String, int> map70 = <String, int>{...null};
^": null};
core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart b/pkg/front_end/testcases/general/type_variable_bound_access.dart
index 720e493..b25ab04 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart
@@ -22,6 +22,25 @@
num method2() => field1 + field2.length;
}
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+ X1 extends X0, X0 extends int> {
+ X0 field0;
+ X1 field1;
+ X2 field2;
+ X3 field3;
+ X4 field4;
+ X5 field5;
+
+ method() {
+ field0.isEven;
+ field1.isEven;
+ field2.isEven;
+ field3.isEven;
+ field4.isEven;
+ field5.isEven;
+ }
+}
+
main() {
new DynamicClass<num, int>(0.5, 2).method();
new NumClass<num, double>(2, 0.5).method1();
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
index 6638397..b79b1d4 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.outline.expect
@@ -40,5 +40,27 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
abstract member-signature get runtimeType() → core::Type*;
}
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+ generic-covariant-impl field self::Class::X0* field0;
+ generic-covariant-impl field self::Class::X1* field1;
+ generic-covariant-impl field self::Class::X2* field2;
+ generic-covariant-impl field self::Class::X3* field3;
+ generic-covariant-impl field self::Class::X4* field4;
+ generic-covariant-impl field self::Class::X5* field5;
+ synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+ ;
+ method method() → dynamic
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
static method main() → dynamic
;
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
index b39193d..e9cd064 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.strong.expect
@@ -53,6 +53,35 @@
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
abstract member-signature get runtimeType() → core::Type*;
}
+class Class<X5 extends self::Class::X4* = core::int*, X4 extends self::Class::X3* = core::int*, X3 extends self::Class::X2* = core::int*, X2 extends self::Class::X1* = core::int*, X1 extends self::Class::X0* = core::int*, X0 extends core::int* = core::int*> extends core::Object {
+ generic-covariant-impl field self::Class::X0* field0 = null;
+ generic-covariant-impl field self::Class::X1* field1 = null;
+ generic-covariant-impl field self::Class::X2* field2 = null;
+ generic-covariant-impl field self::Class::X3* field3 = null;
+ generic-covariant-impl field self::Class::X4* field4 = null;
+ generic-covariant-impl field self::Class::X5* field5 = null;
+ synthetic constructor •() → self::Class<self::Class::X5*, self::Class::X4*, self::Class::X3*, self::Class::X2*, self::Class::X1*, self::Class::X0*>*
+ : super core::Object::•()
+ ;
+ method method() → dynamic {
+ this.{self::Class::field0}.{core::int::isEven};
+ this.{self::Class::field1}.{core::int::isEven};
+ this.{self::Class::field2}.{core::int::isEven};
+ this.{self::Class::field3}.{core::int::isEven};
+ this.{self::Class::field4}.{core::int::isEven};
+ this.{self::Class::field5}.{core::int::isEven};
+ }
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
static method main() → dynamic {
new self::DynamicClass::•<core::num*, core::int*>(0.5, 2).{self::DynamicClass::method}();
new self::NumClass::•<core::num*, core::double*>(2, 0.5).{self::NumClass::method1}();
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
index d7f2e46..1b5e45c 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline.expect
@@ -13,4 +13,15 @@
num method2() => field1 + field2.length;
}
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+ X1 extends X0, X0 extends int> {
+ X0 field0;
+ X1 field1;
+ X2 field2;
+ X3 field3;
+ X4 field4;
+ X5 field5;
+ method() {}
+}
+
main() {}
diff --git a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
index b92c57e..fdcee0a 100644
--- a/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/general/type_variable_bound_access.dart.textual_outline_modelled.expect
@@ -1,3 +1,14 @@
+class Class<X5 extends X4, X4 extends X3, X3 extends X2, X2 extends X1,
+ X1 extends X0, X0 extends int> {
+ X0 field0;
+ X1 field1;
+ X2 field2;
+ X3 field3;
+ X4 field4;
+ X5 field5;
+ method() {}
+}
+
class DynamicClass<T extends dynamic, S extends T> {
DynamicClass(this.field1, this.field2);
T field1;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
index 5ff3546..977c606 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.expect
@@ -76,15 +76,15 @@
// Map<String, String> map61 = <String, String>{...mapSpread};
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
// List<int> lhs70 = <int>[...null];
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
// Set<int> set70 = <int>{...null};
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type 'Null'.
// ...null,
// ^
//
@@ -92,7 +92,7 @@
// ...null,
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
// Map<String, int> map70 = <String, int>{...null};
// ^
//
@@ -302,10 +302,10 @@
core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:131:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
Map<String, String> map61 = <String, String>{...mapSpread};
^"};
- core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+ core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
@@ -318,7 +318,7 @@
#t68.{core::Set::add}(#t70);
}
} =>#t68;
- core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+ core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
Map<String, int> map70 = <String, int>{...null};
^": null};
core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
index 69e0bad..6e97878 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
@@ -76,15 +76,15 @@
// Map<String, String> map61 = <String, String>{...mapSpread};
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
// List<int> lhs70 = <int>[...null];
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
// Set<int> set70 = <int>{...null};
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Can't spread a value with static type 'Null'.
// ...null,
// ^
//
@@ -92,7 +92,7 @@
// ...null,
// ^
//
-// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+// pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
// Map<String, int> map70 = <String, int>{...null};
// ^
//
@@ -431,10 +431,10 @@
core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{null: invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:131:51: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
Map<String, String> map61 = <String, String>{...mapSpread};
^"};
- core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type Null.
+ core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
List<int> lhs70 = <int>[...null];
^"];
- core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type Null.
+ core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
Set<int> set70 = <int>{...null};
^") in #t66;
core::Set<dynamic>* set71ambiguous = block {
@@ -453,7 +453,7 @@
}
}
} =>#t68;
- core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type Null.
+ core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:144:45: Error: Can't spread a value with static type 'Null'.
Map<String, int> map70 = <String, int>{...null};
^": null};
core::List<core::int*>* lhs80 = block {
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart b/pkg/front_end/testcases/nnbd/duplicate_import.dart
new file mode 100644
index 0000000..1192cd9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart
@@ -0,0 +1,11 @@
+// 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 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect
new file mode 100644
index 0000000..b60fe11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic
+ ;
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect
new file mode 100644
index 0000000..0be0855
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+import 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0be0855
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'duplicate_import_lib1.dart';
+import 'duplicate_import_lib2.dart';
+export 'duplicate_import_lib1.dart';
+export 'duplicate_import_lib2.dart';
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect
new file mode 100644
index 0000000..78771c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "org-dartlang-testcase:///duplicate_import_lib1.dart";
+import "org-dartlang-testcase:///duplicate_import_lib2.dart";
+export "org-dartlang-testcase:///duplicate_import_lib1.dart";
+export "org-dartlang-testcase:///duplicate_import_lib2.dart";
+
+static method main() → dynamic {}
+
+library foo /*isNonNullableByDefault*/;
+import self as self2;
+
+
+library foo /*isNonNullableByDefault*/;
+import self as self3;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart b/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart
new file mode 100644
index 0000000..cb00fab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import_lib1.dart
@@ -0,0 +1,5 @@
+// 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.
+
+library foo;
diff --git a/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart b/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart
new file mode 100644
index 0000000..cb00fab
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/duplicate_import_lib2.dart
@@ -0,0 +1,5 @@
+// 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.
+
+library foo;
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart b/pkg/front_end/testcases/nnbd/issue40954.dart
new file mode 100644
index 0000000..1f4585c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+class C {
+ static void test1(var v, [A a]) {}
+
+ static void test2(var v, {A a}) {}
+
+ void test11(var v, [A a]) {}
+
+ void test22(var v, {A a}) {}
+}
+
+void test1(var v, [A a]) {}
+
+void test2(var v, {A a}) {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect
new file mode 100644
index 0000000..c6641b9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.outline.expect
@@ -0,0 +1,59 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test2(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test11(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test22(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ ;
+ static method test1(dynamic v, [self::A a]) → void
+ ;
+ static method test2(dynamic v, {self::A a}) → void
+ ;
+ method test11(dynamic v, [self::A a]) → void
+ ;
+ method test22(dynamic v, {self::A a}) → void
+ ;
+}
+static method test1(dynamic v, [self::A a]) → void
+ ;
+static method test2(dynamic v, {self::A a}) → void
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test2(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test11(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test22(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ static method test1(dynamic v, [self::A a = #C1]) → void {}
+ static method test2(dynamic v, {self::A a = #C1}) → void {}
+ method test11(dynamic v, [self::A a = #C1]) → void {}
+ method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test2(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test11(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test22(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ static method test1(dynamic v, [self::A a = #C1]) → void {}
+ static method test2(dynamic v, {self::A a = #C1}) → void {}
+ method test11(dynamic v, [self::A a = #C1]) → void {}
+ method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect
new file mode 100644
index 0000000..7998ca1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline.expect
@@ -0,0 +1,12 @@
+class A {}
+
+class C {
+ static void test1(var v, [A a]) {}
+ static void test2(var v, {A a}) {}
+ void test11(var v, [A a]) {}
+ void test22(var v, {A a}) {}
+}
+
+void test1(var v, [A a]) {}
+void test2(var v, {A a}) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..53c9a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+class A {}
+
+class C {
+ static void test1(var v, [A a]) {}
+ static void test2(var v, {A a}) {}
+ void test11(var v, [A a]) {}
+ void test22(var v, {A a}) {}
+}
+
+main() {}
+void test1(var v, [A a]) {}
+void test2(var v, {A a}) {}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test2(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test11(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test22(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ static method test1(dynamic v, [self::A a = #C1]) → void {}
+ static method test2(dynamic v, {self::A a = #C1}) → void {}
+ method test11(dynamic v, [self::A a = #C1]) → void {}
+ method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect
new file mode 100644
index 0000000..e94c384
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40954.dart.weak.transformed.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:8:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:10:31: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// static void test2(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:12:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test11(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:14:25: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test22(var v, {A a}) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:17:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test1(var v, [A a]) {}
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue40954.dart:19:22: Error: Optional parameter 'a' should have a default value because its type 'A' doesn't allow null.
+// - 'A' is from 'pkg/front_end/testcases/nnbd/issue40954.dart'.
+// void test2(var v, {A a}) {}
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ static method test1(dynamic v, [self::A a = #C1]) → void {}
+ static method test2(dynamic v, {self::A a = #C1}) → void {}
+ method test11(dynamic v, [self::A a = #C1]) → void {}
+ method test22(dynamic v, {self::A a = #C1}) → void {}
+}
+static method test1(dynamic v, [self::A a = #C1]) → void {}
+static method test2(dynamic v, {self::A a = #C1}) → void {}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
index 34eb654..652f6a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
@@ -11,7 +11,7 @@
static final field core::List<core::int> s3;
static final field dynamic s4;
static field core::int? s5;
-static final field core::int? s6;
+static final field core::num s6;
static field core::List<dynamic>? s7;
static final field dynamic s8;
static final field core::int s9;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
index 3daaf3e..2889d4d 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -90,7 +90,7 @@
}
}).call();
static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
final s6 = s5 + 0;
^" in self::s5.{core::num::+}(0);
static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index 673da56..d6311c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -90,7 +90,7 @@
}
}).call();
static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
final s6 = s5 + 0;
^" in self::s5.{core::num::+}(0);
static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
index 3daaf3e..2889d4d 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -90,7 +90,7 @@
}
}).call();
static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
final s6 = s5 + 0;
^" in self::s5.{core::num::+}(0);
static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index 673da56..d6311c9 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -90,7 +90,7 @@
}
}).call();
static field core::int? s5;
-static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static final field core::num s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
final s6 = s5 + 0;
^" in self::s5.{core::num::+}(0);
static field core::List<dynamic>? s7;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart b/pkg/front_end/testcases/nnbd/issue41108.dart
new file mode 100644
index 0000000..3c86077
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart
@@ -0,0 +1,11 @@
+// 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.
+
+test() async {
+ List y = await l(); // should be a List?
+}
+
+Future<List>? l() => null;
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect
new file mode 100644
index 0000000..2975c48
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.outline.expect
@@ -0,0 +1,11 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method test() → dynamic async
+ ;
+static method l() → asy::Future<core::List<dynamic>>?
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
new file mode 100644
index 0000000..778d86e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// - 'List' is from 'dart:core'.
+// List y = await l(); // should be a List?
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+ core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+ List y = await l(); // should be a List?
+ ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
+}
+static method l() → asy::Future<core::List<dynamic>>?
+ return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
new file mode 100644
index 0000000..87e1bf1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// - 'List' is from 'dart:core'.
+// List y = await l(); // should be a List?
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {
+ final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+ List y = await l(); // should be a List?
+ ^";
+ [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
+ core::List<dynamic> y = let core::List<dynamic>? #t3 = _in::unsafeCast<core::List<dynamic>?>(:result) in #t3.==(null) ?{core::List<dynamic>} #t3 as{TypeError,ForNonNullableByDefault} core::List<dynamic> : #t3{core::List<dynamic>};
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method l() → asy::Future<core::List<dynamic>>?
+ return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect
new file mode 100644
index 0000000..da7cfbd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+test() async {}
+Future<List>? l() => null;
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..933af90
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+Future<List>? l() => null;
+main() {}
+test() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
new file mode 100644
index 0000000..778d86e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// - 'List' is from 'dart:core'.
+// List y = await l(); // should be a List?
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method test() → dynamic async {
+ core::List<dynamic> y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+ List y = await l(); // should be a List?
+ ^" in await self::l() as{TypeError,ForNonNullableByDefault} core::List<dynamic>;
+}
+static method l() → asy::Future<core::List<dynamic>>?
+ return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
new file mode 100644
index 0000000..255b564
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41108.dart.weak.transformed.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+// - 'List' is from 'dart:core'.
+// List y = await l(); // should be a List?
+// ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method test() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {
+ final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41108.dart:6:12: Error: A value of type 'List<dynamic>?' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'List' is from 'dart:core'.
+ List y = await l(); // should be a List?
+ ^";
+ [yield] let dynamic #t2 = asy::_awaitHelper(self::l(), :async_op_then, :async_op_error, :async_op) in null;
+ core::List<dynamic> y = _in::unsafeCast<core::List<dynamic>?>(:result);
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
+static method l() → asy::Future<core::List<dynamic>>?
+ return null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
index 5e2f0fe..11217a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.expect
@@ -6,7 +6,7 @@
// String Function(int) x2 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x3 = (int v) /* error */ {
// ^
//
@@ -14,7 +14,7 @@
// String Function(int) x5 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x6 = (int v) /* error */ {
// ^
//
@@ -22,7 +22,7 @@
// Future<String> Function(int) y2 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y3 = (int v) async /* error */ {
// ^
//
@@ -30,7 +30,7 @@
// Future<String> Function(int) y5 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y6 = (int v) async /* error */ {
// ^
//
@@ -81,13 +81,13 @@
String Function(int) x2 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x3 = (core::int v) → Never {
+ (core::int) → core::String x3 = (core::int v) → core::String {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x3 = (int v) /* error */ {
^" in null;
};
@@ -101,13 +101,13 @@
String Function(int) x5 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x6 = (core::int v) → Never {
+ (core::int) → core::String x6 = (core::int v) → core::String {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x6 = (int v) /* error */ {
^" in null;
};
@@ -121,13 +121,13 @@
Future<String> Function(int) y2 = (int v) async /* error */ {
^" in null;
};
- (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> async {
+ (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> async {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y3 = (int v) async /* error */ {
^" in null;
};
@@ -141,13 +141,13 @@
Future<String> Function(int) y5 = (int v) async /* error */ {
^" in null;
};
- (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> async {
+ (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> async {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y6 = (int v) async /* error */ {
^" in null;
};
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
index 96a261f..07174dc 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
// String Function(int) x2 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x3 = (int v) /* error */ {
// ^
//
@@ -14,7 +14,7 @@
// String Function(int) x5 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x6 = (int v) /* error */ {
// ^
//
@@ -22,7 +22,7 @@
// Future<String> Function(int) y2 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y3 = (int v) async /* error */ {
// ^
//
@@ -30,7 +30,7 @@
// Future<String> Function(int) y5 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y6 = (int v) async /* error */ {
// ^
//
@@ -238,13 +238,13 @@
String Function(int) x2 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x3 = (core::int v) → Never {
+ (core::int) → core::String x3 = (core::int v) → core::String {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x3 = (int v) /* error */ {
^" in null;
};
@@ -258,13 +258,13 @@
String Function(int) x5 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x6 = (core::int v) → Never {
+ (core::int) → core::String x6 = (core::int v) → core::String {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x6 = (int v) /* error */ {
^" in null;
};
@@ -302,9 +302,9 @@
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return :async_completer.{asy::Completer::future};
};
- (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
- final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
- FutureOr<Never>? :return_value;
+ (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+ FutureOr<core::String>? :return_value;
dynamic :async_stack_trace;
(dynamic) → dynamic :async_op_then;
(core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -320,7 +320,7 @@
}
on core::Object catch(final core::Object _) {
}
- :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y3 = (int v) async /* error */ {
^" in null;
break #L9;
@@ -371,9 +371,9 @@
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return :async_completer.{asy::Completer::future};
};
- (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
- final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
- FutureOr<Never>? :return_value;
+ (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+ FutureOr<core::String>? :return_value;
dynamic :async_stack_trace;
(dynamic) → dynamic :async_op_then;
(core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -389,7 +389,7 @@
}
on core::Object catch(final core::Object _) {
}
- :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y6 = (int v) async /* error */ {
^" in null;
break #L11;
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
index 5e2f0fe..11217a1 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.expect
@@ -6,7 +6,7 @@
// String Function(int) x2 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x3 = (int v) /* error */ {
// ^
//
@@ -14,7 +14,7 @@
// String Function(int) x5 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x6 = (int v) /* error */ {
// ^
//
@@ -22,7 +22,7 @@
// Future<String> Function(int) y2 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y3 = (int v) async /* error */ {
// ^
//
@@ -30,7 +30,7 @@
// Future<String> Function(int) y5 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y6 = (int v) async /* error */ {
// ^
//
@@ -81,13 +81,13 @@
String Function(int) x2 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x3 = (core::int v) → Never {
+ (core::int) → core::String x3 = (core::int v) → core::String {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x3 = (int v) /* error */ {
^" in null;
};
@@ -101,13 +101,13 @@
String Function(int) x5 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x6 = (core::int v) → Never {
+ (core::int) → core::String x6 = (core::int v) → core::String {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x6 = (int v) /* error */ {
^" in null;
};
@@ -121,13 +121,13 @@
Future<String> Function(int) y2 = (int v) async /* error */ {
^" in null;
};
- (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> async {
+ (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> async {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y3 = (int v) async /* error */ {
^" in null;
};
@@ -141,13 +141,13 @@
Future<String> Function(int) y5 = (int v) async /* error */ {
^" in null;
};
- (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> async {
+ (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> async {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y6 = (int v) async /* error */ {
^" in null;
};
diff --git a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
index 96a261f..07174dc 100644
--- a/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41156.dart.weak.transformed.expect
@@ -6,7 +6,7 @@
// String Function(int) x2 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x3 = (int v) /* error */ {
// ^
//
@@ -14,7 +14,7 @@
// String Function(int) x5 = (int v) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// String Function(int) x6 = (int v) /* error */ {
// ^
//
@@ -22,7 +22,7 @@
// Future<String> Function(int) y2 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y3 = (int v) async /* error */ {
// ^
//
@@ -30,7 +30,7 @@
// Future<String> Function(int) y5 = (int v) async /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+// pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
// Future<String> Function(int) y6 = (int v) async /* error */ {
// ^
//
@@ -238,13 +238,13 @@
String Function(int) x2 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x3 = (core::int v) → Never {
+ (core::int) → core::String x3 = (core::int v) → core::String {
try {
return throw v;
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:44:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x3 = (int v) /* error */ {
^" in null;
};
@@ -258,13 +258,13 @@
String Function(int) x5 = (int v) /* error */ {
^" in null;
};
- (core::int) → core::String x6 = (core::int v) → Never {
+ (core::int) → core::String x6 = (core::int v) → core::String {
try {
return self::throwing();
}
on core::Object catch(final core::Object _) {
}
- return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:54:29: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
String Function(int) x6 = (int v) /* error */ {
^" in null;
};
@@ -302,9 +302,9 @@
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return :async_completer.{asy::Completer::future};
};
- (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<Never> /* originally async */ {
- final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
- FutureOr<Never>? :return_value;
+ (core::int) → asy::Future<core::String> y3 = (core::int v) → asy::Future<core::String> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+ FutureOr<core::String>? :return_value;
dynamic :async_stack_trace;
(dynamic) → dynamic :async_op_then;
(core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -320,7 +320,7 @@
}
on core::Object catch(final core::Object _) {
}
- :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ :return_value = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:64:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y3 = (int v) async /* error */ {
^" in null;
break #L9;
@@ -371,9 +371,9 @@
:async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return :async_completer.{asy::Completer::future};
};
- (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<Never> /* originally async */ {
- final asy::_AsyncAwaitCompleter<Never> :async_completer = new asy::_AsyncAwaitCompleter::•<Never>();
- FutureOr<Never>? :return_value;
+ (core::int) → asy::Future<core::String> y6 = (core::int v) → asy::Future<core::String> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+ FutureOr<core::String>? :return_value;
dynamic :async_stack_trace;
(dynamic) → dynamic :async_op_then;
(core::Object, core::StackTrace) → dynamic :async_op_error;
@@ -389,7 +389,7 @@
}
on core::Object catch(final core::Object _) {
}
- :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.
+ :return_value = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/issue41156.dart:74:37: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
Future<String> Function(int) y6 = (int v) async /* error */ {
^" in null;
break #L11;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart b/pkg/front_end/testcases/nnbd/issue41415.dart
index 1b33195..be4be43 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart
@@ -2,14 +2,28 @@
// 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.
-main() {
+main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {
// Pre-NNBD bottom type.
int Function(Null) f = (x) => 1; // Runtime type is int Function(Object?)
+
// NNBD bottom type.
int Function(Never) g = (x) => 1; // Runtime type is int Function(Object?)
- // NNBD bottom type.
+ // NNBD bottom type.
int Function(Never?) h = (x) => 1; // Runtime type is int Function(Object?)
int Function(String) i = (x) => 1; // Runtime type is int Function(String)
+
+ // Pre-NNBD bottom type.
+ int Function(X) j = (x) => 1; // Runtime type is int Function(Object?)
+
+ // NNBD bottom type.
+ int Function(Y) k = (x) => 1; // Runtime type is int Function(Object?)
+
+ // NNBD bottom type.
+ int Function(Z) l = (x) => 1; // Runtime type is int Function(Object?)
+
+ // NNBD bottom type.
+ int Function(Z?) m = (x) => 1; // Runtime type is int Function(Object?)
}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
index e2cba6b..0213dd7 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
@@ -1,5 +1,8 @@
library /*isNonNullableByDefault*/;
import self as self;
+import "dart:core" as core;
static method main() → dynamic
;
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
@@ -2,9 +2,14 @@
import self as self;
import "dart:core" as core;
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
(core::Null?) → core::int f = (core::Object? x) → core::int => 1;
(Never) → core::int g = (core::Object? x) → core::int => 1;
(Never?) → core::int h = (core::Object? x) → core::int => 1;
(core::String) → core::int i = (core::String x) → core::int => 1;
+ (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+ (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+ (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+ (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
@@ -2,9 +2,14 @@
import self as self;
import "dart:core" as core;
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
(core::Null?) → core::int f = (core::Object? x) → core::int => 1;
(Never) → core::int g = (core::Object? x) → core::int => 1;
(Never?) → core::int h = (core::Object? x) → core::int => 1;
(core::String) → core::int i = (core::String x) → core::int => 1;
+ (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+ (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+ (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+ (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
index bae895a..181fe21 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline.expect
@@ -1 +1,2 @@
main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
index bae895a..181fe21 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.textual_outline_modelled.expect
@@ -1 +1,2 @@
main() {}
+test<X extends Null, Y extends Never?, Z extends Never>() {}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
@@ -2,9 +2,14 @@
import self as self;
import "dart:core" as core;
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
(core::Null?) → core::int f = (core::Object? x) → core::int => 1;
(Never) → core::int g = (core::Object? x) → core::int => 1;
(Never?) → core::int h = (core::Object? x) → core::int => 1;
(core::String) → core::int i = (core::String x) → core::int => 1;
+ (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+ (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+ (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+ (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
index 4c844e6..4419497 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
@@ -2,9 +2,14 @@
import self as self;
import "dart:core" as core;
-static method main() → dynamic {
+static method main() → dynamic {}
+static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
(core::Null?) → core::int f = (core::Object? x) → core::int => 1;
(Never) → core::int g = (core::Object? x) → core::int => 1;
(Never?) → core::int h = (core::Object? x) → core::int => 1;
(core::String) → core::int i = (core::String x) → core::int => 1;
+ (self::test::X%) → core::int j = (core::Object? x) → core::int => 1;
+ (self::test::Y%) → core::int k = (core::Object? x) → core::int => 1;
+ (self::test::Z) → core::int l = (core::Object? x) → core::int => 1;
+ (self::test::Z?) → core::int m = (core::Object? x) → core::int => 1;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart b/pkg/front_end/testcases/nnbd/issue41697.dart
index 726edd9..5c4ea86 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart
@@ -4,8 +4,8 @@
import 'dart:async';
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
// TODO(johnniwinther): Enable and use these when #41951 is fixed to test that
// updating self referencing type parameters works.
//typedef I<T> = void Function<S extends FutureOr<S>>(S, T);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
index f8add27..424dea6 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.outline.expect
@@ -4,12 +4,12 @@
import "dart:async";
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
class C<T extends core::Object? = dynamic> extends core::Object {
- generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
- generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
- constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+ generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+ generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+ constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
;
}
static method test1(self::C<core::num> c) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
index 1d85ea2..f0b15fb 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.expect
@@ -20,12 +20,12 @@
import "dart:async";
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
class C<T extends core::Object? = dynamic> extends core::Object {
- generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
- generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
- constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+ generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+ generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+ constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
: self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
index 6179e4f..3355e4f 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.strong.transformed.expect
@@ -21,12 +21,12 @@
import "dart:async";
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
class C<T extends core::Object? = dynamic> extends core::Object {
- generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
- generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
- constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+ generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+ generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+ constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
: self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
index 12ddfd2..33eaf3e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline.expect
@@ -1,7 +1,7 @@
import 'dart:async';
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
class C<T> {
G<T> field1;
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
index 7db15d5..fccb4e7 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.textual_outline_modelled.expect
@@ -10,5 +10,5 @@
test1(C<num> c) {}
test2(C<num?> c) {}
test3<S extends num?>(S s) => s + 1;
-typedef G<T> = void Function<S extends T>(S);
-typedef H<T> = void Function<S extends FutureOr<T>>(S, FutureOr<T>);
+typedef G<T> = dynamic Function<S extends T>(S);
+typedef H<T> = dynamic Function<S extends FutureOr<T>>(S, FutureOr<T>);
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
index 1d85ea2..f0b15fb 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.expect
@@ -20,12 +20,12 @@
import "dart:async";
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
class C<T extends core::Object? = dynamic> extends core::Object {
- generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
- generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
- constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+ generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+ generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+ constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
: self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
index 6179e4f..3355e4f 100644
--- a/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697.dart.weak.transformed.expect
@@ -21,12 +21,12 @@
import "dart:async";
-typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → void;
-typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → void;
+typedef G<invariant T extends core::Object? = dynamic> = <S extends T% = dynamic>(S%) → dynamic;
+typedef H<invariant T extends core::Object? = dynamic> = <S extends FutureOr<T%> = dynamic>(S%, FutureOr<T%>) → dynamic;
class C<T extends core::Object? = dynamic> extends core::Object {
- generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → void field1;
- generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2;
- constructor •(<S extends self::C::T% = dynamic>(S%) → void field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → void field2) → self::C<self::C::T%>
+ generic-covariant-impl field <S extends self::C::T% = dynamic>(S%) → dynamic field1;
+ generic-covariant-impl field <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2;
+ constructor •(<S extends self::C::T% = dynamic>(S%) → dynamic field1, <S extends FutureOr<self::C::T%> = dynamic>(S%, FutureOr<self::C::T%>) → dynamic field2) → self::C<self::C::T%>
: self::C::field1 = field1, self::C::field2 = field2, super core::Object::•()
;
}
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.expect
@@ -22,7 +22,7 @@
^" in s.{core::num::+}(1);
}
static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
- core::num t = s.{core::num::+}(1);
+ core::int t = s.{core::num::+}(1);
}
static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
^" in s.{core::num::+}(1);
}
static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
- core::num t = s.{core::num::+}(1);
+ core::int t = s.{core::num::+}(1);
}
static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.expect
@@ -22,7 +22,7 @@
^" in s.{core::num::+}(1);
}
static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
- core::num t = s.{core::num::+}(1);
+ core::int t = s.{core::num::+}(1);
}
static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
index 4be6607..e385e2e 100644
--- a/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41697b.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
^" in s.{core::num::+}(1);
}
static method test3<S extends core::int = core::int>(self::test3::S s) → dynamic {
- core::num t = s.{core::num::+}(1);
+ core::int t = s.{core::num::+}(1);
}
static method test4<S extends core::int? = core::int?>(self::test4::S% s) → dynamic {
core::num t = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/issue41697b.dart:18:13: Error: Operator '+' cannot be called on 'S' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart b/pkg/front_end/testcases/nnbd/issue42433.dart
new file mode 100644
index 0000000..4d3d4ed
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart
@@ -0,0 +1,12 @@
+// 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 X {}
+
+checkme<T extends X>(T? t) {}
+typedef Test<T extends X>(T? t);
+
+main() {
+ Test<X> t2 = checkme;
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect
new file mode 100644
index 0000000..3c8de2a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+ synthetic constructor •() → self::X
+ ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+ synthetic constructor •() → self::X
+ : super core::Object::•()
+ ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+ (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants {
+ #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+ synthetic constructor •() → self::X
+ : super core::Object::•()
+ ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+ (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants {
+ #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect
new file mode 100644
index 0000000..b3831cf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class X {}
+
+checkme<T extends X>(T? t) {}
+typedef Test<T extends X>(T? t);
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4c84bdf
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+checkme<T extends X>(T? t) {}
+
+class X {}
+
+main() {}
+typedef Test<T extends X>(T? t);
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+ synthetic constructor •() → self::X
+ : super core::Object::•()
+ ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+ (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants {
+ #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
new file mode 100644
index 0000000..db8fd3e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42433.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+typedef Test<contravariant T extends self::X = self::X> = (T?) → dynamic;
+class X extends core::Object {
+ synthetic constructor •() → self::X
+ : super core::Object::•()
+ ;
+}
+static method checkme<T extends self::X = self::X>(self::checkme::T? t) → dynamic {}
+static method main() → dynamic {
+ (self::X?) → dynamic t2 = #C1<self::X>;
+}
+
+constants {
+ #C1 = tearoff self::checkme
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart b/pkg/front_end/testcases/nnbd/issue42459.dart
new file mode 100644
index 0000000..71e71e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart
@@ -0,0 +1,23 @@
+// 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.
+
+test() {
+ (x) {
+ if (x) {
+ return 1;
+ } else {
+ return;
+ }
+ };
+
+ void local(x) {
+ if (x) {
+ return print('');
+ } else {
+ return;
+ }
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect
new file mode 100644
index 0000000..64923de
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+// return;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+ (dynamic x) → core::int? {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return 1;
+ }
+ else {
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+ return;
+ ^" in null;
+ }
+ };
+ function local(dynamic x) → void {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return core::print("");
+ }
+ else {
+ return;
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+// return;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+ (dynamic x) → core::int? {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return 1;
+ }
+ else {
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+ return;
+ ^" in null;
+ }
+ };
+ function local(dynamic x) → void {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return core::print("");
+ }
+ else {
+ return;
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect
new file mode 100644
index 0000000..ec6b9e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline.expect
@@ -0,0 +1,2 @@
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..f67dbb0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.textual_outline_modelled.expect
@@ -0,0 +1,2 @@
+main() {}
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+// return;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+ (dynamic x) → core::int? {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return 1;
+ }
+ else {
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+ return;
+ ^" in null;
+ }
+ };
+ function local(dynamic x) → void {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return core::print("");
+ }
+ else {
+ return;
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect
new file mode 100644
index 0000000..640dbba
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42459.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+// return;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+ (dynamic x) → core::int? {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return 1;
+ }
+ else {
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42459.dart:10:7: Error: A value must be explicitly returned from a non-void function.
+ return;
+ ^" in null;
+ }
+ };
+ function local(dynamic x) → void {
+ if(x as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+ return core::print("");
+ }
+ else {
+ return;
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart b/pkg/front_end/testcases/nnbd/issue42603.dart
new file mode 100644
index 0000000..26b7215
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart
@@ -0,0 +1,33 @@
+// 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 {
+ bool operator ==(Object other) => true;
+}
+
+class D extends C {
+ bool operator ==(Object? other) => super == other;
+
+ bool method1(dynamic o) => super == o;
+
+ bool method2(Null o) => super == o;
+}
+
+class E {
+ bool operator ==() => true;
+}
+
+class F extends E {
+ bool operator ==(Object? other) => super == other;
+}
+
+main() {
+ expect(true, D() == D());
+ expect(false, D().method1(null));
+ expect(false, D().method2(null));
+}
+
+expect(expected, actual) {
+ if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
new file mode 100644
index 0000000..384e012
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
@@ -0,0 +1,57 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+// bool operator ==() => true;
+// ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+// bool operator ==() => true;
+// ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==(Object other) native "Object_equals";
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+// bool operator ==(Object? other) => super == other;
+// ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==() => true;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ ;
+ operator ==(core::Object other) → core::bool
+ ;
+}
+class D extends self::C {
+ synthetic constructor •() → self::D
+ ;
+ operator ==(core::Object? other) → core::bool
+ ;
+ method method1(dynamic o) → core::bool
+ ;
+ method method2(core::Null? o) → core::bool
+ ;
+}
+class E extends core::Object {
+ synthetic constructor •() → self::E
+ ;
+ operator ==() → core::bool
+ ;
+}
+class F extends self::E {
+ synthetic constructor •() → self::F
+ ;
+ operator ==(core::Object? other) → core::bool
+ ;
+}
+static method main() → dynamic
+ ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
new file mode 100644
index 0000000..91362db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+// bool operator ==() => true;
+// ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+// bool operator ==() => true;
+// ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==(Object other) native "Object_equals";
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+// bool operator ==(Object? other) => super == other;
+// ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==() => true;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// bool operator ==(Object? other) => super == other;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ operator ==(core::Object other) → core::bool
+ return true;
+}
+class D extends self::C {
+ synthetic constructor •() → self::D
+ : super self::C::•()
+ ;
+ operator ==(core::Object? other) → core::bool
+ return super.{self::C::==}(other);
+ method method1(dynamic o) → core::bool
+ return super.{self::C::==}(o);
+ method method2(core::Null? o) → core::bool
+ return super.{self::C::==}(o);
+}
+class E extends core::Object {
+ synthetic constructor •() → self::E
+ : super core::Object::•()
+ ;
+ operator ==() → core::bool
+ return true;
+}
+class F extends self::E {
+ synthetic constructor •() → self::F
+ : super self::E::•()
+ ;
+ operator ==(core::Object? other) → core::bool
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+ bool operator ==(Object? other) => super == other;
+ ^" in super.{self::E::==}(other);
+}
+static method main() → dynamic {
+ self::expect(true, new self::D::•().{self::D::==}(new self::D::•()));
+ self::expect(false, new self::D::•().{self::D::method1}(null));
+ self::expect(false, new self::D::•().{self::D::method2}(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect
new file mode 100644
index 0000000..9897d454
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline.expect
@@ -0,0 +1,20 @@
+class C {
+ bool operator ==(Object other) => true;
+}
+
+class D extends C {
+ bool operator ==(Object? other) => super == other;
+ bool method1(dynamic o) => super == o;
+ bool method2(Null o) => super == o;
+}
+
+class E {
+ bool operator ==() => true;
+}
+
+class F extends E {
+ bool operator ==(Object? other) => super == other;
+}
+
+main() {}
+expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..de73fe7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.textual_outline_modelled.expect
@@ -0,0 +1,20 @@
+class C {
+ bool operator ==(Object other) => true;
+}
+
+class D extends C {
+ bool method1(dynamic o) => super == o;
+ bool method2(Null o) => super == o;
+ bool operator ==(Object? other) => super == other;
+}
+
+class E {
+ bool operator ==() => true;
+}
+
+class F extends E {
+ bool operator ==(Object? other) => super == other;
+}
+
+expect(expected, actual) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
new file mode 100644
index 0000000..91362db
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: Operator '==' should have exactly one parameter.
+// bool operator ==() => true;
+// ^^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Error: The method 'E.==' has fewer positional arguments than those of overridden method 'Object.=='.
+// bool operator ==() => true;
+// ^
+// sdk/lib/_internal/vm/lib/object_patch.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==(Object other) native "Object_equals";
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:17: Error: The method 'F.==' has more required arguments than those of overridden method 'E.=='.
+// bool operator ==(Object? other) => super == other;
+// ^
+// pkg/front_end/testcases/nnbd/issue42603.dart:18:17: Context: This is the overridden method ('==').
+// bool operator ==() => true;
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+// bool operator ==(Object? other) => super == other;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+ synthetic constructor •() → self::C
+ : super core::Object::•()
+ ;
+ operator ==(core::Object other) → core::bool
+ return true;
+}
+class D extends self::C {
+ synthetic constructor •() → self::D
+ : super self::C::•()
+ ;
+ operator ==(core::Object? other) → core::bool
+ return super.{self::C::==}(other);
+ method method1(dynamic o) → core::bool
+ return super.{self::C::==}(o);
+ method method2(core::Null? o) → core::bool
+ return super.{self::C::==}(o);
+}
+class E extends core::Object {
+ synthetic constructor •() → self::E
+ : super core::Object::•()
+ ;
+ operator ==() → core::bool
+ return true;
+}
+class F extends self::E {
+ synthetic constructor •() → self::F
+ : super self::E::•()
+ ;
+ operator ==(core::Object? other) → core::bool
+ return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue42603.dart:22:44: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+ bool operator ==(Object? other) => super == other;
+ ^" in super.{self::E::==}(other);
+}
+static method main() → dynamic {
+ self::expect(true, new self::D::•().{self::D::==}(new self::D::•()));
+ self::expect(false, new self::D::•().{self::D::method1}(null));
+ self::expect(false, new self::D::•().{self::D::method2}(null));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart b/pkg/front_end/testcases/nnbd/issue42743.dart
new file mode 100644
index 0000000..2ac0239
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart
@@ -0,0 +1,13 @@
+// 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.
+
+main() async {
+ bool b = true;
+ (_) {
+ if (b) return 42;
+ };
+ (_) async {
+ if (b) return 42;
+ };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect
new file mode 100644
index 0000000..074fe5d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.outline.expect
@@ -0,0 +1,5 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method main() → dynamic async
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect
new file mode 100644
index 0000000..ca71c73
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+ core::bool b = true;
+ (dynamic _) → core::int? {
+ if(b)
+ return 42;
+ };
+ (dynamic _) → asy::Future<core::int?> async {
+ if(b)
+ return 42;
+ };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
new file mode 100644
index 0000000..454a896
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.strong.transformed.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {
+ core::bool b = true;
+ (dynamic _) → core::int? {
+ if(b)
+ return 42;
+ };
+ (dynamic _) → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {
+ if(b) {
+ :return_value = 42;
+ break #L2;
+ }
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+ };
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect
new file mode 100644
index 0000000..386f405
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline.expect
@@ -0,0 +1 @@
+main() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..386f405
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.textual_outline_modelled.expect
@@ -0,0 +1 @@
+main() async {}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect
new file mode 100644
index 0000000..ca71c73
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+ core::bool b = true;
+ (dynamic _) → core::int? {
+ if(b)
+ return 42;
+ };
+ (dynamic _) → asy::Future<core::int?> async {
+ if(b)
+ return 42;
+ };
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
new file mode 100644
index 0000000..454a896
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42743.dart.weak.transformed.expect
@@ -0,0 +1,64 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ FutureOr<dynamic>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {
+ core::bool b = true;
+ (dynamic _) → core::int? {
+ if(b)
+ return 42;
+ };
+ (dynamic _) → asy::Future<core::int?> /* originally async */ {
+ final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+ FutureOr<core::int?>? :return_value;
+ dynamic :async_stack_trace;
+ (dynamic) → dynamic :async_op_then;
+ (core::Object, core::StackTrace) → dynamic :async_op_error;
+ core::int :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {
+ if(b) {
+ :return_value = 42;
+ break #L2;
+ }
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+ };
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic exception, core::StackTrace stack_trace) {
+ :async_completer.{asy::Completer::completeError}(exception, stack_trace);
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart b/pkg/front_end/testcases/nnbd/issue42758.dart
new file mode 100644
index 0000000..38474ee
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart
@@ -0,0 +1,48 @@
+// 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.
+
+test1(Never n1, Never? n2, Null n3) {
+ var l1 = [...n1];
+ var l2 = [...?n1];
+ var l3 = [...n2];
+ var l4 = [...?n2];
+ var l5 = [...n3];
+ var l6 = [...?n3];
+ var s1 = {...n1, n1};
+ var s2 = {...?n1, n1};
+ var s3 = {...n2, n1};
+ var s4 = {...?n2, n1};
+ var s5 = {...n3, n1};
+ var s6 = {...?n3, n1};
+ var m1 = {...n1, n1: n1};
+ var m2 = {...?n1, n1: n1};
+ var m3 = {...n2, n1: n1};
+ var m4 = {...?n2, n1: n1};
+ var m5 = {...n3, n1: n1};
+ var m6 = {...?n3, n1: n1};
+}
+
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+ N1 n1, N2 n2, N3 n3) {
+ var l1 = [...n1];
+ var l2 = [...?n1];
+ var l3 = [...n2];
+ var l4 = [...?n2];
+ var l5 = [...n3];
+ var l6 = [...?n3];
+ var s1 = {...n1, n1};
+ var s2 = {...?n1, n1};
+ var s3 = {...n2, n1};
+ var s4 = {...?n2, n1};
+ var s5 = {...n3, n1};
+ var s6 = {...?n3, n1};
+ var m1 = {...n1, n1: n1};
+ var m2 = {...?n1, n1: n1};
+ var m3 = {...n2, n1: n1};
+ var m4 = {...?n2, n1: n1};
+ var m5 = {...n3, n1: n1};
+ var m6 = {...?n3, n1: n1};
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
new file mode 100644
index 0000000..3ada4d6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic
+ ;
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
new file mode 100644
index 0000000..6e4b63d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -0,0 +1,293 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t1 = <Never>[];
+ for (final Never #t2 in n1)
+ #t1.{core::List::add}(#t2);
+ } =>#t1;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t3 = <Never>[];
+ final core::Iterable<Never>? #t4 = n1;
+ if(!#t4.{core::Object::==}(null))
+ for (final Never #t5 in #t4{core::Iterable<Never>})
+ #t3.{core::List::add}(#t5);
+ } =>#t3;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t6 = <Never>[];
+ final core::Iterable<Never>? #t7 = n2;
+ if(!#t7.{core::Object::==}(null))
+ for (final Never #t8 in #t7{core::Iterable<Never>})
+ #t6.{core::List::add}(#t8);
+ } =>#t6;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t9 = <Never>[];
+ final core::Iterable<Never>? #t10 = n3;
+ if(!#t10.{core::Object::==}(null))
+ for (final Never #t11 in #t10{core::Iterable<Never>})
+ #t9.{core::List::add}(#t11);
+ } =>#t9;
+ core::Set<Never> s1 = block {
+ final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ for (final Never #t13 in n1)
+ #t12.{core::Set::add}(#t13);
+ #t12.{core::Set::add}(n1);
+ } =>#t12;
+ core::Set<Never> s2 = block {
+ final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t15 = n1;
+ if(!#t15.{core::Object::==}(null))
+ for (final Never #t16 in #t15{core::Iterable<Never>})
+ #t14.{core::Set::add}(#t16);
+ #t14.{core::Set::add}(n1);
+ } =>#t14;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ var s3 = {...n2, n1};
+ ^") in let final dynamic #t19 = #t17.{core::Set::add}(n1) in #t17;
+ core::Set<Never> s4 = block {
+ final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t21 = n2;
+ if(!#t21.{core::Object::==}(null))
+ for (final Never #t22 in #t21{core::Iterable<Never>})
+ #t20.{core::Set::add}(#t22);
+ #t20.{core::Set::add}(n1);
+ } =>#t20;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ var s5 = {...n3, n1};
+ ^") in let final dynamic #t25 = #t23.{core::Set::add}(n1) in #t23;
+ core::Set<Never> s6 = block {
+ final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t27 = n3;
+ if(!#t27.{core::Object::==}(null))
+ for (final Never #t28 in #t27{core::Iterable<Never>})
+ #t26.{core::Set::add}(#t28);
+ #t26.{core::Set::add}(n1);
+ } =>#t26;
+ core::Map<Never, Never> m1 = block {
+ final core::Map<Never, Never> #t29 = <Never, Never>{};
+ for (final core::MapEntry<Never, Never> #t30 in n1.{core::Map::entries})
+ #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+ #t29.{core::Map::[]=}(n1, n1);
+ } =>#t29;
+ core::Map<Never, Never> m2 = block {
+ final core::Map<Never, Never> #t31 = <Never, Never>{};
+ final core::Map<Never, Never>? #t32 = n1;
+ if(!#t32.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t33 in #t32{core::Map<Never, Never>}.{core::Map::entries})
+ #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+ #t31.{core::Map::[]=}(n1, n1);
+ } =>#t31;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m4 = block {
+ final core::Map<Never, Never> #t34 = <Never, Never>{};
+ final core::Map<Never, Never>? #t35 = n2;
+ if(!#t35.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t36 in #t35{core::Map<Never, Never>}.{core::Map::entries})
+ #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+ #t34.{core::Map::[]=}(n1, n1);
+ } =>#t34;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m6 = block {
+ final core::Map<Never, Never> #t37 = <Never, Never>{};
+ final core::Map<Never, Never>? #t38 = n3;
+ if(!#t38.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t39 in #t38{core::Map<Never, Never>}.{core::Map::entries})
+ #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+ #t37.{core::Map::[]=}(n1, n1);
+ } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t40 = <Never>[];
+ for (final Never #t41 in n1)
+ #t40.{core::List::add}(#t41);
+ } =>#t40;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t42 = <Never>[];
+ final core::Iterable<Never>? #t43 = n1;
+ if(!#t43.{core::Object::==}(null))
+ for (final Never #t44 in #t43{core::Iterable<Never>})
+ #t42.{core::List::add}(#t44);
+ } =>#t42;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t45 = <Never>[];
+ final core::Iterable<Never>? #t46 = n2;
+ if(!#t46.{core::Object::==}(null))
+ for (final Never #t47 in #t46{core::Iterable<Never>})
+ #t45.{core::List::add}(#t47);
+ } =>#t45;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t48 = <Never>[];
+ final core::Iterable<Never>? #t49 = n3;
+ if(!#t49.{core::Object::==}(null))
+ for (final Never #t50 in #t49{core::Iterable<Never>})
+ #t48.{core::List::add}(#t50);
+ } =>#t48;
+ core::Set<self::test2::N1> s1 = block {
+ final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ for (final self::test2::N1 #t52 in n1)
+ #t51.{core::Set::add}(#t52);
+ #t51.{core::Set::add}(n1);
+ } =>#t51;
+ core::Set<self::test2::N1> s2 = block {
+ final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t54 = n1;
+ if(!#t54.{core::Object::==}(null))
+ for (final self::test2::N1 #t55 in #t54{core::Iterable<self::test2::N1>})
+ #t53.{core::Set::add}(#t55);
+ #t53.{core::Set::add}(n1);
+ } =>#t53;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ var s3 = {...n2, n1};
+ ^") in let final dynamic #t58 = #t56.{core::Set::add}(n1) in #t56;
+ core::Set<self::test2::N1> s4 = block {
+ final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t60 = n2;
+ if(!#t60.{core::Object::==}(null))
+ for (final self::test2::N1 #t61 in #t60{core::Iterable<self::test2::N1>})
+ #t59.{core::Set::add}(#t61);
+ #t59.{core::Set::add}(n1);
+ } =>#t59;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ var s5 = {...n3, n1};
+ ^") in let final dynamic #t64 = #t62.{core::Set::add}(n1) in #t62;
+ core::Set<self::test2::N1> s6 = block {
+ final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t66 = n3;
+ if(!#t66.{core::Object::==}(null))
+ for (final self::test2::N1 #t67 in #t66{core::Iterable<self::test2::N1>})
+ #t65.{core::Set::add}(#t67);
+ #t65.{core::Set::add}(n1);
+ } =>#t65;
+ core::Map<self::test2::N1, self::test2::N1> m1 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t69 in n1.{core::Map::entries})
+ #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+ #t68.{core::Map::[]=}(n1, n1);
+ } =>#t68;
+ core::Map<self::test2::N1, self::test2::N1> m2 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+ if(!#t71.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t72 in #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+ #t70.{core::Map::[]=}(n1, n1);
+ } =>#t70;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m4 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+ if(!#t74.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t75 in #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+ #t73.{core::Map::[]=}(n1, n1);
+ } =>#t73;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m6 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+ if(!#t77.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t78 in #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+ #t76.{core::Map::[]=}(n1, n1);
+ } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
new file mode 100644
index 0000000..f24f351
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -0,0 +1,375 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t1 = <Never>[];
+ for (final Never #t2 in n1)
+ #t1.{core::List::add}(#t2);
+ } =>#t1;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t3 = <Never>[];
+ final core::Iterable<Never>? #t4 = n1;
+ if(!#t4.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t5 = :sync-for-iterator.{core::Iterator::current};
+ #t3.{core::List::add}(#t5);
+ }
+ }
+ } =>#t3;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t6 = <Never>[];
+ final core::Iterable<Never>? #t7 = n2;
+ if(!#t7.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t8 = :sync-for-iterator.{core::Iterator::current};
+ #t6.{core::List::add}(#t8);
+ }
+ }
+ } =>#t6;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t9 = <Never>[];
+ final core::Iterable<Never>? #t10 = n3;
+ if(!#t10.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t11 = :sync-for-iterator.{core::Iterator::current};
+ #t9.{core::List::add}(#t11);
+ }
+ }
+ } =>#t9;
+ core::Set<Never> s1 = block {
+ final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ for (final Never #t13 in n1)
+ #t12.{core::Set::add}(#t13);
+ #t12.{core::Set::add}(n1);
+ } =>#t12;
+ core::Set<Never> s2 = block {
+ final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t15 = n1;
+ if(!#t15.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t16 = :sync-for-iterator.{core::Iterator::current};
+ #t14.{core::Set::add}(#t16);
+ }
+ }
+ #t14.{core::Set::add}(n1);
+ } =>#t14;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ var s3 = {...n2, n1};
+ ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
+ core::Set<Never> s4 = block {
+ final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t21 = n2;
+ if(!#t21.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t22 = :sync-for-iterator.{core::Iterator::current};
+ #t20.{core::Set::add}(#t22);
+ }
+ }
+ #t20.{core::Set::add}(n1);
+ } =>#t20;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ var s5 = {...n3, n1};
+ ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
+ core::Set<Never> s6 = block {
+ final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t27 = n3;
+ if(!#t27.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t28 = :sync-for-iterator.{core::Iterator::current};
+ #t26.{core::Set::add}(#t28);
+ }
+ }
+ #t26.{core::Set::add}(n1);
+ } =>#t26;
+ core::Map<Never, Never> m1 = block {
+ final core::Map<Never, Never> #t29 = <Never, Never>{};
+ {
+ core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t30 = :sync-for-iterator.{core::Iterator::current};
+ #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+ }
+ }
+ #t29.{core::Map::[]=}(n1, n1);
+ } =>#t29;
+ core::Map<Never, Never> m2 = block {
+ final core::Map<Never, Never> #t31 = <Never, Never>{};
+ final core::Map<Never, Never>? #t32 = n1;
+ if(!#t32.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t32{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t33 = :sync-for-iterator.{core::Iterator::current};
+ #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+ }
+ }
+ #t31.{core::Map::[]=}(n1, n1);
+ } =>#t31;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m4 = block {
+ final core::Map<Never, Never> #t34 = <Never, Never>{};
+ final core::Map<Never, Never>? #t35 = n2;
+ if(!#t35.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t35{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t36 = :sync-for-iterator.{core::Iterator::current};
+ #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+ }
+ }
+ #t34.{core::Map::[]=}(n1, n1);
+ } =>#t34;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m6 = block {
+ final core::Map<Never, Never> #t37 = <Never, Never>{};
+ final core::Map<Never, Never>? #t38 = n3;
+ if(!#t38.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t38{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t39 = :sync-for-iterator.{core::Iterator::current};
+ #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+ }
+ }
+ #t37.{core::Map::[]=}(n1, n1);
+ } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t40 = <Never>[];
+ for (final Never #t41 in n1)
+ #t40.{core::List::add}(#t41);
+ } =>#t40;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t42 = <Never>[];
+ final core::Iterable<Never>? #t43 = n1;
+ if(!#t43.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t43{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t44 = :sync-for-iterator.{core::Iterator::current};
+ #t42.{core::List::add}(#t44);
+ }
+ }
+ } =>#t42;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t45 = <Never>[];
+ final core::Iterable<Never>? #t46 = n2;
+ if(!#t46.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t46{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t47 = :sync-for-iterator.{core::Iterator::current};
+ #t45.{core::List::add}(#t47);
+ }
+ }
+ } =>#t45;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t48 = <Never>[];
+ final core::Iterable<Never>? #t49 = n3;
+ if(!#t49.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t49{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t50 = :sync-for-iterator.{core::Iterator::current};
+ #t48.{core::List::add}(#t50);
+ }
+ }
+ } =>#t48;
+ core::Set<self::test2::N1> s1 = block {
+ final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ for (final self::test2::N1 #t52 in n1)
+ #t51.{core::Set::add}(#t52);
+ #t51.{core::Set::add}(n1);
+ } =>#t51;
+ core::Set<self::test2::N1> s2 = block {
+ final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t54 = n1;
+ if(!#t54.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
+ #t53.{core::Set::add}(#t55);
+ }
+ }
+ #t53.{core::Set::add}(n1);
+ } =>#t53;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ var s3 = {...n2, n1};
+ ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
+ core::Set<self::test2::N1> s4 = block {
+ final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t60 = n2;
+ if(!#t60.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t61 = :sync-for-iterator.{core::Iterator::current};
+ #t59.{core::Set::add}(#t61);
+ }
+ }
+ #t59.{core::Set::add}(n1);
+ } =>#t59;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ var s5 = {...n3, n1};
+ ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
+ core::Set<self::test2::N1> s6 = block {
+ final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t66 = n3;
+ if(!#t66.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t67 = :sync-for-iterator.{core::Iterator::current};
+ #t65.{core::Set::add}(#t67);
+ }
+ }
+ #t65.{core::Set::add}(n1);
+ } =>#t65;
+ core::Map<self::test2::N1, self::test2::N1> m1 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+ {
+ core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t69 = :sync-for-iterator.{core::Iterator::current};
+ #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+ }
+ }
+ #t68.{core::Map::[]=}(n1, n1);
+ } =>#t68;
+ core::Map<self::test2::N1, self::test2::N1> m2 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+ if(!#t71.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t72 = :sync-for-iterator.{core::Iterator::current};
+ #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+ }
+ }
+ #t70.{core::Map::[]=}(n1, n1);
+ } =>#t70;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m4 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+ if(!#t74.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t75 = :sync-for-iterator.{core::Iterator::current};
+ #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+ }
+ }
+ #t73.{core::Map::[]=}(n1, n1);
+ } =>#t73;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m6 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+ if(!#t77.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t78 = :sync-for-iterator.{core::Iterator::current};
+ #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+ }
+ }
+ #t76.{core::Map::[]=}(n1, n1);
+ } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect
new file mode 100644
index 0000000..09008cc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+test1(Never n1, Never? n2, Null n3) {}
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+ N1 n1, N2 n2, N3 n3) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7dc1872
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.textual_outline_modelled.expect
@@ -0,0 +1,4 @@
+main() {}
+test1(Never n1, Never? n2, Null n3) {}
+test2<N1 extends Never, N2 extends Never?, N3 extends Null>(
+ N1 n1, N2 n2, N3 n3) {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
new file mode 100644
index 0000000..6e4b63d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -0,0 +1,293 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t1 = <Never>[];
+ for (final Never #t2 in n1)
+ #t1.{core::List::add}(#t2);
+ } =>#t1;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t3 = <Never>[];
+ final core::Iterable<Never>? #t4 = n1;
+ if(!#t4.{core::Object::==}(null))
+ for (final Never #t5 in #t4{core::Iterable<Never>})
+ #t3.{core::List::add}(#t5);
+ } =>#t3;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t6 = <Never>[];
+ final core::Iterable<Never>? #t7 = n2;
+ if(!#t7.{core::Object::==}(null))
+ for (final Never #t8 in #t7{core::Iterable<Never>})
+ #t6.{core::List::add}(#t8);
+ } =>#t6;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t9 = <Never>[];
+ final core::Iterable<Never>? #t10 = n3;
+ if(!#t10.{core::Object::==}(null))
+ for (final Never #t11 in #t10{core::Iterable<Never>})
+ #t9.{core::List::add}(#t11);
+ } =>#t9;
+ core::Set<Never> s1 = block {
+ final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ for (final Never #t13 in n1)
+ #t12.{core::Set::add}(#t13);
+ #t12.{core::Set::add}(n1);
+ } =>#t12;
+ core::Set<Never> s2 = block {
+ final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t15 = n1;
+ if(!#t15.{core::Object::==}(null))
+ for (final Never #t16 in #t15{core::Iterable<Never>})
+ #t14.{core::Set::add}(#t16);
+ #t14.{core::Set::add}(n1);
+ } =>#t14;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ var s3 = {...n2, n1};
+ ^") in let final dynamic #t19 = #t17.{core::Set::add}(n1) in #t17;
+ core::Set<Never> s4 = block {
+ final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t21 = n2;
+ if(!#t21.{core::Object::==}(null))
+ for (final Never #t22 in #t21{core::Iterable<Never>})
+ #t20.{core::Set::add}(#t22);
+ #t20.{core::Set::add}(n1);
+ } =>#t20;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ var s5 = {...n3, n1};
+ ^") in let final dynamic #t25 = #t23.{core::Set::add}(n1) in #t23;
+ core::Set<Never> s6 = block {
+ final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t27 = n3;
+ if(!#t27.{core::Object::==}(null))
+ for (final Never #t28 in #t27{core::Iterable<Never>})
+ #t26.{core::Set::add}(#t28);
+ #t26.{core::Set::add}(n1);
+ } =>#t26;
+ core::Map<Never, Never> m1 = block {
+ final core::Map<Never, Never> #t29 = <Never, Never>{};
+ for (final core::MapEntry<Never, Never> #t30 in n1.{core::Map::entries})
+ #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+ #t29.{core::Map::[]=}(n1, n1);
+ } =>#t29;
+ core::Map<Never, Never> m2 = block {
+ final core::Map<Never, Never> #t31 = <Never, Never>{};
+ final core::Map<Never, Never>? #t32 = n1;
+ if(!#t32.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t33 in #t32{core::Map<Never, Never>}.{core::Map::entries})
+ #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+ #t31.{core::Map::[]=}(n1, n1);
+ } =>#t31;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m4 = block {
+ final core::Map<Never, Never> #t34 = <Never, Never>{};
+ final core::Map<Never, Never>? #t35 = n2;
+ if(!#t35.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t36 in #t35{core::Map<Never, Never>}.{core::Map::entries})
+ #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+ #t34.{core::Map::[]=}(n1, n1);
+ } =>#t34;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m6 = block {
+ final core::Map<Never, Never> #t37 = <Never, Never>{};
+ final core::Map<Never, Never>? #t38 = n3;
+ if(!#t38.{core::Object::==}(null))
+ for (final core::MapEntry<Never, Never> #t39 in #t38{core::Map<Never, Never>}.{core::Map::entries})
+ #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+ #t37.{core::Map::[]=}(n1, n1);
+ } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t40 = <Never>[];
+ for (final Never #t41 in n1)
+ #t40.{core::List::add}(#t41);
+ } =>#t40;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t42 = <Never>[];
+ final core::Iterable<Never>? #t43 = n1;
+ if(!#t43.{core::Object::==}(null))
+ for (final Never #t44 in #t43{core::Iterable<Never>})
+ #t42.{core::List::add}(#t44);
+ } =>#t42;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t45 = <Never>[];
+ final core::Iterable<Never>? #t46 = n2;
+ if(!#t46.{core::Object::==}(null))
+ for (final Never #t47 in #t46{core::Iterable<Never>})
+ #t45.{core::List::add}(#t47);
+ } =>#t45;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t48 = <Never>[];
+ final core::Iterable<Never>? #t49 = n3;
+ if(!#t49.{core::Object::==}(null))
+ for (final Never #t50 in #t49{core::Iterable<Never>})
+ #t48.{core::List::add}(#t50);
+ } =>#t48;
+ core::Set<self::test2::N1> s1 = block {
+ final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ for (final self::test2::N1 #t52 in n1)
+ #t51.{core::Set::add}(#t52);
+ #t51.{core::Set::add}(n1);
+ } =>#t51;
+ core::Set<self::test2::N1> s2 = block {
+ final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t54 = n1;
+ if(!#t54.{core::Object::==}(null))
+ for (final self::test2::N1 #t55 in #t54{core::Iterable<self::test2::N1>})
+ #t53.{core::Set::add}(#t55);
+ #t53.{core::Set::add}(n1);
+ } =>#t53;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ var s3 = {...n2, n1};
+ ^") in let final dynamic #t58 = #t56.{core::Set::add}(n1) in #t56;
+ core::Set<self::test2::N1> s4 = block {
+ final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t60 = n2;
+ if(!#t60.{core::Object::==}(null))
+ for (final self::test2::N1 #t61 in #t60{core::Iterable<self::test2::N1>})
+ #t59.{core::Set::add}(#t61);
+ #t59.{core::Set::add}(n1);
+ } =>#t59;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ var s5 = {...n3, n1};
+ ^") in let final dynamic #t64 = #t62.{core::Set::add}(n1) in #t62;
+ core::Set<self::test2::N1> s6 = block {
+ final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t66 = n3;
+ if(!#t66.{core::Object::==}(null))
+ for (final self::test2::N1 #t67 in #t66{core::Iterable<self::test2::N1>})
+ #t65.{core::Set::add}(#t67);
+ #t65.{core::Set::add}(n1);
+ } =>#t65;
+ core::Map<self::test2::N1, self::test2::N1> m1 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t69 in n1.{core::Map::entries})
+ #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+ #t68.{core::Map::[]=}(n1, n1);
+ } =>#t68;
+ core::Map<self::test2::N1, self::test2::N1> m2 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+ if(!#t71.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t72 in #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+ #t70.{core::Map::[]=}(n1, n1);
+ } =>#t70;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m4 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+ if(!#t74.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t75 in #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+ #t73.{core::Map::[]=}(n1, n1);
+ } =>#t73;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m6 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+ if(!#t77.{core::Object::==}(null))
+ for (final core::MapEntry<self::test2::N1, self::test2::N1> #t78 in #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries})
+ #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+ #t76.{core::Map::[]=}(n1, n1);
+ } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
new file mode 100644
index 0000000..f24f351
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -0,0 +1,375 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:7:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:13:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:19:17: Warning: Operand of null-aware operation '...?' has type 'Never' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:29:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var l2 = [...?n1];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+// var l3 = [...n2];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+// var l5 = [...n3];
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:35:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var s2 = {...?n1, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+// var s3 = {...n2, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+// var s5 = {...n3, n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:41:17: Warning: Operand of null-aware operation '...?' has type 'N1' which excludes null.
+// var m2 = {...?n1, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+// var m3 = {...n2, n1: n1};
+// ^
+//
+// pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+// var m5 = {...n3, n1: n1};
+// ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t1 = <Never>[];
+ for (final Never #t2 in n1)
+ #t1.{core::List::add}(#t2);
+ } =>#t1;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t3 = <Never>[];
+ final core::Iterable<Never>? #t4 = n1;
+ if(!#t4.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t4{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t5 = :sync-for-iterator.{core::Iterator::current};
+ #t3.{core::List::add}(#t5);
+ }
+ }
+ } =>#t3;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:8:16: Error: Can't spread a value with static type 'Never?'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t6 = <Never>[];
+ final core::Iterable<Never>? #t7 = n2;
+ if(!#t7.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t7{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t8 = :sync-for-iterator.{core::Iterator::current};
+ #t6.{core::List::add}(#t8);
+ }
+ }
+ } =>#t6;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:10:16: Error: Can't spread a value with static type 'Null'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t9 = <Never>[];
+ final core::Iterable<Never>? #t10 = n3;
+ if(!#t10.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t10{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t11 = :sync-for-iterator.{core::Iterator::current};
+ #t9.{core::List::add}(#t11);
+ }
+ }
+ } =>#t9;
+ core::Set<Never> s1 = block {
+ final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+ for (final Never #t13 in n1)
+ #t12.{core::Set::add}(#t13);
+ #t12.{core::Set::add}(n1);
+ } =>#t12;
+ core::Set<Never> s2 = block {
+ final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t15 = n1;
+ if(!#t15.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t16 = :sync-for-iterator.{core::Iterator::current};
+ #t14.{core::Set::add}(#t16);
+ }
+ }
+ #t14.{core::Set::add}(n1);
+ } =>#t14;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+ var s3 = {...n2, n1};
+ ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
+ core::Set<Never> s4 = block {
+ final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t21 = n2;
+ if(!#t21.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t22 = :sync-for-iterator.{core::Iterator::current};
+ #t20.{core::Set::add}(#t22);
+ }
+ }
+ #t20.{core::Set::add}(n1);
+ } =>#t20;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+ var s5 = {...n3, n1};
+ ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
+ core::Set<Never> s6 = block {
+ final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+ final core::Iterable<Never>? #t27 = n3;
+ if(!#t27.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t28 = :sync-for-iterator.{core::Iterator::current};
+ #t26.{core::Set::add}(#t28);
+ }
+ }
+ #t26.{core::Set::add}(n1);
+ } =>#t26;
+ core::Map<Never, Never> m1 = block {
+ final core::Map<Never, Never> #t29 = <Never, Never>{};
+ {
+ core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t30 = :sync-for-iterator.{core::Iterator::current};
+ #t29.{core::Map::[]=}(#t30.{core::MapEntry::key}, #t30.{core::MapEntry::value});
+ }
+ }
+ #t29.{core::Map::[]=}(n1, n1);
+ } =>#t29;
+ core::Map<Never, Never> m2 = block {
+ final core::Map<Never, Never> #t31 = <Never, Never>{};
+ final core::Map<Never, Never>? #t32 = n1;
+ if(!#t32.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t32{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t33 = :sync-for-iterator.{core::Iterator::current};
+ #t31.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+ }
+ }
+ #t31.{core::Map::[]=}(n1, n1);
+ } =>#t31;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:20:16: Error: Can't spread a value with static type 'Never?'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m4 = block {
+ final core::Map<Never, Never> #t34 = <Never, Never>{};
+ final core::Map<Never, Never>? #t35 = n2;
+ if(!#t35.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t35{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t36 = :sync-for-iterator.{core::Iterator::current};
+ #t34.{core::Map::[]=}(#t36.{core::MapEntry::key}, #t36.{core::MapEntry::value});
+ }
+ }
+ #t34.{core::Map::[]=}(n1, n1);
+ } =>#t34;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:22:16: Error: Can't spread a value with static type 'Null'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<Never, Never> m6 = block {
+ final core::Map<Never, Never> #t37 = <Never, Never>{};
+ final core::Map<Never, Never>? #t38 = n3;
+ if(!#t38.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<Never, Never>> :sync-for-iterator = #t38{core::Map<Never, Never>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<Never, Never> #t39 = :sync-for-iterator.{core::Iterator::current};
+ #t37.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+ }
+ }
+ #t37.{core::Map::[]=}(n1, n1);
+ } =>#t37;
+}
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+ core::List<Never> l1 = block {
+ final core::List<Never> #t40 = <Never>[];
+ for (final Never #t41 in n1)
+ #t40.{core::List::add}(#t41);
+ } =>#t40;
+ core::List<Never> l2 = block {
+ final core::List<Never> #t42 = <Never>[];
+ final core::Iterable<Never>? #t43 = n1;
+ if(!#t43.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t43{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t44 = :sync-for-iterator.{core::Iterator::current};
+ #t42.{core::List::add}(#t44);
+ }
+ }
+ } =>#t42;
+ core::List<dynamic> l3 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:30:16: Error: Can't spread a value with static type 'N2'.
+ var l3 = [...n2];
+ ^"];
+ core::List<Never> l4 = block {
+ final core::List<Never> #t45 = <Never>[];
+ final core::Iterable<Never>? #t46 = n2;
+ if(!#t46.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t46{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t47 = :sync-for-iterator.{core::Iterator::current};
+ #t45.{core::List::add}(#t47);
+ }
+ }
+ } =>#t45;
+ core::List<dynamic> l5 = <dynamic>[invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:32:16: Error: Can't spread a value with static type 'N3'.
+ var l5 = [...n3];
+ ^"];
+ core::List<Never> l6 = block {
+ final core::List<Never> #t48 = <Never>[];
+ final core::Iterable<Never>? #t49 = n3;
+ if(!#t49.{core::Object::==}(null)) {
+ core::Iterator<Never> :sync-for-iterator = #t49{core::Iterable<Never>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final Never #t50 = :sync-for-iterator.{core::Iterator::current};
+ #t48.{core::List::add}(#t50);
+ }
+ }
+ } =>#t48;
+ core::Set<self::test2::N1> s1 = block {
+ final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+ for (final self::test2::N1 #t52 in n1)
+ #t51.{core::Set::add}(#t52);
+ #t51.{core::Set::add}(n1);
+ } =>#t51;
+ core::Set<self::test2::N1> s2 = block {
+ final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t54 = n1;
+ if(!#t54.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t55 = :sync-for-iterator.{core::Iterator::current};
+ #t53.{core::Set::add}(#t55);
+ }
+ }
+ #t53.{core::Set::add}(n1);
+ } =>#t53;
+ core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+ var s3 = {...n2, n1};
+ ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
+ core::Set<self::test2::N1> s4 = block {
+ final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t60 = n2;
+ if(!#t60.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t61 = :sync-for-iterator.{core::Iterator::current};
+ #t59.{core::Set::add}(#t61);
+ }
+ }
+ #t59.{core::Set::add}(n1);
+ } =>#t59;
+ core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+ var s5 = {...n3, n1};
+ ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
+ core::Set<self::test2::N1> s6 = block {
+ final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+ final core::Iterable<self::test2::N1>? #t66 = n3;
+ if(!#t66.{core::Object::==}(null)) {
+ core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final self::test2::N1 #t67 = :sync-for-iterator.{core::Iterator::current};
+ #t65.{core::Set::add}(#t67);
+ }
+ }
+ #t65.{core::Set::add}(n1);
+ } =>#t65;
+ core::Map<self::test2::N1, self::test2::N1> m1 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t68 = <self::test2::N1, self::test2::N1>{};
+ {
+ core::Iterator<core::MapEntry<<BottomType>, <BottomType>>> :sync-for-iterator = n1.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t69 = :sync-for-iterator.{core::Iterator::current};
+ #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+ }
+ }
+ #t68.{core::Map::[]=}(n1, n1);
+ } =>#t68;
+ core::Map<self::test2::N1, self::test2::N1> m2 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t70 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t71 = n1;
+ if(!#t71.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t71{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t72 = :sync-for-iterator.{core::Iterator::current};
+ #t70.{core::Map::[]=}(#t72.{core::MapEntry::key}, #t72.{core::MapEntry::value});
+ }
+ }
+ #t70.{core::Map::[]=}(n1, n1);
+ } =>#t70;
+ core::Map<dynamic, dynamic> m3 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:42:16: Error: Can't spread a value with static type 'N2'.
+ var m3 = {...n2, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m4 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t73 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t74 = n2;
+ if(!#t74.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t74{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t75 = :sync-for-iterator.{core::Iterator::current};
+ #t73.{core::Map::[]=}(#t75.{core::MapEntry::key}, #t75.{core::MapEntry::value});
+ }
+ }
+ #t73.{core::Map::[]=}(n1, n1);
+ } =>#t73;
+ core::Map<dynamic, dynamic> m5 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:44:16: Error: Can't spread a value with static type 'N3'.
+ var m5 = {...n3, n1: n1};
+ ^": null, n1: n1};
+ core::Map<self::test2::N1, self::test2::N1> m6 = block {
+ final core::Map<self::test2::N1, self::test2::N1> #t76 = <self::test2::N1, self::test2::N1>{};
+ final core::Map<self::test2::N1, self::test2::N1>? #t77 = n3;
+ if(!#t77.{core::Object::==}(null)) {
+ core::Iterator<core::MapEntry<self::test2::N1, self::test2::N1>> :sync-for-iterator = #t77{core::Map<self::test2::N1, self::test2::N1>}.{core::Map::entries}.{core::Iterable::iterator};
+ for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+ final core::MapEntry<self::test2::N1, self::test2::N1> #t78 = :sync-for-iterator.{core::Iterator::current};
+ #t76.{core::Map::[]=}(#t78.{core::MapEntry::key}, #t78.{core::MapEntry::value});
+ }
+ }
+ #t76.{core::Map::[]=}(n1, n1);
+ } =>#t76;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
index 40260d9..64f137e 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -22,42 +22,42 @@
// x?.[42] = 42; // Warning.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
@@ -87,35 +87,35 @@
let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
index 1eb7ae3..2a5f9c5 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
@@ -22,42 +22,42 @@
// x?.[42] = 42; // Warning.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
@@ -87,35 +87,35 @@
let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
index 40260d9..64f137e 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -22,42 +22,42 @@
// x?.[42] = 42; // Warning.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
@@ -87,35 +87,35 @@
let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
index 1eb7ae3..2a5f9c5 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
@@ -22,42 +22,42 @@
// x?.[42] = 42; // Warning.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'foo'.
// y.foo(); // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
// y.bar; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
// y.baz = 42; // Error.
// ^^^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
// Try correcting the name to the name of an existing method, or defining a method named 'call'.
// y(); // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y++; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '+' operator.
// y += 1; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]' operator.
// y[42]; // Error.
// ^
//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
// Try correcting the operator to an existing operator, or defining a '[]=' operator.
// y[42] = 42; // Error.
// ^
@@ -87,35 +87,35 @@
let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'foo'.
y.foo(); // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:5: Error: The getter 'bar' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
y.bar; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:32:5: Error: The setter 'baz' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
y.baz = 42; // Error.
^^^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:33:4: Error: The method 'call' isn't defined for the class 'Never?'.
Try correcting the name to the name of an existing method, or defining a method named 'call'.
y(); // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:34:4: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y++; // Error.
^";
- y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never'.
+ y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:35:5: Error: The operator '+' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '+' operator.
y += 1; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:36:4: Error: The operator '[]' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]' operator.
y[42]; // Error.
^";
- invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+ invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:37:4: Error: The operator '[]=' isn't defined for the class 'Never?'.
Try correcting the operator to an existing operator, or defining a '[]=' operator.
y[42] = 42; // Error.
^";
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
index 066a5f6..6c5d89f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
@@ -62,10 +62,18 @@
// nonNullableClass.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nonNullableClass.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nullableClass?.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
@@ -171,22 +179,26 @@
let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nonNullableClass.nullableField += 2; // error
- ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ ^" in (let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nonNullableClass.nullableField += 2; // error
+ ^" in #t31.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+ let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nullableClass?.nullableField += 2; // error
- ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
- let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ ^" in (let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t34.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
index 066a5f6..980d82f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
@@ -62,10 +62,18 @@
// nonNullableClass.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nonNullableClass.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nullableClass?.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
@@ -171,22 +179,26 @@
let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+ nonNullableClass.nullableField += 2; // error
+ ^" in let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
nonNullableClass.nullableField += 2; // error
^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nullableClass?.nullableField += 2; // error
- ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
- let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ ^" in let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t34.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
index 066a5f6..6c5d89f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
@@ -62,10 +62,18 @@
// nonNullableClass.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nonNullableClass.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nullableClass?.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
@@ -171,22 +179,26 @@
let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nonNullableClass.nullableField += 2; // error
- ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ ^" in (let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nonNullableClass.nullableField += 2; // error
+ ^" in #t31.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+ let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nullableClass?.nullableField += 2; // error
- ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
- let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ ^" in (let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t34.{self::Class::nullableField}.{core::num::+}(2)) as{TypeError,ForNonNullableByDefault} core::int?;
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
index 066a5f6..980d82f 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
@@ -62,10 +62,18 @@
// nonNullableClass.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nonNullableClass.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
// nullableClass?.nullableField += 2; // error
// ^
//
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+// nullableClass?.nullableField += 2; // error
+// ^
+//
// pkg/front_end/testcases/nnbd/null_access.dart:54:35: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
// ^
@@ -171,22 +179,26 @@
let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
- let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
+ nonNullableClass.nullableField += 2; // error
+ ^" in let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
nonNullableClass.nullableField += 2; // error
^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ let final self::Class? #t34 = nullableClass in #t34.{core::Object::==}(null) ?{core::num?} null : #t34.{self::Class::nullableField} = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: A value of type 'num' can't be assigned to a variable of type 'int?'.
nullableClass?.nullableField += 2; // error
- ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
- let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
- let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
- let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
- let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ ^" in let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ nullableClass?.nullableField += 2; // error
+ ^" in #t34.{self::Class::nullableField}.{core::num::+}(2);
+ let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : #t37.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t37.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t38 = nullableClass in #t38.{core::Object::==}(null) ?{core::int?} null : #t38.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t38.{self::Class::nullableField} = 0 : null;
+ let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nonNullableField} = 0 : null;
+ let final self::Class? #t41 = nullableClass in #t41.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t42 = #t41{self::Class}.{self::Class::nonNullableClass} in #t42{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t42{self::Class}.{self::Class::nullableField} = 0 : null;
+ let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
- 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
Try calling using ?.call instead.
nullableClass(); // error
^" in nullableClass.{self::Class::call}();
nonNullableClass.{self::Class::call}();
- let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
- let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::call}();
+ let final self::Class #t45 = nonNullableClass in #t45.{core::Object::==}(null) ?{self::Class?} null : #t45.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart b/pkg/front_end/testcases/nnbd/numbers.dart
new file mode 100644
index 0000000..afd51a4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart
@@ -0,0 +1,485 @@
+// 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.
+
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n + n;
+ var n_i = n + i;
+ var n_d = n + d;
+ var n_x = n + x;
+ var n_y = n + y;
+ var n_z = n + z;
+
+ var i_n = i + n;
+ var i_i = i + i;
+ var i_d = i + d;
+ var i_x = i + x;
+ var i_y = i + y;
+ var i_z = i + z;
+
+ var d_n = d + n;
+ var d_i = d + i;
+ var d_d = d + d;
+ var d_x = d + x;
+ var d_y = d + y;
+ var d_z = d + z;
+
+ var x_n = x + n;
+ var x_i = x + i;
+ var x_d = x + d;
+ var x_x = x + x;
+ var x_y = x + y;
+ var x_z = x + z;
+
+ var y_n = y + n;
+ var y_i = y + i;
+ var y_d = y + d;
+ var y_x = y + x;
+ var y_y = y + y;
+ var y_z = y + z;
+
+ var z_n = z + n;
+ var z_i = z + i;
+ var z_d = z + d;
+ var z_x = z + x;
+ var z_y = z + y;
+ var z_z = z + z;
+}
+
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n - n;
+ var n_i = n - i;
+ var n_d = n - d;
+ var n_x = n - x;
+ var n_y = n - y;
+ var n_z = n - z;
+
+ var i_n = i - n;
+ var i_i = i - i;
+ var i_d = i - d;
+ var i_x = i - x;
+ var i_y = i - y;
+ var i_z = i - z;
+
+ var d_n = d - n;
+ var d_i = d - i;
+ var d_d = d - d;
+ var d_x = d - x;
+ var d_y = d - y;
+ var d_z = d - z;
+
+ var x_n = x - n;
+ var x_i = x - i;
+ var x_d = x - d;
+ var x_x = x - x;
+ var x_y = x - y;
+ var x_z = x - z;
+
+ var y_n = y - n;
+ var y_i = y - i;
+ var y_d = y - d;
+ var y_x = y - x;
+ var y_y = y - y;
+ var y_z = y - z;
+
+ var z_n = z - n;
+ var z_i = z - i;
+ var z_d = z - d;
+ var z_x = z - x;
+ var z_y = z - y;
+ var z_z = z - z;
+}
+
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n * n;
+ var n_i = n * i;
+ var n_d = n * d;
+ var n_x = n * x;
+ var n_y = n * y;
+ var n_z = n * z;
+
+ var i_n = i * n;
+ var i_i = i * i;
+ var i_d = i * d;
+ var i_x = i * x;
+ var i_y = i * y;
+ var i_z = i * z;
+
+ var d_n = d * n;
+ var d_i = d * i;
+ var d_d = d * d;
+ var d_x = d * x;
+ var d_y = d * y;
+ var d_z = d * z;
+
+ var x_n = x * n;
+ var x_i = x * i;
+ var x_d = x * d;
+ var x_x = x * x;
+ var x_y = x * y;
+ var x_z = x * z;
+
+ var y_n = y * n;
+ var y_i = y * i;
+ var y_d = y * d;
+ var y_x = y * x;
+ var y_y = y * y;
+ var y_z = y * z;
+
+ var z_n = z * n;
+ var z_i = z * i;
+ var z_d = z * d;
+ var z_x = z * x;
+ var z_y = z * y;
+ var z_z = z * z;
+}
+
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n % n;
+ var n_i = n % i;
+ var n_d = n % d;
+ var n_x = n % x;
+ var n_y = n % y;
+ var n_z = n % z;
+
+ var i_n = i % n;
+ var i_i = i % i;
+ var i_d = i % d;
+ var i_x = i % x;
+ var i_y = i % y;
+ var i_z = i % z;
+
+ var d_n = d % n;
+ var d_i = d % i;
+ var d_d = d % d;
+ var d_x = d % x;
+ var d_y = d % y;
+ var d_z = d % z;
+
+ var x_n = x % n;
+ var x_i = x % i;
+ var x_d = x % d;
+ var x_x = x % x;
+ var x_y = x % y;
+ var x_z = x % z;
+
+ var y_n = y % n;
+ var y_i = y % i;
+ var y_d = y % d;
+ var y_x = y % x;
+ var y_y = y % y;
+ var y_z = y % z;
+
+ var z_n = z % n;
+ var z_i = z % i;
+ var z_d = z % d;
+ var z_x = z % x;
+ var z_y = z % y;
+ var z_z = z % z;
+}
+
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n.remainder(n);
+ var n_i = n.remainder(i);
+ var n_d = n.remainder(d);
+ var n_x = n.remainder(x);
+ var n_y = n.remainder(y);
+ var n_z = n.remainder(z);
+
+ var i_n = i.remainder(n);
+ var i_i = i.remainder(i);
+ var i_d = i.remainder(d);
+ var i_x = i.remainder(x);
+ var i_y = i.remainder(y);
+ var i_z = i.remainder(z);
+
+ var d_n = d.remainder(n);
+ var d_i = d.remainder(i);
+ var d_d = d.remainder(d);
+ var d_x = d.remainder(x);
+ var d_y = d.remainder(y);
+ var d_z = d.remainder(z);
+
+ var x_n = x.remainder(n);
+ var x_i = x.remainder(i);
+ var x_d = x.remainder(d);
+ var x_x = x.remainder(x);
+ var x_y = x.remainder(y);
+ var x_z = x.remainder(z);
+
+ var y_n = y.remainder(n);
+ var y_i = y.remainder(i);
+ var y_d = y.remainder(d);
+ var y_x = y.remainder(x);
+ var y_y = y.remainder(y);
+ var y_z = y.remainder(z);
+
+ var z_n = z.remainder(n);
+ var z_i = z.remainder(i);
+ var z_d = z.remainder(d);
+ var z_x = z.remainder(x);
+ var z_y = z.remainder(y);
+ var z_z = z.remainder(z);
+}
+
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n_n = n.clamp(n, n);
+ var n_i_n = n.clamp(i, n);
+ var n_d_n = n.clamp(d, n);
+ var n_x_n = n.clamp(x, n);
+ var n_y_n = n.clamp(y, n);
+ var n_z_n = n.clamp(z, n);
+
+ var n_n_i = n.clamp(n, i);
+ var n_i_i = n.clamp(i, i);
+ var n_d_i = n.clamp(d, i);
+ var n_x_i = n.clamp(x, i);
+ var n_y_i = n.clamp(y, i);
+ var n_z_i = n.clamp(z, i);
+
+ var n_n_d = n.clamp(n, d);
+ var n_i_d = n.clamp(i, d);
+ var n_d_d = n.clamp(d, d);
+ var n_x_d = n.clamp(x, d);
+ var n_y_d = n.clamp(y, d);
+ var n_z_d = n.clamp(z, d);
+
+ var n_n_x = n.clamp(n, x);
+ var n_i_x = n.clamp(i, x);
+ var n_d_x = n.clamp(d, x);
+ var n_x_x = n.clamp(x, x);
+ var n_y_x = n.clamp(y, x);
+ var n_z_x = n.clamp(z, x);
+
+ var n_n_y = n.clamp(n, y);
+ var n_i_y = n.clamp(i, y);
+ var n_d_y = n.clamp(d, y);
+ var n_x_y = n.clamp(x, y);
+ var n_y_y = n.clamp(y, y);
+ var n_z_y = n.clamp(z, y);
+
+ var n_n_z = n.clamp(n, z);
+ var n_i_z = n.clamp(i, z);
+ var n_d_z = n.clamp(d, z);
+ var n_x_z = n.clamp(x, z);
+ var n_y_z = n.clamp(y, z);
+ var n_z_z = n.clamp(z, z);
+
+ var i_n_n = i.clamp(n, n);
+ var i_i_n = i.clamp(i, n);
+ var i_d_n = i.clamp(d, n);
+ var i_x_n = i.clamp(x, n);
+ var i_y_n = i.clamp(y, n);
+ var i_z_n = i.clamp(z, n);
+
+ var i_n_i = i.clamp(n, i);
+ var i_i_i = i.clamp(i, i);
+ var i_d_i = i.clamp(d, i);
+ var i_x_i = i.clamp(x, i);
+ var i_y_i = i.clamp(y, i);
+ var i_z_i = i.clamp(z, i);
+
+ var i_n_d = i.clamp(n, d);
+ var i_i_d = i.clamp(i, d);
+ var i_d_d = i.clamp(d, d);
+ var i_x_d = i.clamp(x, d);
+ var i_y_d = i.clamp(y, d);
+ var i_z_d = i.clamp(z, d);
+
+ var i_n_x = i.clamp(n, x);
+ var i_i_x = i.clamp(i, x);
+ var i_d_x = i.clamp(d, x);
+ var i_x_x = i.clamp(x, x);
+ var i_y_x = i.clamp(y, x);
+ var i_z_x = i.clamp(z, x);
+
+ var i_n_y = i.clamp(n, y);
+ var i_i_y = i.clamp(i, y);
+ var i_d_y = i.clamp(d, y);
+ var i_x_y = i.clamp(x, y);
+ var i_y_y = i.clamp(y, y);
+ var i_z_y = i.clamp(z, y);
+
+ var i_n_z = i.clamp(n, z);
+ var i_i_z = i.clamp(i, z);
+ var i_d_z = i.clamp(d, z);
+ var i_x_z = i.clamp(x, z);
+ var i_y_z = i.clamp(y, z);
+ var i_z_z = i.clamp(z, z);
+
+ var d_n_n = d.clamp(n, n);
+ var d_i_n = d.clamp(i, n);
+ var d_d_n = d.clamp(d, n);
+ var d_x_n = d.clamp(x, n);
+ var d_y_n = d.clamp(y, n);
+ var d_z_n = d.clamp(z, n);
+
+ var d_n_i = d.clamp(n, i);
+ var d_i_i = d.clamp(i, i);
+ var d_d_i = d.clamp(d, i);
+ var d_x_i = d.clamp(x, i);
+ var d_y_i = d.clamp(y, i);
+ var d_z_i = d.clamp(z, i);
+
+ var d_n_d = d.clamp(n, d);
+ var d_i_d = d.clamp(i, d);
+ var d_d_d = d.clamp(d, d);
+ var d_x_d = d.clamp(x, d);
+ var d_y_d = d.clamp(y, d);
+ var d_z_d = d.clamp(z, d);
+
+ var d_n_x = d.clamp(n, x);
+ var d_i_x = d.clamp(i, x);
+ var d_d_x = d.clamp(d, x);
+ var d_x_x = d.clamp(x, x);
+ var d_y_x = d.clamp(y, x);
+ var d_z_x = d.clamp(z, x);
+
+ var d_n_y = d.clamp(n, y);
+ var d_i_y = d.clamp(i, y);
+ var d_d_y = d.clamp(d, y);
+ var d_x_y = d.clamp(x, y);
+ var d_y_y = d.clamp(y, y);
+ var d_z_y = d.clamp(z, y);
+
+ var d_n_z = d.clamp(n, z);
+ var d_i_z = d.clamp(i, z);
+ var d_d_z = d.clamp(d, z);
+ var d_x_z = d.clamp(x, z);
+ var d_y_z = d.clamp(y, z);
+ var d_z_z = d.clamp(z, z);
+
+ var x_n_n = x.clamp(n, n);
+ var x_i_n = x.clamp(i, n);
+ var x_d_n = x.clamp(d, n);
+ var x_x_n = x.clamp(x, n);
+ var x_y_n = x.clamp(y, n);
+ var x_z_n = x.clamp(z, n);
+
+ var x_n_i = x.clamp(n, i);
+ var x_i_i = x.clamp(i, i);
+ var x_d_i = x.clamp(d, i);
+ var x_x_i = x.clamp(x, i);
+ var x_y_i = x.clamp(y, i);
+ var x_z_i = x.clamp(z, i);
+
+ var x_n_d = x.clamp(n, d);
+ var x_i_d = x.clamp(i, d);
+ var x_d_d = x.clamp(d, d);
+ var x_x_d = x.clamp(x, d);
+ var x_y_d = x.clamp(y, d);
+ var x_z_d = x.clamp(z, d);
+
+ var x_n_x = x.clamp(n, x);
+ var x_i_x = x.clamp(i, x);
+ var x_d_x = x.clamp(d, x);
+ var x_x_x = x.clamp(x, x);
+ var x_y_x = x.clamp(y, x);
+ var x_z_x = x.clamp(z, x);
+
+ var x_n_y = x.clamp(n, y);
+ var x_i_y = x.clamp(i, y);
+ var x_d_y = x.clamp(d, y);
+ var x_x_y = x.clamp(x, y);
+ var x_y_y = x.clamp(y, y);
+ var x_z_y = x.clamp(z, y);
+
+ var x_n_z = x.clamp(n, z);
+ var x_i_z = x.clamp(i, z);
+ var x_d_z = x.clamp(d, z);
+ var x_x_z = x.clamp(x, z);
+ var x_y_z = x.clamp(y, z);
+ var x_z_z = x.clamp(z, z);
+
+ var y_n_n = y.clamp(n, n);
+ var y_i_n = y.clamp(i, n);
+ var y_d_n = y.clamp(d, n);
+ var y_x_n = y.clamp(x, n);
+ var y_y_n = y.clamp(y, n);
+ var y_z_n = y.clamp(z, n);
+
+ var y_n_i = y.clamp(n, i);
+ var y_i_i = y.clamp(i, i);
+ var y_d_i = y.clamp(d, i);
+ var y_x_i = y.clamp(x, i);
+ var y_y_i = y.clamp(y, i);
+ var y_z_i = y.clamp(z, i);
+
+ var y_n_d = y.clamp(n, d);
+ var y_i_d = y.clamp(i, d);
+ var y_d_d = y.clamp(d, d);
+ var y_x_d = y.clamp(x, d);
+ var y_y_d = y.clamp(y, d);
+ var y_z_d = y.clamp(z, d);
+
+ var y_n_x = y.clamp(n, x);
+ var y_i_x = y.clamp(i, x);
+ var y_d_x = y.clamp(d, x);
+ var y_x_x = y.clamp(x, x);
+ var y_y_x = y.clamp(y, x);
+ var y_z_x = y.clamp(z, x);
+
+ var y_n_y = y.clamp(n, y);
+ var y_i_y = y.clamp(i, y);
+ var y_d_y = y.clamp(d, y);
+ var y_x_y = y.clamp(x, y);
+ var y_y_y = y.clamp(y, y);
+ var y_z_y = y.clamp(z, y);
+
+ var y_n_z = y.clamp(n, z);
+ var y_i_z = y.clamp(i, z);
+ var y_d_z = y.clamp(d, z);
+ var y_x_z = y.clamp(x, z);
+ var y_y_z = y.clamp(y, z);
+ var y_z_z = y.clamp(z, z);
+
+ var z_n_n = z.clamp(n, n);
+ var z_i_n = z.clamp(i, n);
+ var z_d_n = z.clamp(d, n);
+ var z_x_n = z.clamp(x, n);
+ var z_y_n = z.clamp(y, n);
+ var z_z_n = z.clamp(z, n);
+
+ var z_n_i = z.clamp(n, i);
+ var z_i_i = z.clamp(i, i);
+ var z_d_i = z.clamp(d, i);
+ var z_x_i = z.clamp(x, i);
+ var z_y_i = z.clamp(y, i);
+ var z_z_i = z.clamp(z, i);
+
+ var z_n_d = z.clamp(n, d);
+ var z_i_d = z.clamp(i, d);
+ var z_d_d = z.clamp(d, d);
+ var z_x_d = z.clamp(x, d);
+ var z_y_d = z.clamp(y, d);
+ var z_z_d = z.clamp(z, d);
+
+ var z_n_x = z.clamp(n, x);
+ var z_i_x = z.clamp(i, x);
+ var z_d_x = z.clamp(d, x);
+ var z_x_x = z.clamp(x, x);
+ var z_y_x = z.clamp(y, x);
+ var z_z_x = z.clamp(z, x);
+
+ var z_n_y = z.clamp(n, y);
+ var z_i_y = z.clamp(i, y);
+ var z_d_y = z.clamp(d, y);
+ var z_x_y = z.clamp(x, y);
+ var z_y_y = z.clamp(y, y);
+ var z_z_y = z.clamp(z, y);
+
+ var z_n_z = z.clamp(n, z);
+ var z_i_z = z.clamp(i, z);
+ var z_d_z = z.clamp(d, z);
+ var z_x_z = z.clamp(x, z);
+ var z_y_z = z.clamp(y, z);
+ var z_z_z = z.clamp(z, z);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect b/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect
new file mode 100644
index 0000000..e9834e0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+ ;
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+ ;
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+ ;
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+ ;
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+ ;
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(n);
+ core::num n_i = n.{core::num::+}(i);
+ core::double n_d = n.{core::num::+}(d);
+ core::num n_x = n.{core::num::+}(x);
+ core::num n_y = n.{core::num::+}(y);
+ core::double n_z = n.{core::num::+}(z);
+ core::num i_n = i.{core::num::+}(n);
+ core::int i_i = i.{core::num::+}(i);
+ core::double i_d = i.{core::num::+}(d);
+ core::num i_x = i.{core::num::+}(x);
+ core::int i_y = i.{core::num::+}(y);
+ core::double i_z = i.{core::num::+}(z);
+ core::double d_n = d.{core::double::+}(n);
+ core::double d_i = d.{core::double::+}(i);
+ core::double d_d = d.{core::double::+}(d);
+ core::double d_x = d.{core::double::+}(x);
+ core::double d_y = d.{core::double::+}(y);
+ core::double d_z = d.{core::double::+}(z);
+ core::num x_n = x.{core::num::+}(n);
+ core::num x_i = x.{core::num::+}(i);
+ core::double x_d = x.{core::num::+}(d);
+ core::num x_x = x.{core::num::+}(x);
+ core::num x_y = x.{core::num::+}(y);
+ core::double x_z = x.{core::num::+}(z);
+ core::num y_n = y.{core::num::+}(n);
+ core::int y_i = y.{core::num::+}(i);
+ core::double y_d = y.{core::num::+}(d);
+ core::num y_x = y.{core::num::+}(x);
+ core::int y_y = y.{core::num::+}(y);
+ core::double y_z = y.{core::num::+}(z);
+ core::double z_n = z.{core::double::+}(n);
+ core::double z_i = z.{core::double::+}(i);
+ core::double z_d = z.{core::double::+}(d);
+ core::double z_x = z.{core::double::+}(x);
+ core::double z_y = z.{core::double::+}(y);
+ core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(n);
+ core::num n_i = n.{core::num::-}(i);
+ core::double n_d = n.{core::num::-}(d);
+ core::num n_x = n.{core::num::-}(x);
+ core::num n_y = n.{core::num::-}(y);
+ core::double n_z = n.{core::num::-}(z);
+ core::num i_n = i.{core::num::-}(n);
+ core::int i_i = i.{core::num::-}(i);
+ core::double i_d = i.{core::num::-}(d);
+ core::num i_x = i.{core::num::-}(x);
+ core::int i_y = i.{core::num::-}(y);
+ core::double i_z = i.{core::num::-}(z);
+ core::double d_n = d.{core::double::-}(n);
+ core::double d_i = d.{core::double::-}(i);
+ core::double d_d = d.{core::double::-}(d);
+ core::double d_x = d.{core::double::-}(x);
+ core::double d_y = d.{core::double::-}(y);
+ core::double d_z = d.{core::double::-}(z);
+ core::num x_n = x.{core::num::-}(n);
+ core::num x_i = x.{core::num::-}(i);
+ core::double x_d = x.{core::num::-}(d);
+ core::num x_x = x.{core::num::-}(x);
+ core::num x_y = x.{core::num::-}(y);
+ core::double x_z = x.{core::num::-}(z);
+ core::num y_n = y.{core::num::-}(n);
+ core::int y_i = y.{core::num::-}(i);
+ core::double y_d = y.{core::num::-}(d);
+ core::num y_x = y.{core::num::-}(x);
+ core::int y_y = y.{core::num::-}(y);
+ core::double y_z = y.{core::num::-}(z);
+ core::double z_n = z.{core::double::-}(n);
+ core::double z_i = z.{core::double::-}(i);
+ core::double z_d = z.{core::double::-}(d);
+ core::double z_x = z.{core::double::-}(x);
+ core::double z_y = z.{core::double::-}(y);
+ core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(n);
+ core::num n_i = n.{core::num::*}(i);
+ core::double n_d = n.{core::num::*}(d);
+ core::num n_x = n.{core::num::*}(x);
+ core::num n_y = n.{core::num::*}(y);
+ core::double n_z = n.{core::num::*}(z);
+ core::num i_n = i.{core::num::*}(n);
+ core::int i_i = i.{core::num::*}(i);
+ core::double i_d = i.{core::num::*}(d);
+ core::num i_x = i.{core::num::*}(x);
+ core::int i_y = i.{core::num::*}(y);
+ core::double i_z = i.{core::num::*}(z);
+ core::double d_n = d.{core::double::*}(n);
+ core::double d_i = d.{core::double::*}(i);
+ core::double d_d = d.{core::double::*}(d);
+ core::double d_x = d.{core::double::*}(x);
+ core::double d_y = d.{core::double::*}(y);
+ core::double d_z = d.{core::double::*}(z);
+ core::num x_n = x.{core::num::*}(n);
+ core::num x_i = x.{core::num::*}(i);
+ core::double x_d = x.{core::num::*}(d);
+ core::num x_x = x.{core::num::*}(x);
+ core::num x_y = x.{core::num::*}(y);
+ core::double x_z = x.{core::num::*}(z);
+ core::num y_n = y.{core::num::*}(n);
+ core::int y_i = y.{core::num::*}(i);
+ core::double y_d = y.{core::num::*}(d);
+ core::num y_x = y.{core::num::*}(x);
+ core::int y_y = y.{core::num::*}(y);
+ core::double y_z = y.{core::num::*}(z);
+ core::double z_n = z.{core::double::*}(n);
+ core::double z_i = z.{core::double::*}(i);
+ core::double z_d = z.{core::double::*}(d);
+ core::double z_x = z.{core::double::*}(x);
+ core::double z_y = z.{core::double::*}(y);
+ core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(n);
+ core::num n_i = n.{core::num::%}(i);
+ core::double n_d = n.{core::num::%}(d);
+ core::num n_x = n.{core::num::%}(x);
+ core::num n_y = n.{core::num::%}(y);
+ core::double n_z = n.{core::num::%}(z);
+ core::num i_n = i.{core::num::%}(n);
+ core::int i_i = i.{core::num::%}(i);
+ core::double i_d = i.{core::num::%}(d);
+ core::num i_x = i.{core::num::%}(x);
+ core::int i_y = i.{core::num::%}(y);
+ core::double i_z = i.{core::num::%}(z);
+ core::double d_n = d.{core::double::%}(n);
+ core::double d_i = d.{core::double::%}(i);
+ core::double d_d = d.{core::double::%}(d);
+ core::double d_x = d.{core::double::%}(x);
+ core::double d_y = d.{core::double::%}(y);
+ core::double d_z = d.{core::double::%}(z);
+ core::num x_n = x.{core::num::%}(n);
+ core::num x_i = x.{core::num::%}(i);
+ core::double x_d = x.{core::num::%}(d);
+ core::num x_x = x.{core::num::%}(x);
+ core::num x_y = x.{core::num::%}(y);
+ core::double x_z = x.{core::num::%}(z);
+ core::num y_n = y.{core::num::%}(n);
+ core::int y_i = y.{core::num::%}(i);
+ core::double y_d = y.{core::num::%}(d);
+ core::num y_x = y.{core::num::%}(x);
+ core::int y_y = y.{core::num::%}(y);
+ core::double y_z = y.{core::num::%}(z);
+ core::double z_n = z.{core::double::%}(n);
+ core::double z_i = z.{core::double::%}(i);
+ core::double z_d = z.{core::double::%}(d);
+ core::double z_x = z.{core::double::%}(x);
+ core::double z_y = z.{core::double::%}(y);
+ core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(n);
+ core::num n_i = n.{core::num::remainder}(i);
+ core::double n_d = n.{core::num::remainder}(d);
+ core::num n_x = n.{core::num::remainder}(x);
+ core::num n_y = n.{core::num::remainder}(y);
+ core::double n_z = n.{core::num::remainder}(z);
+ core::num i_n = i.{core::num::remainder}(n);
+ core::int i_i = i.{core::num::remainder}(i);
+ core::double i_d = i.{core::num::remainder}(d);
+ core::num i_x = i.{core::num::remainder}(x);
+ core::int i_y = i.{core::num::remainder}(y);
+ core::double i_z = i.{core::num::remainder}(z);
+ core::double d_n = d.{core::double::remainder}(n);
+ core::double d_i = d.{core::double::remainder}(i);
+ core::double d_d = d.{core::double::remainder}(d);
+ core::double d_x = d.{core::double::remainder}(x);
+ core::double d_y = d.{core::double::remainder}(y);
+ core::double d_z = d.{core::double::remainder}(z);
+ core::num x_n = x.{core::num::remainder}(n);
+ core::num x_i = x.{core::num::remainder}(i);
+ core::double x_d = x.{core::num::remainder}(d);
+ core::num x_x = x.{core::num::remainder}(x);
+ core::num x_y = x.{core::num::remainder}(y);
+ core::double x_z = x.{core::num::remainder}(z);
+ core::num y_n = y.{core::num::remainder}(n);
+ core::int y_i = y.{core::num::remainder}(i);
+ core::double y_d = y.{core::num::remainder}(d);
+ core::num y_x = y.{core::num::remainder}(x);
+ core::int y_y = y.{core::num::remainder}(y);
+ core::double y_z = y.{core::num::remainder}(z);
+ core::double z_n = z.{core::double::remainder}(n);
+ core::double z_i = z.{core::double::remainder}(i);
+ core::double z_d = z.{core::double::remainder}(d);
+ core::double z_x = z.{core::double::remainder}(x);
+ core::double z_y = z.{core::double::remainder}(y);
+ core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n_n = n.{core::num::clamp}(n, n);
+ core::num n_i_n = n.{core::num::clamp}(i, n);
+ core::num n_d_n = n.{core::num::clamp}(d, n);
+ core::num n_x_n = n.{core::num::clamp}(x, n);
+ core::num n_y_n = n.{core::num::clamp}(y, n);
+ core::num n_z_n = n.{core::num::clamp}(z, n);
+ core::num n_n_i = n.{core::num::clamp}(n, i);
+ core::num n_i_i = n.{core::num::clamp}(i, i);
+ core::num n_d_i = n.{core::num::clamp}(d, i);
+ core::num n_x_i = n.{core::num::clamp}(x, i);
+ core::num n_y_i = n.{core::num::clamp}(y, i);
+ core::num n_z_i = n.{core::num::clamp}(z, i);
+ core::num n_n_d = n.{core::num::clamp}(n, d);
+ core::num n_i_d = n.{core::num::clamp}(i, d);
+ core::num n_d_d = n.{core::num::clamp}(d, d);
+ core::num n_x_d = n.{core::num::clamp}(x, d);
+ core::num n_y_d = n.{core::num::clamp}(y, d);
+ core::num n_z_d = n.{core::num::clamp}(z, d);
+ core::num n_n_x = n.{core::num::clamp}(n, x);
+ core::num n_i_x = n.{core::num::clamp}(i, x);
+ core::num n_d_x = n.{core::num::clamp}(d, x);
+ core::num n_x_x = n.{core::num::clamp}(x, x);
+ core::num n_y_x = n.{core::num::clamp}(y, x);
+ core::num n_z_x = n.{core::num::clamp}(z, x);
+ core::num n_n_y = n.{core::num::clamp}(n, y);
+ core::num n_i_y = n.{core::num::clamp}(i, y);
+ core::num n_d_y = n.{core::num::clamp}(d, y);
+ core::num n_x_y = n.{core::num::clamp}(x, y);
+ core::num n_y_y = n.{core::num::clamp}(y, y);
+ core::num n_z_y = n.{core::num::clamp}(z, y);
+ core::num n_n_z = n.{core::num::clamp}(n, z);
+ core::num n_i_z = n.{core::num::clamp}(i, z);
+ core::num n_d_z = n.{core::num::clamp}(d, z);
+ core::num n_x_z = n.{core::num::clamp}(x, z);
+ core::num n_y_z = n.{core::num::clamp}(y, z);
+ core::num n_z_z = n.{core::num::clamp}(z, z);
+ core::num i_n_n = i.{core::num::clamp}(n, n);
+ core::num i_i_n = i.{core::num::clamp}(i, n);
+ core::num i_d_n = i.{core::num::clamp}(d, n);
+ core::num i_x_n = i.{core::num::clamp}(x, n);
+ core::num i_y_n = i.{core::num::clamp}(y, n);
+ core::num i_z_n = i.{core::num::clamp}(z, n);
+ core::num i_n_i = i.{core::num::clamp}(n, i);
+ core::int i_i_i = i.{core::num::clamp}(i, i);
+ core::num i_d_i = i.{core::num::clamp}(d, i);
+ core::num i_x_i = i.{core::num::clamp}(x, i);
+ core::int i_y_i = i.{core::num::clamp}(y, i);
+ core::num i_z_i = i.{core::num::clamp}(z, i);
+ core::num i_n_d = i.{core::num::clamp}(n, d);
+ core::num i_i_d = i.{core::num::clamp}(i, d);
+ core::num i_d_d = i.{core::num::clamp}(d, d);
+ core::num i_x_d = i.{core::num::clamp}(x, d);
+ core::num i_y_d = i.{core::num::clamp}(y, d);
+ core::num i_z_d = i.{core::num::clamp}(z, d);
+ core::num i_n_x = i.{core::num::clamp}(n, x);
+ core::num i_i_x = i.{core::num::clamp}(i, x);
+ core::num i_d_x = i.{core::num::clamp}(d, x);
+ core::num i_x_x = i.{core::num::clamp}(x, x);
+ core::num i_y_x = i.{core::num::clamp}(y, x);
+ core::num i_z_x = i.{core::num::clamp}(z, x);
+ core::num i_n_y = i.{core::num::clamp}(n, y);
+ core::int i_i_y = i.{core::num::clamp}(i, y);
+ core::num i_d_y = i.{core::num::clamp}(d, y);
+ core::num i_x_y = i.{core::num::clamp}(x, y);
+ core::int i_y_y = i.{core::num::clamp}(y, y);
+ core::num i_z_y = i.{core::num::clamp}(z, y);
+ core::num i_n_z = i.{core::num::clamp}(n, z);
+ core::num i_i_z = i.{core::num::clamp}(i, z);
+ core::num i_d_z = i.{core::num::clamp}(d, z);
+ core::num i_x_z = i.{core::num::clamp}(x, z);
+ core::num i_y_z = i.{core::num::clamp}(y, z);
+ core::num i_z_z = i.{core::num::clamp}(z, z);
+ core::num d_n_n = d.{core::num::clamp}(n, n);
+ core::num d_i_n = d.{core::num::clamp}(i, n);
+ core::num d_d_n = d.{core::num::clamp}(d, n);
+ core::num d_x_n = d.{core::num::clamp}(x, n);
+ core::num d_y_n = d.{core::num::clamp}(y, n);
+ core::num d_z_n = d.{core::num::clamp}(z, n);
+ core::num d_n_i = d.{core::num::clamp}(n, i);
+ core::num d_i_i = d.{core::num::clamp}(i, i);
+ core::num d_d_i = d.{core::num::clamp}(d, i);
+ core::num d_x_i = d.{core::num::clamp}(x, i);
+ core::num d_y_i = d.{core::num::clamp}(y, i);
+ core::num d_z_i = d.{core::num::clamp}(z, i);
+ core::num d_n_d = d.{core::num::clamp}(n, d);
+ core::num d_i_d = d.{core::num::clamp}(i, d);
+ core::double d_d_d = d.{core::num::clamp}(d, d);
+ core::num d_x_d = d.{core::num::clamp}(x, d);
+ core::num d_y_d = d.{core::num::clamp}(y, d);
+ core::double d_z_d = d.{core::num::clamp}(z, d);
+ core::num d_n_x = d.{core::num::clamp}(n, x);
+ core::num d_i_x = d.{core::num::clamp}(i, x);
+ core::num d_d_x = d.{core::num::clamp}(d, x);
+ core::num d_x_x = d.{core::num::clamp}(x, x);
+ core::num d_y_x = d.{core::num::clamp}(y, x);
+ core::num d_z_x = d.{core::num::clamp}(z, x);
+ core::num d_n_y = d.{core::num::clamp}(n, y);
+ core::num d_i_y = d.{core::num::clamp}(i, y);
+ core::num d_d_y = d.{core::num::clamp}(d, y);
+ core::num d_x_y = d.{core::num::clamp}(x, y);
+ core::num d_y_y = d.{core::num::clamp}(y, y);
+ core::num d_z_y = d.{core::num::clamp}(z, y);
+ core::num d_n_z = d.{core::num::clamp}(n, z);
+ core::num d_i_z = d.{core::num::clamp}(i, z);
+ core::double d_d_z = d.{core::num::clamp}(d, z);
+ core::num d_x_z = d.{core::num::clamp}(x, z);
+ core::num d_y_z = d.{core::num::clamp}(y, z);
+ core::double d_z_z = d.{core::num::clamp}(z, z);
+ core::num x_n_n = x.{core::num::clamp}(n, n);
+ core::num x_i_n = x.{core::num::clamp}(i, n);
+ core::num x_d_n = x.{core::num::clamp}(d, n);
+ core::num x_x_n = x.{core::num::clamp}(x, n);
+ core::num x_y_n = x.{core::num::clamp}(y, n);
+ core::num x_z_n = x.{core::num::clamp}(z, n);
+ core::num x_n_i = x.{core::num::clamp}(n, i);
+ core::num x_i_i = x.{core::num::clamp}(i, i);
+ core::num x_d_i = x.{core::num::clamp}(d, i);
+ core::num x_x_i = x.{core::num::clamp}(x, i);
+ core::num x_y_i = x.{core::num::clamp}(y, i);
+ core::num x_z_i = x.{core::num::clamp}(z, i);
+ core::num x_n_d = x.{core::num::clamp}(n, d);
+ core::num x_i_d = x.{core::num::clamp}(i, d);
+ core::num x_d_d = x.{core::num::clamp}(d, d);
+ core::num x_x_d = x.{core::num::clamp}(x, d);
+ core::num x_y_d = x.{core::num::clamp}(y, d);
+ core::num x_z_d = x.{core::num::clamp}(z, d);
+ core::num x_n_x = x.{core::num::clamp}(n, x);
+ core::num x_i_x = x.{core::num::clamp}(i, x);
+ core::num x_d_x = x.{core::num::clamp}(d, x);
+ core::num x_x_x = x.{core::num::clamp}(x, x);
+ core::num x_y_x = x.{core::num::clamp}(y, x);
+ core::num x_z_x = x.{core::num::clamp}(z, x);
+ core::num x_n_y = x.{core::num::clamp}(n, y);
+ core::num x_i_y = x.{core::num::clamp}(i, y);
+ core::num x_d_y = x.{core::num::clamp}(d, y);
+ core::num x_x_y = x.{core::num::clamp}(x, y);
+ core::num x_y_y = x.{core::num::clamp}(y, y);
+ core::num x_z_y = x.{core::num::clamp}(z, y);
+ core::num x_n_z = x.{core::num::clamp}(n, z);
+ core::num x_i_z = x.{core::num::clamp}(i, z);
+ core::num x_d_z = x.{core::num::clamp}(d, z);
+ core::num x_x_z = x.{core::num::clamp}(x, z);
+ core::num x_y_z = x.{core::num::clamp}(y, z);
+ core::num x_z_z = x.{core::num::clamp}(z, z);
+ core::num y_n_n = y.{core::num::clamp}(n, n);
+ core::num y_i_n = y.{core::num::clamp}(i, n);
+ core::num y_d_n = y.{core::num::clamp}(d, n);
+ core::num y_x_n = y.{core::num::clamp}(x, n);
+ core::num y_y_n = y.{core::num::clamp}(y, n);
+ core::num y_z_n = y.{core::num::clamp}(z, n);
+ core::num y_n_i = y.{core::num::clamp}(n, i);
+ core::int y_i_i = y.{core::num::clamp}(i, i);
+ core::num y_d_i = y.{core::num::clamp}(d, i);
+ core::num y_x_i = y.{core::num::clamp}(x, i);
+ core::int y_y_i = y.{core::num::clamp}(y, i);
+ core::num y_z_i = y.{core::num::clamp}(z, i);
+ core::num y_n_d = y.{core::num::clamp}(n, d);
+ core::num y_i_d = y.{core::num::clamp}(i, d);
+ core::num y_d_d = y.{core::num::clamp}(d, d);
+ core::num y_x_d = y.{core::num::clamp}(x, d);
+ core::num y_y_d = y.{core::num::clamp}(y, d);
+ core::num y_z_d = y.{core::num::clamp}(z, d);
+ core::num y_n_x = y.{core::num::clamp}(n, x);
+ core::num y_i_x = y.{core::num::clamp}(i, x);
+ core::num y_d_x = y.{core::num::clamp}(d, x);
+ core::num y_x_x = y.{core::num::clamp}(x, x);
+ core::num y_y_x = y.{core::num::clamp}(y, x);
+ core::num y_z_x = y.{core::num::clamp}(z, x);
+ core::num y_n_y = y.{core::num::clamp}(n, y);
+ core::int y_i_y = y.{core::num::clamp}(i, y);
+ core::num y_d_y = y.{core::num::clamp}(d, y);
+ core::num y_x_y = y.{core::num::clamp}(x, y);
+ core::int y_y_y = y.{core::num::clamp}(y, y);
+ core::num y_z_y = y.{core::num::clamp}(z, y);
+ core::num y_n_z = y.{core::num::clamp}(n, z);
+ core::num y_i_z = y.{core::num::clamp}(i, z);
+ core::num y_d_z = y.{core::num::clamp}(d, z);
+ core::num y_x_z = y.{core::num::clamp}(x, z);
+ core::num y_y_z = y.{core::num::clamp}(y, z);
+ core::num y_z_z = y.{core::num::clamp}(z, z);
+ core::num z_n_n = z.{core::num::clamp}(n, n);
+ core::num z_i_n = z.{core::num::clamp}(i, n);
+ core::num z_d_n = z.{core::num::clamp}(d, n);
+ core::num z_x_n = z.{core::num::clamp}(x, n);
+ core::num z_y_n = z.{core::num::clamp}(y, n);
+ core::num z_z_n = z.{core::num::clamp}(z, n);
+ core::num z_n_i = z.{core::num::clamp}(n, i);
+ core::num z_i_i = z.{core::num::clamp}(i, i);
+ core::num z_d_i = z.{core::num::clamp}(d, i);
+ core::num z_x_i = z.{core::num::clamp}(x, i);
+ core::num z_y_i = z.{core::num::clamp}(y, i);
+ core::num z_z_i = z.{core::num::clamp}(z, i);
+ core::num z_n_d = z.{core::num::clamp}(n, d);
+ core::num z_i_d = z.{core::num::clamp}(i, d);
+ core::double z_d_d = z.{core::num::clamp}(d, d);
+ core::num z_x_d = z.{core::num::clamp}(x, d);
+ core::num z_y_d = z.{core::num::clamp}(y, d);
+ core::double z_z_d = z.{core::num::clamp}(z, d);
+ core::num z_n_x = z.{core::num::clamp}(n, x);
+ core::num z_i_x = z.{core::num::clamp}(i, x);
+ core::num z_d_x = z.{core::num::clamp}(d, x);
+ core::num z_x_x = z.{core::num::clamp}(x, x);
+ core::num z_y_x = z.{core::num::clamp}(y, x);
+ core::num z_z_x = z.{core::num::clamp}(z, x);
+ core::num z_n_y = z.{core::num::clamp}(n, y);
+ core::num z_i_y = z.{core::num::clamp}(i, y);
+ core::num z_d_y = z.{core::num::clamp}(d, y);
+ core::num z_x_y = z.{core::num::clamp}(x, y);
+ core::num z_y_y = z.{core::num::clamp}(y, y);
+ core::num z_z_y = z.{core::num::clamp}(z, y);
+ core::num z_n_z = z.{core::num::clamp}(n, z);
+ core::num z_i_z = z.{core::num::clamp}(i, z);
+ core::double z_d_z = z.{core::num::clamp}(d, z);
+ core::num z_x_z = z.{core::num::clamp}(x, z);
+ core::num z_y_z = z.{core::num::clamp}(y, z);
+ core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.strong.transformed.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(n);
+ core::num n_i = n.{core::num::+}(i);
+ core::double n_d = n.{core::num::+}(d);
+ core::num n_x = n.{core::num::+}(x);
+ core::num n_y = n.{core::num::+}(y);
+ core::double n_z = n.{core::num::+}(z);
+ core::num i_n = i.{core::num::+}(n);
+ core::int i_i = i.{core::num::+}(i);
+ core::double i_d = i.{core::num::+}(d);
+ core::num i_x = i.{core::num::+}(x);
+ core::int i_y = i.{core::num::+}(y);
+ core::double i_z = i.{core::num::+}(z);
+ core::double d_n = d.{core::double::+}(n);
+ core::double d_i = d.{core::double::+}(i);
+ core::double d_d = d.{core::double::+}(d);
+ core::double d_x = d.{core::double::+}(x);
+ core::double d_y = d.{core::double::+}(y);
+ core::double d_z = d.{core::double::+}(z);
+ core::num x_n = x.{core::num::+}(n);
+ core::num x_i = x.{core::num::+}(i);
+ core::double x_d = x.{core::num::+}(d);
+ core::num x_x = x.{core::num::+}(x);
+ core::num x_y = x.{core::num::+}(y);
+ core::double x_z = x.{core::num::+}(z);
+ core::num y_n = y.{core::num::+}(n);
+ core::int y_i = y.{core::num::+}(i);
+ core::double y_d = y.{core::num::+}(d);
+ core::num y_x = y.{core::num::+}(x);
+ core::int y_y = y.{core::num::+}(y);
+ core::double y_z = y.{core::num::+}(z);
+ core::double z_n = z.{core::double::+}(n);
+ core::double z_i = z.{core::double::+}(i);
+ core::double z_d = z.{core::double::+}(d);
+ core::double z_x = z.{core::double::+}(x);
+ core::double z_y = z.{core::double::+}(y);
+ core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(n);
+ core::num n_i = n.{core::num::-}(i);
+ core::double n_d = n.{core::num::-}(d);
+ core::num n_x = n.{core::num::-}(x);
+ core::num n_y = n.{core::num::-}(y);
+ core::double n_z = n.{core::num::-}(z);
+ core::num i_n = i.{core::num::-}(n);
+ core::int i_i = i.{core::num::-}(i);
+ core::double i_d = i.{core::num::-}(d);
+ core::num i_x = i.{core::num::-}(x);
+ core::int i_y = i.{core::num::-}(y);
+ core::double i_z = i.{core::num::-}(z);
+ core::double d_n = d.{core::double::-}(n);
+ core::double d_i = d.{core::double::-}(i);
+ core::double d_d = d.{core::double::-}(d);
+ core::double d_x = d.{core::double::-}(x);
+ core::double d_y = d.{core::double::-}(y);
+ core::double d_z = d.{core::double::-}(z);
+ core::num x_n = x.{core::num::-}(n);
+ core::num x_i = x.{core::num::-}(i);
+ core::double x_d = x.{core::num::-}(d);
+ core::num x_x = x.{core::num::-}(x);
+ core::num x_y = x.{core::num::-}(y);
+ core::double x_z = x.{core::num::-}(z);
+ core::num y_n = y.{core::num::-}(n);
+ core::int y_i = y.{core::num::-}(i);
+ core::double y_d = y.{core::num::-}(d);
+ core::num y_x = y.{core::num::-}(x);
+ core::int y_y = y.{core::num::-}(y);
+ core::double y_z = y.{core::num::-}(z);
+ core::double z_n = z.{core::double::-}(n);
+ core::double z_i = z.{core::double::-}(i);
+ core::double z_d = z.{core::double::-}(d);
+ core::double z_x = z.{core::double::-}(x);
+ core::double z_y = z.{core::double::-}(y);
+ core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(n);
+ core::num n_i = n.{core::num::*}(i);
+ core::double n_d = n.{core::num::*}(d);
+ core::num n_x = n.{core::num::*}(x);
+ core::num n_y = n.{core::num::*}(y);
+ core::double n_z = n.{core::num::*}(z);
+ core::num i_n = i.{core::num::*}(n);
+ core::int i_i = i.{core::num::*}(i);
+ core::double i_d = i.{core::num::*}(d);
+ core::num i_x = i.{core::num::*}(x);
+ core::int i_y = i.{core::num::*}(y);
+ core::double i_z = i.{core::num::*}(z);
+ core::double d_n = d.{core::double::*}(n);
+ core::double d_i = d.{core::double::*}(i);
+ core::double d_d = d.{core::double::*}(d);
+ core::double d_x = d.{core::double::*}(x);
+ core::double d_y = d.{core::double::*}(y);
+ core::double d_z = d.{core::double::*}(z);
+ core::num x_n = x.{core::num::*}(n);
+ core::num x_i = x.{core::num::*}(i);
+ core::double x_d = x.{core::num::*}(d);
+ core::num x_x = x.{core::num::*}(x);
+ core::num x_y = x.{core::num::*}(y);
+ core::double x_z = x.{core::num::*}(z);
+ core::num y_n = y.{core::num::*}(n);
+ core::int y_i = y.{core::num::*}(i);
+ core::double y_d = y.{core::num::*}(d);
+ core::num y_x = y.{core::num::*}(x);
+ core::int y_y = y.{core::num::*}(y);
+ core::double y_z = y.{core::num::*}(z);
+ core::double z_n = z.{core::double::*}(n);
+ core::double z_i = z.{core::double::*}(i);
+ core::double z_d = z.{core::double::*}(d);
+ core::double z_x = z.{core::double::*}(x);
+ core::double z_y = z.{core::double::*}(y);
+ core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(n);
+ core::num n_i = n.{core::num::%}(i);
+ core::double n_d = n.{core::num::%}(d);
+ core::num n_x = n.{core::num::%}(x);
+ core::num n_y = n.{core::num::%}(y);
+ core::double n_z = n.{core::num::%}(z);
+ core::num i_n = i.{core::num::%}(n);
+ core::int i_i = i.{core::num::%}(i);
+ core::double i_d = i.{core::num::%}(d);
+ core::num i_x = i.{core::num::%}(x);
+ core::int i_y = i.{core::num::%}(y);
+ core::double i_z = i.{core::num::%}(z);
+ core::double d_n = d.{core::double::%}(n);
+ core::double d_i = d.{core::double::%}(i);
+ core::double d_d = d.{core::double::%}(d);
+ core::double d_x = d.{core::double::%}(x);
+ core::double d_y = d.{core::double::%}(y);
+ core::double d_z = d.{core::double::%}(z);
+ core::num x_n = x.{core::num::%}(n);
+ core::num x_i = x.{core::num::%}(i);
+ core::double x_d = x.{core::num::%}(d);
+ core::num x_x = x.{core::num::%}(x);
+ core::num x_y = x.{core::num::%}(y);
+ core::double x_z = x.{core::num::%}(z);
+ core::num y_n = y.{core::num::%}(n);
+ core::int y_i = y.{core::num::%}(i);
+ core::double y_d = y.{core::num::%}(d);
+ core::num y_x = y.{core::num::%}(x);
+ core::int y_y = y.{core::num::%}(y);
+ core::double y_z = y.{core::num::%}(z);
+ core::double z_n = z.{core::double::%}(n);
+ core::double z_i = z.{core::double::%}(i);
+ core::double z_d = z.{core::double::%}(d);
+ core::double z_x = z.{core::double::%}(x);
+ core::double z_y = z.{core::double::%}(y);
+ core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(n);
+ core::num n_i = n.{core::num::remainder}(i);
+ core::double n_d = n.{core::num::remainder}(d);
+ core::num n_x = n.{core::num::remainder}(x);
+ core::num n_y = n.{core::num::remainder}(y);
+ core::double n_z = n.{core::num::remainder}(z);
+ core::num i_n = i.{core::num::remainder}(n);
+ core::int i_i = i.{core::num::remainder}(i);
+ core::double i_d = i.{core::num::remainder}(d);
+ core::num i_x = i.{core::num::remainder}(x);
+ core::int i_y = i.{core::num::remainder}(y);
+ core::double i_z = i.{core::num::remainder}(z);
+ core::double d_n = d.{core::double::remainder}(n);
+ core::double d_i = d.{core::double::remainder}(i);
+ core::double d_d = d.{core::double::remainder}(d);
+ core::double d_x = d.{core::double::remainder}(x);
+ core::double d_y = d.{core::double::remainder}(y);
+ core::double d_z = d.{core::double::remainder}(z);
+ core::num x_n = x.{core::num::remainder}(n);
+ core::num x_i = x.{core::num::remainder}(i);
+ core::double x_d = x.{core::num::remainder}(d);
+ core::num x_x = x.{core::num::remainder}(x);
+ core::num x_y = x.{core::num::remainder}(y);
+ core::double x_z = x.{core::num::remainder}(z);
+ core::num y_n = y.{core::num::remainder}(n);
+ core::int y_i = y.{core::num::remainder}(i);
+ core::double y_d = y.{core::num::remainder}(d);
+ core::num y_x = y.{core::num::remainder}(x);
+ core::int y_y = y.{core::num::remainder}(y);
+ core::double y_z = y.{core::num::remainder}(z);
+ core::double z_n = z.{core::double::remainder}(n);
+ core::double z_i = z.{core::double::remainder}(i);
+ core::double z_d = z.{core::double::remainder}(d);
+ core::double z_x = z.{core::double::remainder}(x);
+ core::double z_y = z.{core::double::remainder}(y);
+ core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n_n = n.{core::num::clamp}(n, n);
+ core::num n_i_n = n.{core::num::clamp}(i, n);
+ core::num n_d_n = n.{core::num::clamp}(d, n);
+ core::num n_x_n = n.{core::num::clamp}(x, n);
+ core::num n_y_n = n.{core::num::clamp}(y, n);
+ core::num n_z_n = n.{core::num::clamp}(z, n);
+ core::num n_n_i = n.{core::num::clamp}(n, i);
+ core::num n_i_i = n.{core::num::clamp}(i, i);
+ core::num n_d_i = n.{core::num::clamp}(d, i);
+ core::num n_x_i = n.{core::num::clamp}(x, i);
+ core::num n_y_i = n.{core::num::clamp}(y, i);
+ core::num n_z_i = n.{core::num::clamp}(z, i);
+ core::num n_n_d = n.{core::num::clamp}(n, d);
+ core::num n_i_d = n.{core::num::clamp}(i, d);
+ core::num n_d_d = n.{core::num::clamp}(d, d);
+ core::num n_x_d = n.{core::num::clamp}(x, d);
+ core::num n_y_d = n.{core::num::clamp}(y, d);
+ core::num n_z_d = n.{core::num::clamp}(z, d);
+ core::num n_n_x = n.{core::num::clamp}(n, x);
+ core::num n_i_x = n.{core::num::clamp}(i, x);
+ core::num n_d_x = n.{core::num::clamp}(d, x);
+ core::num n_x_x = n.{core::num::clamp}(x, x);
+ core::num n_y_x = n.{core::num::clamp}(y, x);
+ core::num n_z_x = n.{core::num::clamp}(z, x);
+ core::num n_n_y = n.{core::num::clamp}(n, y);
+ core::num n_i_y = n.{core::num::clamp}(i, y);
+ core::num n_d_y = n.{core::num::clamp}(d, y);
+ core::num n_x_y = n.{core::num::clamp}(x, y);
+ core::num n_y_y = n.{core::num::clamp}(y, y);
+ core::num n_z_y = n.{core::num::clamp}(z, y);
+ core::num n_n_z = n.{core::num::clamp}(n, z);
+ core::num n_i_z = n.{core::num::clamp}(i, z);
+ core::num n_d_z = n.{core::num::clamp}(d, z);
+ core::num n_x_z = n.{core::num::clamp}(x, z);
+ core::num n_y_z = n.{core::num::clamp}(y, z);
+ core::num n_z_z = n.{core::num::clamp}(z, z);
+ core::num i_n_n = i.{core::num::clamp}(n, n);
+ core::num i_i_n = i.{core::num::clamp}(i, n);
+ core::num i_d_n = i.{core::num::clamp}(d, n);
+ core::num i_x_n = i.{core::num::clamp}(x, n);
+ core::num i_y_n = i.{core::num::clamp}(y, n);
+ core::num i_z_n = i.{core::num::clamp}(z, n);
+ core::num i_n_i = i.{core::num::clamp}(n, i);
+ core::int i_i_i = i.{core::num::clamp}(i, i);
+ core::num i_d_i = i.{core::num::clamp}(d, i);
+ core::num i_x_i = i.{core::num::clamp}(x, i);
+ core::int i_y_i = i.{core::num::clamp}(y, i);
+ core::num i_z_i = i.{core::num::clamp}(z, i);
+ core::num i_n_d = i.{core::num::clamp}(n, d);
+ core::num i_i_d = i.{core::num::clamp}(i, d);
+ core::num i_d_d = i.{core::num::clamp}(d, d);
+ core::num i_x_d = i.{core::num::clamp}(x, d);
+ core::num i_y_d = i.{core::num::clamp}(y, d);
+ core::num i_z_d = i.{core::num::clamp}(z, d);
+ core::num i_n_x = i.{core::num::clamp}(n, x);
+ core::num i_i_x = i.{core::num::clamp}(i, x);
+ core::num i_d_x = i.{core::num::clamp}(d, x);
+ core::num i_x_x = i.{core::num::clamp}(x, x);
+ core::num i_y_x = i.{core::num::clamp}(y, x);
+ core::num i_z_x = i.{core::num::clamp}(z, x);
+ core::num i_n_y = i.{core::num::clamp}(n, y);
+ core::int i_i_y = i.{core::num::clamp}(i, y);
+ core::num i_d_y = i.{core::num::clamp}(d, y);
+ core::num i_x_y = i.{core::num::clamp}(x, y);
+ core::int i_y_y = i.{core::num::clamp}(y, y);
+ core::num i_z_y = i.{core::num::clamp}(z, y);
+ core::num i_n_z = i.{core::num::clamp}(n, z);
+ core::num i_i_z = i.{core::num::clamp}(i, z);
+ core::num i_d_z = i.{core::num::clamp}(d, z);
+ core::num i_x_z = i.{core::num::clamp}(x, z);
+ core::num i_y_z = i.{core::num::clamp}(y, z);
+ core::num i_z_z = i.{core::num::clamp}(z, z);
+ core::num d_n_n = d.{core::num::clamp}(n, n);
+ core::num d_i_n = d.{core::num::clamp}(i, n);
+ core::num d_d_n = d.{core::num::clamp}(d, n);
+ core::num d_x_n = d.{core::num::clamp}(x, n);
+ core::num d_y_n = d.{core::num::clamp}(y, n);
+ core::num d_z_n = d.{core::num::clamp}(z, n);
+ core::num d_n_i = d.{core::num::clamp}(n, i);
+ core::num d_i_i = d.{core::num::clamp}(i, i);
+ core::num d_d_i = d.{core::num::clamp}(d, i);
+ core::num d_x_i = d.{core::num::clamp}(x, i);
+ core::num d_y_i = d.{core::num::clamp}(y, i);
+ core::num d_z_i = d.{core::num::clamp}(z, i);
+ core::num d_n_d = d.{core::num::clamp}(n, d);
+ core::num d_i_d = d.{core::num::clamp}(i, d);
+ core::double d_d_d = d.{core::num::clamp}(d, d);
+ core::num d_x_d = d.{core::num::clamp}(x, d);
+ core::num d_y_d = d.{core::num::clamp}(y, d);
+ core::double d_z_d = d.{core::num::clamp}(z, d);
+ core::num d_n_x = d.{core::num::clamp}(n, x);
+ core::num d_i_x = d.{core::num::clamp}(i, x);
+ core::num d_d_x = d.{core::num::clamp}(d, x);
+ core::num d_x_x = d.{core::num::clamp}(x, x);
+ core::num d_y_x = d.{core::num::clamp}(y, x);
+ core::num d_z_x = d.{core::num::clamp}(z, x);
+ core::num d_n_y = d.{core::num::clamp}(n, y);
+ core::num d_i_y = d.{core::num::clamp}(i, y);
+ core::num d_d_y = d.{core::num::clamp}(d, y);
+ core::num d_x_y = d.{core::num::clamp}(x, y);
+ core::num d_y_y = d.{core::num::clamp}(y, y);
+ core::num d_z_y = d.{core::num::clamp}(z, y);
+ core::num d_n_z = d.{core::num::clamp}(n, z);
+ core::num d_i_z = d.{core::num::clamp}(i, z);
+ core::double d_d_z = d.{core::num::clamp}(d, z);
+ core::num d_x_z = d.{core::num::clamp}(x, z);
+ core::num d_y_z = d.{core::num::clamp}(y, z);
+ core::double d_z_z = d.{core::num::clamp}(z, z);
+ core::num x_n_n = x.{core::num::clamp}(n, n);
+ core::num x_i_n = x.{core::num::clamp}(i, n);
+ core::num x_d_n = x.{core::num::clamp}(d, n);
+ core::num x_x_n = x.{core::num::clamp}(x, n);
+ core::num x_y_n = x.{core::num::clamp}(y, n);
+ core::num x_z_n = x.{core::num::clamp}(z, n);
+ core::num x_n_i = x.{core::num::clamp}(n, i);
+ core::num x_i_i = x.{core::num::clamp}(i, i);
+ core::num x_d_i = x.{core::num::clamp}(d, i);
+ core::num x_x_i = x.{core::num::clamp}(x, i);
+ core::num x_y_i = x.{core::num::clamp}(y, i);
+ core::num x_z_i = x.{core::num::clamp}(z, i);
+ core::num x_n_d = x.{core::num::clamp}(n, d);
+ core::num x_i_d = x.{core::num::clamp}(i, d);
+ core::num x_d_d = x.{core::num::clamp}(d, d);
+ core::num x_x_d = x.{core::num::clamp}(x, d);
+ core::num x_y_d = x.{core::num::clamp}(y, d);
+ core::num x_z_d = x.{core::num::clamp}(z, d);
+ core::num x_n_x = x.{core::num::clamp}(n, x);
+ core::num x_i_x = x.{core::num::clamp}(i, x);
+ core::num x_d_x = x.{core::num::clamp}(d, x);
+ core::num x_x_x = x.{core::num::clamp}(x, x);
+ core::num x_y_x = x.{core::num::clamp}(y, x);
+ core::num x_z_x = x.{core::num::clamp}(z, x);
+ core::num x_n_y = x.{core::num::clamp}(n, y);
+ core::num x_i_y = x.{core::num::clamp}(i, y);
+ core::num x_d_y = x.{core::num::clamp}(d, y);
+ core::num x_x_y = x.{core::num::clamp}(x, y);
+ core::num x_y_y = x.{core::num::clamp}(y, y);
+ core::num x_z_y = x.{core::num::clamp}(z, y);
+ core::num x_n_z = x.{core::num::clamp}(n, z);
+ core::num x_i_z = x.{core::num::clamp}(i, z);
+ core::num x_d_z = x.{core::num::clamp}(d, z);
+ core::num x_x_z = x.{core::num::clamp}(x, z);
+ core::num x_y_z = x.{core::num::clamp}(y, z);
+ core::num x_z_z = x.{core::num::clamp}(z, z);
+ core::num y_n_n = y.{core::num::clamp}(n, n);
+ core::num y_i_n = y.{core::num::clamp}(i, n);
+ core::num y_d_n = y.{core::num::clamp}(d, n);
+ core::num y_x_n = y.{core::num::clamp}(x, n);
+ core::num y_y_n = y.{core::num::clamp}(y, n);
+ core::num y_z_n = y.{core::num::clamp}(z, n);
+ core::num y_n_i = y.{core::num::clamp}(n, i);
+ core::int y_i_i = y.{core::num::clamp}(i, i);
+ core::num y_d_i = y.{core::num::clamp}(d, i);
+ core::num y_x_i = y.{core::num::clamp}(x, i);
+ core::int y_y_i = y.{core::num::clamp}(y, i);
+ core::num y_z_i = y.{core::num::clamp}(z, i);
+ core::num y_n_d = y.{core::num::clamp}(n, d);
+ core::num y_i_d = y.{core::num::clamp}(i, d);
+ core::num y_d_d = y.{core::num::clamp}(d, d);
+ core::num y_x_d = y.{core::num::clamp}(x, d);
+ core::num y_y_d = y.{core::num::clamp}(y, d);
+ core::num y_z_d = y.{core::num::clamp}(z, d);
+ core::num y_n_x = y.{core::num::clamp}(n, x);
+ core::num y_i_x = y.{core::num::clamp}(i, x);
+ core::num y_d_x = y.{core::num::clamp}(d, x);
+ core::num y_x_x = y.{core::num::clamp}(x, x);
+ core::num y_y_x = y.{core::num::clamp}(y, x);
+ core::num y_z_x = y.{core::num::clamp}(z, x);
+ core::num y_n_y = y.{core::num::clamp}(n, y);
+ core::int y_i_y = y.{core::num::clamp}(i, y);
+ core::num y_d_y = y.{core::num::clamp}(d, y);
+ core::num y_x_y = y.{core::num::clamp}(x, y);
+ core::int y_y_y = y.{core::num::clamp}(y, y);
+ core::num y_z_y = y.{core::num::clamp}(z, y);
+ core::num y_n_z = y.{core::num::clamp}(n, z);
+ core::num y_i_z = y.{core::num::clamp}(i, z);
+ core::num y_d_z = y.{core::num::clamp}(d, z);
+ core::num y_x_z = y.{core::num::clamp}(x, z);
+ core::num y_y_z = y.{core::num::clamp}(y, z);
+ core::num y_z_z = y.{core::num::clamp}(z, z);
+ core::num z_n_n = z.{core::num::clamp}(n, n);
+ core::num z_i_n = z.{core::num::clamp}(i, n);
+ core::num z_d_n = z.{core::num::clamp}(d, n);
+ core::num z_x_n = z.{core::num::clamp}(x, n);
+ core::num z_y_n = z.{core::num::clamp}(y, n);
+ core::num z_z_n = z.{core::num::clamp}(z, n);
+ core::num z_n_i = z.{core::num::clamp}(n, i);
+ core::num z_i_i = z.{core::num::clamp}(i, i);
+ core::num z_d_i = z.{core::num::clamp}(d, i);
+ core::num z_x_i = z.{core::num::clamp}(x, i);
+ core::num z_y_i = z.{core::num::clamp}(y, i);
+ core::num z_z_i = z.{core::num::clamp}(z, i);
+ core::num z_n_d = z.{core::num::clamp}(n, d);
+ core::num z_i_d = z.{core::num::clamp}(i, d);
+ core::double z_d_d = z.{core::num::clamp}(d, d);
+ core::num z_x_d = z.{core::num::clamp}(x, d);
+ core::num z_y_d = z.{core::num::clamp}(y, d);
+ core::double z_z_d = z.{core::num::clamp}(z, d);
+ core::num z_n_x = z.{core::num::clamp}(n, x);
+ core::num z_i_x = z.{core::num::clamp}(i, x);
+ core::num z_d_x = z.{core::num::clamp}(d, x);
+ core::num z_x_x = z.{core::num::clamp}(x, x);
+ core::num z_y_x = z.{core::num::clamp}(y, x);
+ core::num z_z_x = z.{core::num::clamp}(z, x);
+ core::num z_n_y = z.{core::num::clamp}(n, y);
+ core::num z_i_y = z.{core::num::clamp}(i, y);
+ core::num z_d_y = z.{core::num::clamp}(d, y);
+ core::num z_x_y = z.{core::num::clamp}(x, y);
+ core::num z_y_y = z.{core::num::clamp}(y, y);
+ core::num z_z_y = z.{core::num::clamp}(z, y);
+ core::num z_n_z = z.{core::num::clamp}(n, z);
+ core::num z_i_z = z.{core::num::clamp}(i, z);
+ core::double z_d_z = z.{core::num::clamp}(d, z);
+ core::num z_x_z = z.{core::num::clamp}(x, z);
+ core::num z_y_z = z.{core::num::clamp}(y, z);
+ core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect
new file mode 100644
index 0000000..f82bc4c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline.expect
@@ -0,0 +1,13 @@
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5a136a0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.textual_outline_modelled.expect
@@ -0,0 +1,13 @@
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+main() {}
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(n);
+ core::num n_i = n.{core::num::+}(i);
+ core::double n_d = n.{core::num::+}(d);
+ core::num n_x = n.{core::num::+}(x);
+ core::num n_y = n.{core::num::+}(y);
+ core::double n_z = n.{core::num::+}(z);
+ core::num i_n = i.{core::num::+}(n);
+ core::int i_i = i.{core::num::+}(i);
+ core::double i_d = i.{core::num::+}(d);
+ core::num i_x = i.{core::num::+}(x);
+ core::int i_y = i.{core::num::+}(y);
+ core::double i_z = i.{core::num::+}(z);
+ core::double d_n = d.{core::double::+}(n);
+ core::double d_i = d.{core::double::+}(i);
+ core::double d_d = d.{core::double::+}(d);
+ core::double d_x = d.{core::double::+}(x);
+ core::double d_y = d.{core::double::+}(y);
+ core::double d_z = d.{core::double::+}(z);
+ core::num x_n = x.{core::num::+}(n);
+ core::num x_i = x.{core::num::+}(i);
+ core::double x_d = x.{core::num::+}(d);
+ core::num x_x = x.{core::num::+}(x);
+ core::num x_y = x.{core::num::+}(y);
+ core::double x_z = x.{core::num::+}(z);
+ core::num y_n = y.{core::num::+}(n);
+ core::int y_i = y.{core::num::+}(i);
+ core::double y_d = y.{core::num::+}(d);
+ core::num y_x = y.{core::num::+}(x);
+ core::int y_y = y.{core::num::+}(y);
+ core::double y_z = y.{core::num::+}(z);
+ core::double z_n = z.{core::double::+}(n);
+ core::double z_i = z.{core::double::+}(i);
+ core::double z_d = z.{core::double::+}(d);
+ core::double z_x = z.{core::double::+}(x);
+ core::double z_y = z.{core::double::+}(y);
+ core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(n);
+ core::num n_i = n.{core::num::-}(i);
+ core::double n_d = n.{core::num::-}(d);
+ core::num n_x = n.{core::num::-}(x);
+ core::num n_y = n.{core::num::-}(y);
+ core::double n_z = n.{core::num::-}(z);
+ core::num i_n = i.{core::num::-}(n);
+ core::int i_i = i.{core::num::-}(i);
+ core::double i_d = i.{core::num::-}(d);
+ core::num i_x = i.{core::num::-}(x);
+ core::int i_y = i.{core::num::-}(y);
+ core::double i_z = i.{core::num::-}(z);
+ core::double d_n = d.{core::double::-}(n);
+ core::double d_i = d.{core::double::-}(i);
+ core::double d_d = d.{core::double::-}(d);
+ core::double d_x = d.{core::double::-}(x);
+ core::double d_y = d.{core::double::-}(y);
+ core::double d_z = d.{core::double::-}(z);
+ core::num x_n = x.{core::num::-}(n);
+ core::num x_i = x.{core::num::-}(i);
+ core::double x_d = x.{core::num::-}(d);
+ core::num x_x = x.{core::num::-}(x);
+ core::num x_y = x.{core::num::-}(y);
+ core::double x_z = x.{core::num::-}(z);
+ core::num y_n = y.{core::num::-}(n);
+ core::int y_i = y.{core::num::-}(i);
+ core::double y_d = y.{core::num::-}(d);
+ core::num y_x = y.{core::num::-}(x);
+ core::int y_y = y.{core::num::-}(y);
+ core::double y_z = y.{core::num::-}(z);
+ core::double z_n = z.{core::double::-}(n);
+ core::double z_i = z.{core::double::-}(i);
+ core::double z_d = z.{core::double::-}(d);
+ core::double z_x = z.{core::double::-}(x);
+ core::double z_y = z.{core::double::-}(y);
+ core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(n);
+ core::num n_i = n.{core::num::*}(i);
+ core::double n_d = n.{core::num::*}(d);
+ core::num n_x = n.{core::num::*}(x);
+ core::num n_y = n.{core::num::*}(y);
+ core::double n_z = n.{core::num::*}(z);
+ core::num i_n = i.{core::num::*}(n);
+ core::int i_i = i.{core::num::*}(i);
+ core::double i_d = i.{core::num::*}(d);
+ core::num i_x = i.{core::num::*}(x);
+ core::int i_y = i.{core::num::*}(y);
+ core::double i_z = i.{core::num::*}(z);
+ core::double d_n = d.{core::double::*}(n);
+ core::double d_i = d.{core::double::*}(i);
+ core::double d_d = d.{core::double::*}(d);
+ core::double d_x = d.{core::double::*}(x);
+ core::double d_y = d.{core::double::*}(y);
+ core::double d_z = d.{core::double::*}(z);
+ core::num x_n = x.{core::num::*}(n);
+ core::num x_i = x.{core::num::*}(i);
+ core::double x_d = x.{core::num::*}(d);
+ core::num x_x = x.{core::num::*}(x);
+ core::num x_y = x.{core::num::*}(y);
+ core::double x_z = x.{core::num::*}(z);
+ core::num y_n = y.{core::num::*}(n);
+ core::int y_i = y.{core::num::*}(i);
+ core::double y_d = y.{core::num::*}(d);
+ core::num y_x = y.{core::num::*}(x);
+ core::int y_y = y.{core::num::*}(y);
+ core::double y_z = y.{core::num::*}(z);
+ core::double z_n = z.{core::double::*}(n);
+ core::double z_i = z.{core::double::*}(i);
+ core::double z_d = z.{core::double::*}(d);
+ core::double z_x = z.{core::double::*}(x);
+ core::double z_y = z.{core::double::*}(y);
+ core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(n);
+ core::num n_i = n.{core::num::%}(i);
+ core::double n_d = n.{core::num::%}(d);
+ core::num n_x = n.{core::num::%}(x);
+ core::num n_y = n.{core::num::%}(y);
+ core::double n_z = n.{core::num::%}(z);
+ core::num i_n = i.{core::num::%}(n);
+ core::int i_i = i.{core::num::%}(i);
+ core::double i_d = i.{core::num::%}(d);
+ core::num i_x = i.{core::num::%}(x);
+ core::int i_y = i.{core::num::%}(y);
+ core::double i_z = i.{core::num::%}(z);
+ core::double d_n = d.{core::double::%}(n);
+ core::double d_i = d.{core::double::%}(i);
+ core::double d_d = d.{core::double::%}(d);
+ core::double d_x = d.{core::double::%}(x);
+ core::double d_y = d.{core::double::%}(y);
+ core::double d_z = d.{core::double::%}(z);
+ core::num x_n = x.{core::num::%}(n);
+ core::num x_i = x.{core::num::%}(i);
+ core::double x_d = x.{core::num::%}(d);
+ core::num x_x = x.{core::num::%}(x);
+ core::num x_y = x.{core::num::%}(y);
+ core::double x_z = x.{core::num::%}(z);
+ core::num y_n = y.{core::num::%}(n);
+ core::int y_i = y.{core::num::%}(i);
+ core::double y_d = y.{core::num::%}(d);
+ core::num y_x = y.{core::num::%}(x);
+ core::int y_y = y.{core::num::%}(y);
+ core::double y_z = y.{core::num::%}(z);
+ core::double z_n = z.{core::double::%}(n);
+ core::double z_i = z.{core::double::%}(i);
+ core::double z_d = z.{core::double::%}(d);
+ core::double z_x = z.{core::double::%}(x);
+ core::double z_y = z.{core::double::%}(y);
+ core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(n);
+ core::num n_i = n.{core::num::remainder}(i);
+ core::double n_d = n.{core::num::remainder}(d);
+ core::num n_x = n.{core::num::remainder}(x);
+ core::num n_y = n.{core::num::remainder}(y);
+ core::double n_z = n.{core::num::remainder}(z);
+ core::num i_n = i.{core::num::remainder}(n);
+ core::int i_i = i.{core::num::remainder}(i);
+ core::double i_d = i.{core::num::remainder}(d);
+ core::num i_x = i.{core::num::remainder}(x);
+ core::int i_y = i.{core::num::remainder}(y);
+ core::double i_z = i.{core::num::remainder}(z);
+ core::double d_n = d.{core::double::remainder}(n);
+ core::double d_i = d.{core::double::remainder}(i);
+ core::double d_d = d.{core::double::remainder}(d);
+ core::double d_x = d.{core::double::remainder}(x);
+ core::double d_y = d.{core::double::remainder}(y);
+ core::double d_z = d.{core::double::remainder}(z);
+ core::num x_n = x.{core::num::remainder}(n);
+ core::num x_i = x.{core::num::remainder}(i);
+ core::double x_d = x.{core::num::remainder}(d);
+ core::num x_x = x.{core::num::remainder}(x);
+ core::num x_y = x.{core::num::remainder}(y);
+ core::double x_z = x.{core::num::remainder}(z);
+ core::num y_n = y.{core::num::remainder}(n);
+ core::int y_i = y.{core::num::remainder}(i);
+ core::double y_d = y.{core::num::remainder}(d);
+ core::num y_x = y.{core::num::remainder}(x);
+ core::int y_y = y.{core::num::remainder}(y);
+ core::double y_z = y.{core::num::remainder}(z);
+ core::double z_n = z.{core::double::remainder}(n);
+ core::double z_i = z.{core::double::remainder}(i);
+ core::double z_d = z.{core::double::remainder}(d);
+ core::double z_x = z.{core::double::remainder}(x);
+ core::double z_y = z.{core::double::remainder}(y);
+ core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n_n = n.{core::num::clamp}(n, n);
+ core::num n_i_n = n.{core::num::clamp}(i, n);
+ core::num n_d_n = n.{core::num::clamp}(d, n);
+ core::num n_x_n = n.{core::num::clamp}(x, n);
+ core::num n_y_n = n.{core::num::clamp}(y, n);
+ core::num n_z_n = n.{core::num::clamp}(z, n);
+ core::num n_n_i = n.{core::num::clamp}(n, i);
+ core::num n_i_i = n.{core::num::clamp}(i, i);
+ core::num n_d_i = n.{core::num::clamp}(d, i);
+ core::num n_x_i = n.{core::num::clamp}(x, i);
+ core::num n_y_i = n.{core::num::clamp}(y, i);
+ core::num n_z_i = n.{core::num::clamp}(z, i);
+ core::num n_n_d = n.{core::num::clamp}(n, d);
+ core::num n_i_d = n.{core::num::clamp}(i, d);
+ core::num n_d_d = n.{core::num::clamp}(d, d);
+ core::num n_x_d = n.{core::num::clamp}(x, d);
+ core::num n_y_d = n.{core::num::clamp}(y, d);
+ core::num n_z_d = n.{core::num::clamp}(z, d);
+ core::num n_n_x = n.{core::num::clamp}(n, x);
+ core::num n_i_x = n.{core::num::clamp}(i, x);
+ core::num n_d_x = n.{core::num::clamp}(d, x);
+ core::num n_x_x = n.{core::num::clamp}(x, x);
+ core::num n_y_x = n.{core::num::clamp}(y, x);
+ core::num n_z_x = n.{core::num::clamp}(z, x);
+ core::num n_n_y = n.{core::num::clamp}(n, y);
+ core::num n_i_y = n.{core::num::clamp}(i, y);
+ core::num n_d_y = n.{core::num::clamp}(d, y);
+ core::num n_x_y = n.{core::num::clamp}(x, y);
+ core::num n_y_y = n.{core::num::clamp}(y, y);
+ core::num n_z_y = n.{core::num::clamp}(z, y);
+ core::num n_n_z = n.{core::num::clamp}(n, z);
+ core::num n_i_z = n.{core::num::clamp}(i, z);
+ core::num n_d_z = n.{core::num::clamp}(d, z);
+ core::num n_x_z = n.{core::num::clamp}(x, z);
+ core::num n_y_z = n.{core::num::clamp}(y, z);
+ core::num n_z_z = n.{core::num::clamp}(z, z);
+ core::num i_n_n = i.{core::num::clamp}(n, n);
+ core::num i_i_n = i.{core::num::clamp}(i, n);
+ core::num i_d_n = i.{core::num::clamp}(d, n);
+ core::num i_x_n = i.{core::num::clamp}(x, n);
+ core::num i_y_n = i.{core::num::clamp}(y, n);
+ core::num i_z_n = i.{core::num::clamp}(z, n);
+ core::num i_n_i = i.{core::num::clamp}(n, i);
+ core::int i_i_i = i.{core::num::clamp}(i, i);
+ core::num i_d_i = i.{core::num::clamp}(d, i);
+ core::num i_x_i = i.{core::num::clamp}(x, i);
+ core::int i_y_i = i.{core::num::clamp}(y, i);
+ core::num i_z_i = i.{core::num::clamp}(z, i);
+ core::num i_n_d = i.{core::num::clamp}(n, d);
+ core::num i_i_d = i.{core::num::clamp}(i, d);
+ core::num i_d_d = i.{core::num::clamp}(d, d);
+ core::num i_x_d = i.{core::num::clamp}(x, d);
+ core::num i_y_d = i.{core::num::clamp}(y, d);
+ core::num i_z_d = i.{core::num::clamp}(z, d);
+ core::num i_n_x = i.{core::num::clamp}(n, x);
+ core::num i_i_x = i.{core::num::clamp}(i, x);
+ core::num i_d_x = i.{core::num::clamp}(d, x);
+ core::num i_x_x = i.{core::num::clamp}(x, x);
+ core::num i_y_x = i.{core::num::clamp}(y, x);
+ core::num i_z_x = i.{core::num::clamp}(z, x);
+ core::num i_n_y = i.{core::num::clamp}(n, y);
+ core::int i_i_y = i.{core::num::clamp}(i, y);
+ core::num i_d_y = i.{core::num::clamp}(d, y);
+ core::num i_x_y = i.{core::num::clamp}(x, y);
+ core::int i_y_y = i.{core::num::clamp}(y, y);
+ core::num i_z_y = i.{core::num::clamp}(z, y);
+ core::num i_n_z = i.{core::num::clamp}(n, z);
+ core::num i_i_z = i.{core::num::clamp}(i, z);
+ core::num i_d_z = i.{core::num::clamp}(d, z);
+ core::num i_x_z = i.{core::num::clamp}(x, z);
+ core::num i_y_z = i.{core::num::clamp}(y, z);
+ core::num i_z_z = i.{core::num::clamp}(z, z);
+ core::num d_n_n = d.{core::num::clamp}(n, n);
+ core::num d_i_n = d.{core::num::clamp}(i, n);
+ core::num d_d_n = d.{core::num::clamp}(d, n);
+ core::num d_x_n = d.{core::num::clamp}(x, n);
+ core::num d_y_n = d.{core::num::clamp}(y, n);
+ core::num d_z_n = d.{core::num::clamp}(z, n);
+ core::num d_n_i = d.{core::num::clamp}(n, i);
+ core::num d_i_i = d.{core::num::clamp}(i, i);
+ core::num d_d_i = d.{core::num::clamp}(d, i);
+ core::num d_x_i = d.{core::num::clamp}(x, i);
+ core::num d_y_i = d.{core::num::clamp}(y, i);
+ core::num d_z_i = d.{core::num::clamp}(z, i);
+ core::num d_n_d = d.{core::num::clamp}(n, d);
+ core::num d_i_d = d.{core::num::clamp}(i, d);
+ core::double d_d_d = d.{core::num::clamp}(d, d);
+ core::num d_x_d = d.{core::num::clamp}(x, d);
+ core::num d_y_d = d.{core::num::clamp}(y, d);
+ core::double d_z_d = d.{core::num::clamp}(z, d);
+ core::num d_n_x = d.{core::num::clamp}(n, x);
+ core::num d_i_x = d.{core::num::clamp}(i, x);
+ core::num d_d_x = d.{core::num::clamp}(d, x);
+ core::num d_x_x = d.{core::num::clamp}(x, x);
+ core::num d_y_x = d.{core::num::clamp}(y, x);
+ core::num d_z_x = d.{core::num::clamp}(z, x);
+ core::num d_n_y = d.{core::num::clamp}(n, y);
+ core::num d_i_y = d.{core::num::clamp}(i, y);
+ core::num d_d_y = d.{core::num::clamp}(d, y);
+ core::num d_x_y = d.{core::num::clamp}(x, y);
+ core::num d_y_y = d.{core::num::clamp}(y, y);
+ core::num d_z_y = d.{core::num::clamp}(z, y);
+ core::num d_n_z = d.{core::num::clamp}(n, z);
+ core::num d_i_z = d.{core::num::clamp}(i, z);
+ core::double d_d_z = d.{core::num::clamp}(d, z);
+ core::num d_x_z = d.{core::num::clamp}(x, z);
+ core::num d_y_z = d.{core::num::clamp}(y, z);
+ core::double d_z_z = d.{core::num::clamp}(z, z);
+ core::num x_n_n = x.{core::num::clamp}(n, n);
+ core::num x_i_n = x.{core::num::clamp}(i, n);
+ core::num x_d_n = x.{core::num::clamp}(d, n);
+ core::num x_x_n = x.{core::num::clamp}(x, n);
+ core::num x_y_n = x.{core::num::clamp}(y, n);
+ core::num x_z_n = x.{core::num::clamp}(z, n);
+ core::num x_n_i = x.{core::num::clamp}(n, i);
+ core::num x_i_i = x.{core::num::clamp}(i, i);
+ core::num x_d_i = x.{core::num::clamp}(d, i);
+ core::num x_x_i = x.{core::num::clamp}(x, i);
+ core::num x_y_i = x.{core::num::clamp}(y, i);
+ core::num x_z_i = x.{core::num::clamp}(z, i);
+ core::num x_n_d = x.{core::num::clamp}(n, d);
+ core::num x_i_d = x.{core::num::clamp}(i, d);
+ core::num x_d_d = x.{core::num::clamp}(d, d);
+ core::num x_x_d = x.{core::num::clamp}(x, d);
+ core::num x_y_d = x.{core::num::clamp}(y, d);
+ core::num x_z_d = x.{core::num::clamp}(z, d);
+ core::num x_n_x = x.{core::num::clamp}(n, x);
+ core::num x_i_x = x.{core::num::clamp}(i, x);
+ core::num x_d_x = x.{core::num::clamp}(d, x);
+ core::num x_x_x = x.{core::num::clamp}(x, x);
+ core::num x_y_x = x.{core::num::clamp}(y, x);
+ core::num x_z_x = x.{core::num::clamp}(z, x);
+ core::num x_n_y = x.{core::num::clamp}(n, y);
+ core::num x_i_y = x.{core::num::clamp}(i, y);
+ core::num x_d_y = x.{core::num::clamp}(d, y);
+ core::num x_x_y = x.{core::num::clamp}(x, y);
+ core::num x_y_y = x.{core::num::clamp}(y, y);
+ core::num x_z_y = x.{core::num::clamp}(z, y);
+ core::num x_n_z = x.{core::num::clamp}(n, z);
+ core::num x_i_z = x.{core::num::clamp}(i, z);
+ core::num x_d_z = x.{core::num::clamp}(d, z);
+ core::num x_x_z = x.{core::num::clamp}(x, z);
+ core::num x_y_z = x.{core::num::clamp}(y, z);
+ core::num x_z_z = x.{core::num::clamp}(z, z);
+ core::num y_n_n = y.{core::num::clamp}(n, n);
+ core::num y_i_n = y.{core::num::clamp}(i, n);
+ core::num y_d_n = y.{core::num::clamp}(d, n);
+ core::num y_x_n = y.{core::num::clamp}(x, n);
+ core::num y_y_n = y.{core::num::clamp}(y, n);
+ core::num y_z_n = y.{core::num::clamp}(z, n);
+ core::num y_n_i = y.{core::num::clamp}(n, i);
+ core::int y_i_i = y.{core::num::clamp}(i, i);
+ core::num y_d_i = y.{core::num::clamp}(d, i);
+ core::num y_x_i = y.{core::num::clamp}(x, i);
+ core::int y_y_i = y.{core::num::clamp}(y, i);
+ core::num y_z_i = y.{core::num::clamp}(z, i);
+ core::num y_n_d = y.{core::num::clamp}(n, d);
+ core::num y_i_d = y.{core::num::clamp}(i, d);
+ core::num y_d_d = y.{core::num::clamp}(d, d);
+ core::num y_x_d = y.{core::num::clamp}(x, d);
+ core::num y_y_d = y.{core::num::clamp}(y, d);
+ core::num y_z_d = y.{core::num::clamp}(z, d);
+ core::num y_n_x = y.{core::num::clamp}(n, x);
+ core::num y_i_x = y.{core::num::clamp}(i, x);
+ core::num y_d_x = y.{core::num::clamp}(d, x);
+ core::num y_x_x = y.{core::num::clamp}(x, x);
+ core::num y_y_x = y.{core::num::clamp}(y, x);
+ core::num y_z_x = y.{core::num::clamp}(z, x);
+ core::num y_n_y = y.{core::num::clamp}(n, y);
+ core::int y_i_y = y.{core::num::clamp}(i, y);
+ core::num y_d_y = y.{core::num::clamp}(d, y);
+ core::num y_x_y = y.{core::num::clamp}(x, y);
+ core::int y_y_y = y.{core::num::clamp}(y, y);
+ core::num y_z_y = y.{core::num::clamp}(z, y);
+ core::num y_n_z = y.{core::num::clamp}(n, z);
+ core::num y_i_z = y.{core::num::clamp}(i, z);
+ core::num y_d_z = y.{core::num::clamp}(d, z);
+ core::num y_x_z = y.{core::num::clamp}(x, z);
+ core::num y_y_z = y.{core::num::clamp}(y, z);
+ core::num y_z_z = y.{core::num::clamp}(z, z);
+ core::num z_n_n = z.{core::num::clamp}(n, n);
+ core::num z_i_n = z.{core::num::clamp}(i, n);
+ core::num z_d_n = z.{core::num::clamp}(d, n);
+ core::num z_x_n = z.{core::num::clamp}(x, n);
+ core::num z_y_n = z.{core::num::clamp}(y, n);
+ core::num z_z_n = z.{core::num::clamp}(z, n);
+ core::num z_n_i = z.{core::num::clamp}(n, i);
+ core::num z_i_i = z.{core::num::clamp}(i, i);
+ core::num z_d_i = z.{core::num::clamp}(d, i);
+ core::num z_x_i = z.{core::num::clamp}(x, i);
+ core::num z_y_i = z.{core::num::clamp}(y, i);
+ core::num z_z_i = z.{core::num::clamp}(z, i);
+ core::num z_n_d = z.{core::num::clamp}(n, d);
+ core::num z_i_d = z.{core::num::clamp}(i, d);
+ core::double z_d_d = z.{core::num::clamp}(d, d);
+ core::num z_x_d = z.{core::num::clamp}(x, d);
+ core::num z_y_d = z.{core::num::clamp}(y, d);
+ core::double z_z_d = z.{core::num::clamp}(z, d);
+ core::num z_n_x = z.{core::num::clamp}(n, x);
+ core::num z_i_x = z.{core::num::clamp}(i, x);
+ core::num z_d_x = z.{core::num::clamp}(d, x);
+ core::num z_x_x = z.{core::num::clamp}(x, x);
+ core::num z_y_x = z.{core::num::clamp}(y, x);
+ core::num z_z_x = z.{core::num::clamp}(z, x);
+ core::num z_n_y = z.{core::num::clamp}(n, y);
+ core::num z_i_y = z.{core::num::clamp}(i, y);
+ core::num z_d_y = z.{core::num::clamp}(d, y);
+ core::num z_x_y = z.{core::num::clamp}(x, y);
+ core::num z_y_y = z.{core::num::clamp}(y, y);
+ core::num z_z_y = z.{core::num::clamp}(z, y);
+ core::num z_n_z = z.{core::num::clamp}(n, z);
+ core::num z_i_z = z.{core::num::clamp}(i, z);
+ core::double z_d_z = z.{core::num::clamp}(d, z);
+ core::num z_x_z = z.{core::num::clamp}(x, z);
+ core::num z_y_z = z.{core::num::clamp}(y, z);
+ core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
new file mode 100644
index 0000000..c539802
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers.dart.weak.transformed.expect
@@ -0,0 +1,413 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(n);
+ core::num n_i = n.{core::num::+}(i);
+ core::double n_d = n.{core::num::+}(d);
+ core::num n_x = n.{core::num::+}(x);
+ core::num n_y = n.{core::num::+}(y);
+ core::double n_z = n.{core::num::+}(z);
+ core::num i_n = i.{core::num::+}(n);
+ core::int i_i = i.{core::num::+}(i);
+ core::double i_d = i.{core::num::+}(d);
+ core::num i_x = i.{core::num::+}(x);
+ core::int i_y = i.{core::num::+}(y);
+ core::double i_z = i.{core::num::+}(z);
+ core::double d_n = d.{core::double::+}(n);
+ core::double d_i = d.{core::double::+}(i);
+ core::double d_d = d.{core::double::+}(d);
+ core::double d_x = d.{core::double::+}(x);
+ core::double d_y = d.{core::double::+}(y);
+ core::double d_z = d.{core::double::+}(z);
+ core::num x_n = x.{core::num::+}(n);
+ core::num x_i = x.{core::num::+}(i);
+ core::double x_d = x.{core::num::+}(d);
+ core::num x_x = x.{core::num::+}(x);
+ core::num x_y = x.{core::num::+}(y);
+ core::double x_z = x.{core::num::+}(z);
+ core::num y_n = y.{core::num::+}(n);
+ core::int y_i = y.{core::num::+}(i);
+ core::double y_d = y.{core::num::+}(d);
+ core::num y_x = y.{core::num::+}(x);
+ core::int y_y = y.{core::num::+}(y);
+ core::double y_z = y.{core::num::+}(z);
+ core::double z_n = z.{core::double::+}(n);
+ core::double z_i = z.{core::double::+}(i);
+ core::double z_d = z.{core::double::+}(d);
+ core::double z_x = z.{core::double::+}(x);
+ core::double z_y = z.{core::double::+}(y);
+ core::double z_z = z.{core::double::+}(z);
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(n);
+ core::num n_i = n.{core::num::-}(i);
+ core::double n_d = n.{core::num::-}(d);
+ core::num n_x = n.{core::num::-}(x);
+ core::num n_y = n.{core::num::-}(y);
+ core::double n_z = n.{core::num::-}(z);
+ core::num i_n = i.{core::num::-}(n);
+ core::int i_i = i.{core::num::-}(i);
+ core::double i_d = i.{core::num::-}(d);
+ core::num i_x = i.{core::num::-}(x);
+ core::int i_y = i.{core::num::-}(y);
+ core::double i_z = i.{core::num::-}(z);
+ core::double d_n = d.{core::double::-}(n);
+ core::double d_i = d.{core::double::-}(i);
+ core::double d_d = d.{core::double::-}(d);
+ core::double d_x = d.{core::double::-}(x);
+ core::double d_y = d.{core::double::-}(y);
+ core::double d_z = d.{core::double::-}(z);
+ core::num x_n = x.{core::num::-}(n);
+ core::num x_i = x.{core::num::-}(i);
+ core::double x_d = x.{core::num::-}(d);
+ core::num x_x = x.{core::num::-}(x);
+ core::num x_y = x.{core::num::-}(y);
+ core::double x_z = x.{core::num::-}(z);
+ core::num y_n = y.{core::num::-}(n);
+ core::int y_i = y.{core::num::-}(i);
+ core::double y_d = y.{core::num::-}(d);
+ core::num y_x = y.{core::num::-}(x);
+ core::int y_y = y.{core::num::-}(y);
+ core::double y_z = y.{core::num::-}(z);
+ core::double z_n = z.{core::double::-}(n);
+ core::double z_i = z.{core::double::-}(i);
+ core::double z_d = z.{core::double::-}(d);
+ core::double z_x = z.{core::double::-}(x);
+ core::double z_y = z.{core::double::-}(y);
+ core::double z_z = z.{core::double::-}(z);
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(n);
+ core::num n_i = n.{core::num::*}(i);
+ core::double n_d = n.{core::num::*}(d);
+ core::num n_x = n.{core::num::*}(x);
+ core::num n_y = n.{core::num::*}(y);
+ core::double n_z = n.{core::num::*}(z);
+ core::num i_n = i.{core::num::*}(n);
+ core::int i_i = i.{core::num::*}(i);
+ core::double i_d = i.{core::num::*}(d);
+ core::num i_x = i.{core::num::*}(x);
+ core::int i_y = i.{core::num::*}(y);
+ core::double i_z = i.{core::num::*}(z);
+ core::double d_n = d.{core::double::*}(n);
+ core::double d_i = d.{core::double::*}(i);
+ core::double d_d = d.{core::double::*}(d);
+ core::double d_x = d.{core::double::*}(x);
+ core::double d_y = d.{core::double::*}(y);
+ core::double d_z = d.{core::double::*}(z);
+ core::num x_n = x.{core::num::*}(n);
+ core::num x_i = x.{core::num::*}(i);
+ core::double x_d = x.{core::num::*}(d);
+ core::num x_x = x.{core::num::*}(x);
+ core::num x_y = x.{core::num::*}(y);
+ core::double x_z = x.{core::num::*}(z);
+ core::num y_n = y.{core::num::*}(n);
+ core::int y_i = y.{core::num::*}(i);
+ core::double y_d = y.{core::num::*}(d);
+ core::num y_x = y.{core::num::*}(x);
+ core::int y_y = y.{core::num::*}(y);
+ core::double y_z = y.{core::num::*}(z);
+ core::double z_n = z.{core::double::*}(n);
+ core::double z_i = z.{core::double::*}(i);
+ core::double z_d = z.{core::double::*}(d);
+ core::double z_x = z.{core::double::*}(x);
+ core::double z_y = z.{core::double::*}(y);
+ core::double z_z = z.{core::double::*}(z);
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(n);
+ core::num n_i = n.{core::num::%}(i);
+ core::double n_d = n.{core::num::%}(d);
+ core::num n_x = n.{core::num::%}(x);
+ core::num n_y = n.{core::num::%}(y);
+ core::double n_z = n.{core::num::%}(z);
+ core::num i_n = i.{core::num::%}(n);
+ core::int i_i = i.{core::num::%}(i);
+ core::double i_d = i.{core::num::%}(d);
+ core::num i_x = i.{core::num::%}(x);
+ core::int i_y = i.{core::num::%}(y);
+ core::double i_z = i.{core::num::%}(z);
+ core::double d_n = d.{core::double::%}(n);
+ core::double d_i = d.{core::double::%}(i);
+ core::double d_d = d.{core::double::%}(d);
+ core::double d_x = d.{core::double::%}(x);
+ core::double d_y = d.{core::double::%}(y);
+ core::double d_z = d.{core::double::%}(z);
+ core::num x_n = x.{core::num::%}(n);
+ core::num x_i = x.{core::num::%}(i);
+ core::double x_d = x.{core::num::%}(d);
+ core::num x_x = x.{core::num::%}(x);
+ core::num x_y = x.{core::num::%}(y);
+ core::double x_z = x.{core::num::%}(z);
+ core::num y_n = y.{core::num::%}(n);
+ core::int y_i = y.{core::num::%}(i);
+ core::double y_d = y.{core::num::%}(d);
+ core::num y_x = y.{core::num::%}(x);
+ core::int y_y = y.{core::num::%}(y);
+ core::double y_z = y.{core::num::%}(z);
+ core::double z_n = z.{core::double::%}(n);
+ core::double z_i = z.{core::double::%}(i);
+ core::double z_d = z.{core::double::%}(d);
+ core::double z_x = z.{core::double::%}(x);
+ core::double z_y = z.{core::double::%}(y);
+ core::double z_z = z.{core::double::%}(z);
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(n);
+ core::num n_i = n.{core::num::remainder}(i);
+ core::double n_d = n.{core::num::remainder}(d);
+ core::num n_x = n.{core::num::remainder}(x);
+ core::num n_y = n.{core::num::remainder}(y);
+ core::double n_z = n.{core::num::remainder}(z);
+ core::num i_n = i.{core::num::remainder}(n);
+ core::int i_i = i.{core::num::remainder}(i);
+ core::double i_d = i.{core::num::remainder}(d);
+ core::num i_x = i.{core::num::remainder}(x);
+ core::int i_y = i.{core::num::remainder}(y);
+ core::double i_z = i.{core::num::remainder}(z);
+ core::double d_n = d.{core::double::remainder}(n);
+ core::double d_i = d.{core::double::remainder}(i);
+ core::double d_d = d.{core::double::remainder}(d);
+ core::double d_x = d.{core::double::remainder}(x);
+ core::double d_y = d.{core::double::remainder}(y);
+ core::double d_z = d.{core::double::remainder}(z);
+ core::num x_n = x.{core::num::remainder}(n);
+ core::num x_i = x.{core::num::remainder}(i);
+ core::double x_d = x.{core::num::remainder}(d);
+ core::num x_x = x.{core::num::remainder}(x);
+ core::num x_y = x.{core::num::remainder}(y);
+ core::double x_z = x.{core::num::remainder}(z);
+ core::num y_n = y.{core::num::remainder}(n);
+ core::int y_i = y.{core::num::remainder}(i);
+ core::double y_d = y.{core::num::remainder}(d);
+ core::num y_x = y.{core::num::remainder}(x);
+ core::int y_y = y.{core::num::remainder}(y);
+ core::double y_z = y.{core::num::remainder}(z);
+ core::double z_n = z.{core::double::remainder}(n);
+ core::double z_i = z.{core::double::remainder}(i);
+ core::double z_d = z.{core::double::remainder}(d);
+ core::double z_x = z.{core::double::remainder}(x);
+ core::double z_y = z.{core::double::remainder}(y);
+ core::double z_z = z.{core::double::remainder}(z);
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n_n = n.{core::num::clamp}(n, n);
+ core::num n_i_n = n.{core::num::clamp}(i, n);
+ core::num n_d_n = n.{core::num::clamp}(d, n);
+ core::num n_x_n = n.{core::num::clamp}(x, n);
+ core::num n_y_n = n.{core::num::clamp}(y, n);
+ core::num n_z_n = n.{core::num::clamp}(z, n);
+ core::num n_n_i = n.{core::num::clamp}(n, i);
+ core::num n_i_i = n.{core::num::clamp}(i, i);
+ core::num n_d_i = n.{core::num::clamp}(d, i);
+ core::num n_x_i = n.{core::num::clamp}(x, i);
+ core::num n_y_i = n.{core::num::clamp}(y, i);
+ core::num n_z_i = n.{core::num::clamp}(z, i);
+ core::num n_n_d = n.{core::num::clamp}(n, d);
+ core::num n_i_d = n.{core::num::clamp}(i, d);
+ core::num n_d_d = n.{core::num::clamp}(d, d);
+ core::num n_x_d = n.{core::num::clamp}(x, d);
+ core::num n_y_d = n.{core::num::clamp}(y, d);
+ core::num n_z_d = n.{core::num::clamp}(z, d);
+ core::num n_n_x = n.{core::num::clamp}(n, x);
+ core::num n_i_x = n.{core::num::clamp}(i, x);
+ core::num n_d_x = n.{core::num::clamp}(d, x);
+ core::num n_x_x = n.{core::num::clamp}(x, x);
+ core::num n_y_x = n.{core::num::clamp}(y, x);
+ core::num n_z_x = n.{core::num::clamp}(z, x);
+ core::num n_n_y = n.{core::num::clamp}(n, y);
+ core::num n_i_y = n.{core::num::clamp}(i, y);
+ core::num n_d_y = n.{core::num::clamp}(d, y);
+ core::num n_x_y = n.{core::num::clamp}(x, y);
+ core::num n_y_y = n.{core::num::clamp}(y, y);
+ core::num n_z_y = n.{core::num::clamp}(z, y);
+ core::num n_n_z = n.{core::num::clamp}(n, z);
+ core::num n_i_z = n.{core::num::clamp}(i, z);
+ core::num n_d_z = n.{core::num::clamp}(d, z);
+ core::num n_x_z = n.{core::num::clamp}(x, z);
+ core::num n_y_z = n.{core::num::clamp}(y, z);
+ core::num n_z_z = n.{core::num::clamp}(z, z);
+ core::num i_n_n = i.{core::num::clamp}(n, n);
+ core::num i_i_n = i.{core::num::clamp}(i, n);
+ core::num i_d_n = i.{core::num::clamp}(d, n);
+ core::num i_x_n = i.{core::num::clamp}(x, n);
+ core::num i_y_n = i.{core::num::clamp}(y, n);
+ core::num i_z_n = i.{core::num::clamp}(z, n);
+ core::num i_n_i = i.{core::num::clamp}(n, i);
+ core::int i_i_i = i.{core::num::clamp}(i, i);
+ core::num i_d_i = i.{core::num::clamp}(d, i);
+ core::num i_x_i = i.{core::num::clamp}(x, i);
+ core::int i_y_i = i.{core::num::clamp}(y, i);
+ core::num i_z_i = i.{core::num::clamp}(z, i);
+ core::num i_n_d = i.{core::num::clamp}(n, d);
+ core::num i_i_d = i.{core::num::clamp}(i, d);
+ core::num i_d_d = i.{core::num::clamp}(d, d);
+ core::num i_x_d = i.{core::num::clamp}(x, d);
+ core::num i_y_d = i.{core::num::clamp}(y, d);
+ core::num i_z_d = i.{core::num::clamp}(z, d);
+ core::num i_n_x = i.{core::num::clamp}(n, x);
+ core::num i_i_x = i.{core::num::clamp}(i, x);
+ core::num i_d_x = i.{core::num::clamp}(d, x);
+ core::num i_x_x = i.{core::num::clamp}(x, x);
+ core::num i_y_x = i.{core::num::clamp}(y, x);
+ core::num i_z_x = i.{core::num::clamp}(z, x);
+ core::num i_n_y = i.{core::num::clamp}(n, y);
+ core::int i_i_y = i.{core::num::clamp}(i, y);
+ core::num i_d_y = i.{core::num::clamp}(d, y);
+ core::num i_x_y = i.{core::num::clamp}(x, y);
+ core::int i_y_y = i.{core::num::clamp}(y, y);
+ core::num i_z_y = i.{core::num::clamp}(z, y);
+ core::num i_n_z = i.{core::num::clamp}(n, z);
+ core::num i_i_z = i.{core::num::clamp}(i, z);
+ core::num i_d_z = i.{core::num::clamp}(d, z);
+ core::num i_x_z = i.{core::num::clamp}(x, z);
+ core::num i_y_z = i.{core::num::clamp}(y, z);
+ core::num i_z_z = i.{core::num::clamp}(z, z);
+ core::num d_n_n = d.{core::num::clamp}(n, n);
+ core::num d_i_n = d.{core::num::clamp}(i, n);
+ core::num d_d_n = d.{core::num::clamp}(d, n);
+ core::num d_x_n = d.{core::num::clamp}(x, n);
+ core::num d_y_n = d.{core::num::clamp}(y, n);
+ core::num d_z_n = d.{core::num::clamp}(z, n);
+ core::num d_n_i = d.{core::num::clamp}(n, i);
+ core::num d_i_i = d.{core::num::clamp}(i, i);
+ core::num d_d_i = d.{core::num::clamp}(d, i);
+ core::num d_x_i = d.{core::num::clamp}(x, i);
+ core::num d_y_i = d.{core::num::clamp}(y, i);
+ core::num d_z_i = d.{core::num::clamp}(z, i);
+ core::num d_n_d = d.{core::num::clamp}(n, d);
+ core::num d_i_d = d.{core::num::clamp}(i, d);
+ core::double d_d_d = d.{core::num::clamp}(d, d);
+ core::num d_x_d = d.{core::num::clamp}(x, d);
+ core::num d_y_d = d.{core::num::clamp}(y, d);
+ core::double d_z_d = d.{core::num::clamp}(z, d);
+ core::num d_n_x = d.{core::num::clamp}(n, x);
+ core::num d_i_x = d.{core::num::clamp}(i, x);
+ core::num d_d_x = d.{core::num::clamp}(d, x);
+ core::num d_x_x = d.{core::num::clamp}(x, x);
+ core::num d_y_x = d.{core::num::clamp}(y, x);
+ core::num d_z_x = d.{core::num::clamp}(z, x);
+ core::num d_n_y = d.{core::num::clamp}(n, y);
+ core::num d_i_y = d.{core::num::clamp}(i, y);
+ core::num d_d_y = d.{core::num::clamp}(d, y);
+ core::num d_x_y = d.{core::num::clamp}(x, y);
+ core::num d_y_y = d.{core::num::clamp}(y, y);
+ core::num d_z_y = d.{core::num::clamp}(z, y);
+ core::num d_n_z = d.{core::num::clamp}(n, z);
+ core::num d_i_z = d.{core::num::clamp}(i, z);
+ core::double d_d_z = d.{core::num::clamp}(d, z);
+ core::num d_x_z = d.{core::num::clamp}(x, z);
+ core::num d_y_z = d.{core::num::clamp}(y, z);
+ core::double d_z_z = d.{core::num::clamp}(z, z);
+ core::num x_n_n = x.{core::num::clamp}(n, n);
+ core::num x_i_n = x.{core::num::clamp}(i, n);
+ core::num x_d_n = x.{core::num::clamp}(d, n);
+ core::num x_x_n = x.{core::num::clamp}(x, n);
+ core::num x_y_n = x.{core::num::clamp}(y, n);
+ core::num x_z_n = x.{core::num::clamp}(z, n);
+ core::num x_n_i = x.{core::num::clamp}(n, i);
+ core::num x_i_i = x.{core::num::clamp}(i, i);
+ core::num x_d_i = x.{core::num::clamp}(d, i);
+ core::num x_x_i = x.{core::num::clamp}(x, i);
+ core::num x_y_i = x.{core::num::clamp}(y, i);
+ core::num x_z_i = x.{core::num::clamp}(z, i);
+ core::num x_n_d = x.{core::num::clamp}(n, d);
+ core::num x_i_d = x.{core::num::clamp}(i, d);
+ core::num x_d_d = x.{core::num::clamp}(d, d);
+ core::num x_x_d = x.{core::num::clamp}(x, d);
+ core::num x_y_d = x.{core::num::clamp}(y, d);
+ core::num x_z_d = x.{core::num::clamp}(z, d);
+ core::num x_n_x = x.{core::num::clamp}(n, x);
+ core::num x_i_x = x.{core::num::clamp}(i, x);
+ core::num x_d_x = x.{core::num::clamp}(d, x);
+ core::num x_x_x = x.{core::num::clamp}(x, x);
+ core::num x_y_x = x.{core::num::clamp}(y, x);
+ core::num x_z_x = x.{core::num::clamp}(z, x);
+ core::num x_n_y = x.{core::num::clamp}(n, y);
+ core::num x_i_y = x.{core::num::clamp}(i, y);
+ core::num x_d_y = x.{core::num::clamp}(d, y);
+ core::num x_x_y = x.{core::num::clamp}(x, y);
+ core::num x_y_y = x.{core::num::clamp}(y, y);
+ core::num x_z_y = x.{core::num::clamp}(z, y);
+ core::num x_n_z = x.{core::num::clamp}(n, z);
+ core::num x_i_z = x.{core::num::clamp}(i, z);
+ core::num x_d_z = x.{core::num::clamp}(d, z);
+ core::num x_x_z = x.{core::num::clamp}(x, z);
+ core::num x_y_z = x.{core::num::clamp}(y, z);
+ core::num x_z_z = x.{core::num::clamp}(z, z);
+ core::num y_n_n = y.{core::num::clamp}(n, n);
+ core::num y_i_n = y.{core::num::clamp}(i, n);
+ core::num y_d_n = y.{core::num::clamp}(d, n);
+ core::num y_x_n = y.{core::num::clamp}(x, n);
+ core::num y_y_n = y.{core::num::clamp}(y, n);
+ core::num y_z_n = y.{core::num::clamp}(z, n);
+ core::num y_n_i = y.{core::num::clamp}(n, i);
+ core::int y_i_i = y.{core::num::clamp}(i, i);
+ core::num y_d_i = y.{core::num::clamp}(d, i);
+ core::num y_x_i = y.{core::num::clamp}(x, i);
+ core::int y_y_i = y.{core::num::clamp}(y, i);
+ core::num y_z_i = y.{core::num::clamp}(z, i);
+ core::num y_n_d = y.{core::num::clamp}(n, d);
+ core::num y_i_d = y.{core::num::clamp}(i, d);
+ core::num y_d_d = y.{core::num::clamp}(d, d);
+ core::num y_x_d = y.{core::num::clamp}(x, d);
+ core::num y_y_d = y.{core::num::clamp}(y, d);
+ core::num y_z_d = y.{core::num::clamp}(z, d);
+ core::num y_n_x = y.{core::num::clamp}(n, x);
+ core::num y_i_x = y.{core::num::clamp}(i, x);
+ core::num y_d_x = y.{core::num::clamp}(d, x);
+ core::num y_x_x = y.{core::num::clamp}(x, x);
+ core::num y_y_x = y.{core::num::clamp}(y, x);
+ core::num y_z_x = y.{core::num::clamp}(z, x);
+ core::num y_n_y = y.{core::num::clamp}(n, y);
+ core::int y_i_y = y.{core::num::clamp}(i, y);
+ core::num y_d_y = y.{core::num::clamp}(d, y);
+ core::num y_x_y = y.{core::num::clamp}(x, y);
+ core::int y_y_y = y.{core::num::clamp}(y, y);
+ core::num y_z_y = y.{core::num::clamp}(z, y);
+ core::num y_n_z = y.{core::num::clamp}(n, z);
+ core::num y_i_z = y.{core::num::clamp}(i, z);
+ core::num y_d_z = y.{core::num::clamp}(d, z);
+ core::num y_x_z = y.{core::num::clamp}(x, z);
+ core::num y_y_z = y.{core::num::clamp}(y, z);
+ core::num y_z_z = y.{core::num::clamp}(z, z);
+ core::num z_n_n = z.{core::num::clamp}(n, n);
+ core::num z_i_n = z.{core::num::clamp}(i, n);
+ core::num z_d_n = z.{core::num::clamp}(d, n);
+ core::num z_x_n = z.{core::num::clamp}(x, n);
+ core::num z_y_n = z.{core::num::clamp}(y, n);
+ core::num z_z_n = z.{core::num::clamp}(z, n);
+ core::num z_n_i = z.{core::num::clamp}(n, i);
+ core::num z_i_i = z.{core::num::clamp}(i, i);
+ core::num z_d_i = z.{core::num::clamp}(d, i);
+ core::num z_x_i = z.{core::num::clamp}(x, i);
+ core::num z_y_i = z.{core::num::clamp}(y, i);
+ core::num z_z_i = z.{core::num::clamp}(z, i);
+ core::num z_n_d = z.{core::num::clamp}(n, d);
+ core::num z_i_d = z.{core::num::clamp}(i, d);
+ core::double z_d_d = z.{core::num::clamp}(d, d);
+ core::num z_x_d = z.{core::num::clamp}(x, d);
+ core::num z_y_d = z.{core::num::clamp}(y, d);
+ core::double z_z_d = z.{core::num::clamp}(z, d);
+ core::num z_n_x = z.{core::num::clamp}(n, x);
+ core::num z_i_x = z.{core::num::clamp}(i, x);
+ core::num z_d_x = z.{core::num::clamp}(d, x);
+ core::num z_x_x = z.{core::num::clamp}(x, x);
+ core::num z_y_x = z.{core::num::clamp}(y, x);
+ core::num z_z_x = z.{core::num::clamp}(z, x);
+ core::num z_n_y = z.{core::num::clamp}(n, y);
+ core::num z_i_y = z.{core::num::clamp}(i, y);
+ core::num z_d_y = z.{core::num::clamp}(d, y);
+ core::num z_x_y = z.{core::num::clamp}(x, y);
+ core::num z_y_y = z.{core::num::clamp}(y, y);
+ core::num z_z_y = z.{core::num::clamp}(z, y);
+ core::num z_n_z = z.{core::num::clamp}(n, z);
+ core::num z_i_z = z.{core::num::clamp}(i, z);
+ core::double z_d_z = z.{core::num::clamp}(d, z);
+ core::num z_x_z = z.{core::num::clamp}(x, z);
+ core::num z_y_z = z.{core::num::clamp}(y, z);
+ core::double z_z_z = z.{core::num::clamp}(z, z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart b/pkg/front_end/testcases/nnbd/numbers_inferred.dart
new file mode 100644
index 0000000..f2a9f12
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart
@@ -0,0 +1,277 @@
+// 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.
+
+T f<T>() => throw 'Unsupported';
+
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ num n_n = n + f();
+ int n_i = n + f();
+ double n_d = n + f();
+ X n_x = n + f();
+ Y n_y = n + f();
+ Z n_z = n + f();
+
+ num i_n = i + f();
+ int i_i = i + f();
+ double i_d = i + f();
+ X i_x = i + f();
+ Y i_y = i + f();
+ Z i_z = i + f();
+
+ num d_n = d + f();
+ int d_i = d + f();
+ double d_d = d + f();
+ X d_x = d + f();
+ Y d_y = d + f();
+ Z d_z = d + f();
+
+ num x_n = x + f();
+ int x_i = x + f();
+ double x_d = x + f();
+ X x_x = x + f();
+ Y x_y = x + f();
+ Z x_z = x + f();
+
+ num y_n = y + f();
+ int y_i = y + f();
+ double y_d = y + f();
+ X y_x = y + f();
+ Y y_y = y + f();
+ Z y_z = y + f();
+
+ num z_n = z + f();
+ int z_i = z + f();
+ double z_d = z + f();
+ X z_x = z + f();
+ Y z_y = z + f();
+ Z z_z = z + f();
+}
+
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ num n_n = n - f();
+ int n_i = n - f();
+ double n_d = n - f();
+ X n_x = n - f();
+ Y n_y = n - f();
+ Z n_z = n - f();
+
+ num i_n = i - f();
+ int i_i = i - f();
+ double i_d = i - f();
+ X i_x = i - f();
+ Y i_y = i - f();
+ Z i_z = i - f();
+
+ num d_n = d - f();
+ int d_i = d - f();
+ double d_d = d - f();
+ X d_x = d - f();
+ Y d_y = d - f();
+ Z d_z = d - f();
+
+ num x_n = x - f();
+ int x_i = x - f();
+ double x_d = x - f();
+ X x_x = x - f();
+ Y x_y = x - f();
+ Z x_z = x - f();
+
+ num y_n = y - f();
+ int y_i = y - f();
+ double y_d = y - f();
+ X y_x = y - f();
+ Y y_y = y - f();
+ Z y_z = y - f();
+
+ num z_n = z - f();
+ int z_i = z - f();
+ double z_d = z - f();
+ X z_x = z - f();
+ Y z_y = z - f();
+ Z z_z = z - f();
+}
+
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ num n_n = n * f();
+ int n_i = n * f();
+ double n_d = n * f();
+ X n_x = n * f();
+ Y n_y = n * f();
+ Z n_z = n * f();
+
+ num i_n = i * f();
+ int i_i = i * f();
+ double i_d = i * f();
+ X i_x = i * f();
+ Y i_y = i * f();
+ Z i_z = i * f();
+
+ num d_n = d * f();
+ int d_i = d * f();
+ double d_d = d * f();
+ X d_x = d * f();
+ Y d_y = d * f();
+ Z d_z = d * f();
+
+ num x_n = x * f();
+ int x_i = x * f();
+ double x_d = x * f();
+ X x_x = x * f();
+ Y x_y = x * f();
+ Z x_z = x * f();
+
+ num y_n = y * f();
+ int y_i = y * f();
+ double y_d = y * f();
+ X y_x = y * f();
+ Y y_y = y * f();
+ Z y_z = y * f();
+
+ num z_n = z * f();
+ int z_i = z * f();
+ double z_d = z * f();
+ X z_x = z * f();
+ Y z_y = z * f();
+ Z z_z = z * f();
+}
+
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ num n_n = n % f();
+ int n_i = n % f();
+ double n_d = n % f();
+ X n_x = n % f();
+ Y n_y = n % f();
+ Z n_z = n % f();
+
+ num i_n = i % f();
+ int i_i = i % f();
+ double i_d = i % f();
+ X i_x = i % f();
+ Y i_y = i % f();
+ Z i_z = i % f();
+
+ num d_n = d % f();
+ int d_i = d % f();
+ double d_d = d % f();
+ X d_x = d % f();
+ Y d_y = d % f();
+ Z d_z = d % f();
+
+ num x_n = x % f();
+ int x_i = x % f();
+ double x_d = x % f();
+ X x_x = x % f();
+ Y x_y = x % f();
+ Z x_z = x % f();
+
+ num y_n = y % f();
+ int y_i = y % f();
+ double y_d = y % f();
+ X y_x = y % f();
+ Y y_y = y % f();
+ Z y_z = y % f();
+
+ num z_n = z % f();
+ int z_i = z % f();
+ double z_d = z % f();
+ X z_x = z % f();
+ Y z_y = z % f();
+ Z z_z = z % f();
+}
+
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n.remainder(f());
+ int n_i = n.remainder(f());
+ double n_d = n.remainder(f());
+ X n_x = n.remainder(f());
+ Y n_y = n.remainder(f());
+ Z n_z = n.remainder(f());
+
+ num i_n = i.remainder(f());
+ int i_i = i.remainder(f());
+ double i_d = i.remainder(f());
+ X i_x = i.remainder(f());
+ Y i_y = i.remainder(f());
+ Z i_z = i.remainder(f());
+
+ var d_n = d.remainder(f());
+ int d_i = d.remainder(f());
+ double d_d = d.remainder(f());
+ X d_x = d.remainder(f());
+ Y d_y = d.remainder(f());
+ Z d_z = d.remainder(f());
+
+ var x_n = x.remainder(f());
+ int x_i = x.remainder(f());
+ double x_d = x.remainder(f());
+ X x_x = x.remainder(f());
+ Y x_y = x.remainder(f());
+ Z x_z = x.remainder(f());
+
+ var y_n = y.remainder(f());
+ int y_i = y.remainder(f());
+ double y_d = y.remainder(f());
+ X y_x = y.remainder(f());
+ Y y_y = y.remainder(f());
+ Z y_z = y.remainder(f());
+
+ var z_n = z.remainder(f());
+ int z_i = z.remainder(f());
+ double z_d = z.remainder(f());
+ X z_x = z.remainder(f());
+ Y z_y = z.remainder(f());
+ Z z_z = z.remainder(f());
+}
+
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {
+ var n_n = n.clamp(f(), f());
+ int n_i = n.clamp(f(), f());
+ double n_d = n.clamp(f(), f());
+ X n_x = n.clamp(f(), f());
+ Y n_y = n.clamp(f(), f());
+ Z n_z = n.clamp(f(), f());
+
+ num i_n = i.clamp(f(), f());
+ int i_i = i.clamp(f(), f());
+ double i_d = i.clamp(f(), f());
+ X i_x = i.clamp(f(), f());
+ Y i_y = i.clamp(f(), f());
+ Z i_z = i.clamp(f(), f());
+
+ var d_n = d.clamp(f(), f());
+ int d_i = d.clamp(f(), f());
+ double d_d = d.clamp(f(), f());
+ X d_x = d.clamp(f(), f());
+ Y d_y = d.clamp(f(), f());
+ Z d_z = d.clamp(f(), f());
+
+ var x_n = x.clamp(f(), f());
+ int x_i = x.clamp(f(), f());
+ double x_d = x.clamp(f(), f());
+ X x_x = x.clamp(f(), f());
+ Y x_y = x.clamp(f(), f());
+ Z x_z = x.clamp(f(), f());
+
+ var y_n = y.clamp(f(), f());
+ int y_i = y.clamp(f(), f());
+ double y_d = y.clamp(f(), f());
+ X y_x = y.clamp(f(), f());
+ Y y_y = y.clamp(f(), f());
+ Z y_z = y.clamp(f(), f());
+
+ var z_n = z.clamp(f(), f());
+ int z_i = z.clamp(f(), f());
+ double z_d = z.clamp(f(), f());
+ X z_x = z.clamp(f(), f());
+ Y z_y = z.clamp(f(), f());
+ Z z_z = z.clamp(f(), f());
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect
new file mode 100644
index 0000000..8160ab1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+ ;
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic
+ ;
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic
+ ;
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic
+ ;
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic
+ ;
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic
+ ;
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double n_d = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double i_d = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int d_i = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X d_x = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double x_d = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double y_d = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int z_i = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X z_x = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.clamp(f(), f());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+ return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::+}(self::f<core::double>());
+ self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::+}(self::f<core::num>());
+ core::int i_i = i.{core::num::+}(self::f<core::int>());
+ core::double i_d = i.{core::num::+}(self::f<core::double>());
+ self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::+}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::+}(self::f<core::num>());
+ self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::+}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::+}(self::f<core::double>());
+ self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::+}(self::f<core::num>());
+ core::int y_i = y.{core::num::+}(self::f<core::int>());
+ core::double y_d = y.{core::num::+}(self::f<core::double>());
+ self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::+}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::+}(self::f<core::num>());
+ self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::-}(self::f<core::double>());
+ self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::-}(self::f<core::num>());
+ core::int i_i = i.{core::num::-}(self::f<core::int>());
+ core::double i_d = i.{core::num::-}(self::f<core::double>());
+ self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::-}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::-}(self::f<core::num>());
+ self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::-}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::-}(self::f<core::double>());
+ self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::-}(self::f<core::num>());
+ core::int y_i = y.{core::num::-}(self::f<core::int>());
+ core::double y_d = y.{core::num::-}(self::f<core::double>());
+ self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::-}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::-}(self::f<core::num>());
+ self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::*}(self::f<core::double>());
+ self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::*}(self::f<core::num>());
+ core::int i_i = i.{core::num::*}(self::f<core::int>());
+ core::double i_d = i.{core::num::*}(self::f<core::double>());
+ self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::*}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::*}(self::f<core::num>());
+ self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::*}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::*}(self::f<core::double>());
+ self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::*}(self::f<core::num>());
+ core::int y_i = y.{core::num::*}(self::f<core::int>());
+ core::double y_d = y.{core::num::*}(self::f<core::double>());
+ self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::*}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::*}(self::f<core::num>());
+ self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::%}(self::f<core::double>());
+ self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::%}(self::f<core::num>());
+ core::int i_i = i.{core::num::%}(self::f<core::int>());
+ core::double i_d = i.{core::num::%}(self::f<core::double>());
+ self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::%}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::%}(self::f<core::num>());
+ self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::%}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::%}(self::f<core::double>());
+ self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::%}(self::f<core::num>());
+ core::int y_i = y.{core::num::%}(self::f<core::int>());
+ core::double y_d = y.{core::num::%}(self::f<core::double>());
+ self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::%}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::%}(self::f<core::num>());
+ self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+ core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+ core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+ core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+ core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double n_d = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double i_d = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int d_i = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X d_x = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double x_d = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double y_d = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int z_i = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X z_x = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.strong.transformed.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double n_d = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double i_d = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int d_i = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X d_x = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double x_d = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double y_d = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int z_i = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X z_x = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.clamp(f(), f());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+ return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::+}(self::f<core::double>());
+ self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::+}(self::f<core::num>());
+ core::int i_i = i.{core::num::+}(self::f<core::int>());
+ core::double i_d = i.{core::num::+}(self::f<core::double>());
+ self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::+}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::+}(self::f<core::num>());
+ self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::+}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::+}(self::f<core::double>());
+ self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::+}(self::f<core::num>());
+ core::int y_i = y.{core::num::+}(self::f<core::int>());
+ core::double y_d = y.{core::num::+}(self::f<core::double>());
+ self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::+}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::+}(self::f<core::num>());
+ self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::-}(self::f<core::double>());
+ self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::-}(self::f<core::num>());
+ core::int i_i = i.{core::num::-}(self::f<core::int>());
+ core::double i_d = i.{core::num::-}(self::f<core::double>());
+ self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::-}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::-}(self::f<core::num>());
+ self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::-}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::-}(self::f<core::double>());
+ self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::-}(self::f<core::num>());
+ core::int y_i = y.{core::num::-}(self::f<core::int>());
+ core::double y_d = y.{core::num::-}(self::f<core::double>());
+ self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::-}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::-}(self::f<core::num>());
+ self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::*}(self::f<core::double>());
+ self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::*}(self::f<core::num>());
+ core::int i_i = i.{core::num::*}(self::f<core::int>());
+ core::double i_d = i.{core::num::*}(self::f<core::double>());
+ self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::*}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::*}(self::f<core::num>());
+ self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::*}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::*}(self::f<core::double>());
+ self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::*}(self::f<core::num>());
+ core::int y_i = y.{core::num::*}(self::f<core::int>());
+ core::double y_d = y.{core::num::*}(self::f<core::double>());
+ self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::*}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::*}(self::f<core::num>());
+ self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::%}(self::f<core::double>());
+ self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::%}(self::f<core::num>());
+ core::int i_i = i.{core::num::%}(self::f<core::int>());
+ core::double i_d = i.{core::num::%}(self::f<core::double>());
+ self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::%}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::%}(self::f<core::num>());
+ self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::%}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::%}(self::f<core::double>());
+ self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::%}(self::f<core::num>());
+ core::int y_i = y.{core::num::%}(self::f<core::int>());
+ core::double y_d = y.{core::num::%}(self::f<core::double>());
+ self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::%}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::%}(self::f<core::num>());
+ self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+ core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+ core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+ core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+ core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double n_d = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double i_d = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int d_i = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X d_x = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double x_d = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double y_d = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int z_i = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X z_x = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect
new file mode 100644
index 0000000..5828a2d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+T f<T>() => throw 'Unsupported';
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..425ac61
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+T f<T>() => throw 'Unsupported';
+add<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+clamp<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+main() {}
+mod<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+mul<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+remainder<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
+sub<X extends num, Y extends int, Z extends double>(
+ num n, int i, double d, X x, Y y, Z z) {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double n_d = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double i_d = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int d_i = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X d_x = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double x_d = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double y_d = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int z_i = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X z_x = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.clamp(f(), f());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+ return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::+}(self::f<core::double>());
+ self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::+}(self::f<core::num>());
+ core::int i_i = i.{core::num::+}(self::f<core::int>());
+ core::double i_d = i.{core::num::+}(self::f<core::double>());
+ self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::+}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::+}(self::f<core::num>());
+ self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::+}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::+}(self::f<core::double>());
+ self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::+}(self::f<core::num>());
+ core::int y_i = y.{core::num::+}(self::f<core::int>());
+ core::double y_d = y.{core::num::+}(self::f<core::double>());
+ self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::+}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::+}(self::f<core::num>());
+ self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::-}(self::f<core::double>());
+ self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::-}(self::f<core::num>());
+ core::int i_i = i.{core::num::-}(self::f<core::int>());
+ core::double i_d = i.{core::num::-}(self::f<core::double>());
+ self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::-}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::-}(self::f<core::num>());
+ self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::-}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::-}(self::f<core::double>());
+ self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::-}(self::f<core::num>());
+ core::int y_i = y.{core::num::-}(self::f<core::int>());
+ core::double y_d = y.{core::num::-}(self::f<core::double>());
+ self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::-}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::-}(self::f<core::num>());
+ self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::*}(self::f<core::double>());
+ self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::*}(self::f<core::num>());
+ core::int i_i = i.{core::num::*}(self::f<core::int>());
+ core::double i_d = i.{core::num::*}(self::f<core::double>());
+ self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::*}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::*}(self::f<core::num>());
+ self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::*}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::*}(self::f<core::double>());
+ self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::*}(self::f<core::num>());
+ core::int y_i = y.{core::num::*}(self::f<core::int>());
+ core::double y_d = y.{core::num::*}(self::f<core::double>());
+ self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::*}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::*}(self::f<core::num>());
+ self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::%}(self::f<core::double>());
+ self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::%}(self::f<core::num>());
+ core::int i_i = i.{core::num::%}(self::f<core::int>());
+ core::double i_d = i.{core::num::%}(self::f<core::double>());
+ self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::%}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::%}(self::f<core::num>());
+ self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::%}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::%}(self::f<core::double>());
+ self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::%}(self::f<core::num>());
+ core::int y_i = y.{core::num::%}(self::f<core::int>());
+ core::double y_d = y.{core::num::%}(self::f<core::double>());
+ self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::%}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::%}(self::f<core::num>());
+ self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+ core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+ core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+ core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+ core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double n_d = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double i_d = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int d_i = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X d_x = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double x_d = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double y_d = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int z_i = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X z_x = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
new file mode 100644
index 0000000..ca5e0f2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/numbers_inferred.dart.weak.transformed.expect
@@ -0,0 +1,1054 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z + f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z - f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z * f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z % f();
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int d_i = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X d_x = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// int z_i = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+// X z_x = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.remainder(f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int n_i = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double n_d = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X n_x = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y n_y = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z n_z = n.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double i_d = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X i_x = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y i_y = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z i_z = i.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int d_i = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X d_x = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y d_y = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z d_z = d.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int x_i = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double x_d = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X x_x = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y x_y = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z x_z = x.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+// double y_d = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X y_x = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y y_y = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z y_z = y.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+// int z_i = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+// X z_x = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+// Y z_y = z.clamp(f(), f());
+// ^
+//
+// pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+// Z z_z = z.clamp(f(), f());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>() → self::f::T%
+ return throw "Unsupported";
+static method add<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::add::X x, self::add::Y y, self::add::Z z) → dynamic {
+ core::num n_n = n.{core::num::+}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:10:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::+}(self::f<core::double>());
+ self::add::X n_x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:12:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y n_y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:13:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z n_z = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:14:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n + f();
+ ^" in n.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::+}(self::f<core::num>());
+ core::int i_i = i.{core::num::+}(self::f<core::int>());
+ core::double i_d = i.{core::num::+}(self::f<core::double>());
+ self::add::X i_x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:19:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y i_y = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:20:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z i_z = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:21:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i + f();
+ ^" in i.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::+}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:24:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::+}(self::f<core::num>());
+ self::add::X d_x = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:26:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y d_y = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:27:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z d_z = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:28:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d + f();
+ ^" in d.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::+}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:31:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::+}(self::f<core::double>());
+ self::add::X x_x = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:33:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y x_y = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:34:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z x_z = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:35:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x + f();
+ ^" in x.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::+}(self::f<core::num>());
+ core::int y_i = y.{core::num::+}(self::f<core::int>());
+ core::double y_d = y.{core::num::+}(self::f<core::double>());
+ self::add::X y_x = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:40:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y y_y = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:41:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z y_z = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:42:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y + f();
+ ^" in y.{core::num::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::+}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:45:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::+}(self::f<core::num>());
+ self::add::X z_x = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:47:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Y z_y = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:48:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::add::Z z_z = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:49:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z + f();
+ ^" in z.{core::double::+}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method sub<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::sub::X x, self::sub::Y y, self::sub::Z z) → dynamic {
+ core::num n_n = n.{core::num::-}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:55:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::-}(self::f<core::double>());
+ self::sub::X n_x = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:57:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y n_y = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:58:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z n_z = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:59:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n - f();
+ ^" in n.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::-}(self::f<core::num>());
+ core::int i_i = i.{core::num::-}(self::f<core::int>());
+ core::double i_d = i.{core::num::-}(self::f<core::double>());
+ self::sub::X i_x = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:64:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y i_y = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:65:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z i_z = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:66:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i - f();
+ ^" in i.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::-}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:69:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::-}(self::f<core::num>());
+ self::sub::X d_x = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:71:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y d_y = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:72:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z d_z = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:73:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d - f();
+ ^" in d.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::-}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:76:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::-}(self::f<core::double>());
+ self::sub::X x_x = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:78:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y x_y = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:79:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z x_z = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:80:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x - f();
+ ^" in x.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::-}(self::f<core::num>());
+ core::int y_i = y.{core::num::-}(self::f<core::int>());
+ core::double y_d = y.{core::num::-}(self::f<core::double>());
+ self::sub::X y_x = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:85:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y y_y = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:86:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z y_z = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:87:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y - f();
+ ^" in y.{core::num::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::-}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:90:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::-}(self::f<core::num>());
+ self::sub::X z_x = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:92:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Y z_y = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:93:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::sub::Z z_z = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:94:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z - f();
+ ^" in z.{core::double::-}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mul<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mul::X x, self::mul::Y y, self::mul::Z z) → dynamic {
+ core::num n_n = n.{core::num::*}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:100:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::*}(self::f<core::double>());
+ self::mul::X n_x = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:102:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y n_y = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:103:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z n_z = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:104:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n * f();
+ ^" in n.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::*}(self::f<core::num>());
+ core::int i_i = i.{core::num::*}(self::f<core::int>());
+ core::double i_d = i.{core::num::*}(self::f<core::double>());
+ self::mul::X i_x = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:109:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y i_y = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:110:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z i_z = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:111:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i * f();
+ ^" in i.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::*}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:114:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::*}(self::f<core::num>());
+ self::mul::X d_x = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:116:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y d_y = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:117:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z d_z = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:118:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d * f();
+ ^" in d.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::*}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:121:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::*}(self::f<core::double>());
+ self::mul::X x_x = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:123:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y x_y = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:124:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z x_z = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:125:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x * f();
+ ^" in x.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::*}(self::f<core::num>());
+ core::int y_i = y.{core::num::*}(self::f<core::int>());
+ core::double y_d = y.{core::num::*}(self::f<core::double>());
+ self::mul::X y_x = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:130:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y y_y = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:131:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z y_z = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:132:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y * f();
+ ^" in y.{core::num::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::*}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:135:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::*}(self::f<core::num>());
+ self::mul::X z_x = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:137:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Y z_y = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:138:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mul::Z z_z = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:139:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z * f();
+ ^" in z.{core::double::*}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method mod<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::mod::X x, self::mod::Y y, self::mod::Z z) → dynamic {
+ core::num n_n = n.{core::num::%}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:145:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::%}(self::f<core::double>());
+ self::mod::X n_x = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:147:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y n_y = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:148:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z n_z = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:149:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n % f();
+ ^" in n.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::%}(self::f<core::num>());
+ core::int i_i = i.{core::num::%}(self::f<core::int>());
+ core::double i_d = i.{core::num::%}(self::f<core::double>());
+ self::mod::X i_x = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:154:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y i_y = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:155:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z i_z = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:156:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i % f();
+ ^" in i.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::double::%}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:159:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::%}(self::f<core::num>());
+ self::mod::X d_x = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:161:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y d_y = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:162:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z d_z = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:163:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d % f();
+ ^" in d.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::%}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:166:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::%}(self::f<core::double>());
+ self::mod::X x_x = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:168:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y x_y = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:169:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z x_z = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:170:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x % f();
+ ^" in x.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::%}(self::f<core::num>());
+ core::int y_i = y.{core::num::%}(self::f<core::int>());
+ core::double y_d = y.{core::num::%}(self::f<core::double>());
+ self::mod::X y_x = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:175:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y y_y = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:176:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z y_z = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:177:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y % f();
+ ^" in y.{core::num::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::double::%}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:180:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::%}(self::f<core::num>());
+ self::mod::X z_x = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:182:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Y z_y = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:183:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::mod::Z z_z = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:184:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z % f();
+ ^" in z.{core::double::%}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method remainder<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::remainder::X x, self::remainder::Y y, self::remainder::Z z) → dynamic {
+ core::num n_n = n.{core::num::remainder}(self::f<core::num>());
+ core::int n_i = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:190:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = n.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X n_x = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:192:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y n_y = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:193:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z n_z = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:194:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.remainder(f());
+ ^" in n.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::remainder}(self::f<core::num>());
+ core::int i_i = i.{core::num::remainder}(self::f<core::int>());
+ core::double i_d = i.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X i_x = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:199:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y i_y = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:200:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z i_z = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:201:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.remainder(f());
+ ^" in i.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double d_n = d.{core::double::remainder}(self::f<core::num>());
+ core::int d_i = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:204:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int d_i = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X d_x = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:206:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X d_x = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y d_y = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:207:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z d_z = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:208:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.remainder(f());
+ ^" in d.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::remainder}(self::f<core::num>());
+ core::int x_i = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:211:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = x.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X x_x = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:213:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y x_y = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:214:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z x_z = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:215:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.remainder(f());
+ ^" in x.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::remainder}(self::f<core::num>());
+ core::int y_i = y.{core::num::remainder}(self::f<core::int>());
+ core::double y_d = y.{core::num::remainder}(self::f<core::double>());
+ self::remainder::X y_x = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:220:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y y_y = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:221:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z y_z = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:222:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.remainder(f());
+ ^" in y.{core::num::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::double z_n = z.{core::double::remainder}(self::f<core::num>());
+ core::int z_i = let final<BottomType> #t107 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:225:15: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+ int z_i = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::double::remainder}(self::f<core::num>());
+ self::remainder::X z_x = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:227:13: Error: A value of type 'double' can't be assigned to a variable of type 'X'.
+ X z_x = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Y z_y = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:228:13: Error: A value of type 'double' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::remainder::Z z_z = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:229:13: Error: A value of type 'double' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.remainder(f());
+ ^" in z.{core::double::remainder}(self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method clamp<X extends core::num = core::num, Y extends core::int = core::int, Z extends core::double = core::double>(core::num n, core::int i, core::double d, self::clamp::X x, self::clamp::Y y, self::clamp::Z z) → dynamic {
+ core::num n_n = n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int n_i = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:235:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int n_i = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double n_d = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:236:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double n_d = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X n_x = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:237:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X n_x = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y n_y = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:238:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y n_y = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z n_z = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:239:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z n_z = n.clamp(f(), f());
+ ^" in n.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num i_n = i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int i_i = i.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double i_d = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:243:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double i_d = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X i_x = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:244:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X i_x = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y i_y = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:245:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y i_y = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z i_z = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:246:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z i_z = i.clamp(f(), f());
+ ^" in i.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num d_n = d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int d_i = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:249:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int d_i = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double d_d = d.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X d_x = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:251:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X d_x = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y d_y = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:252:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y d_y = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z d_z = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:253:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z d_z = d.clamp(f(), f());
+ ^" in d.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num x_n = x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int x_i = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:256:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int x_i = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double x_d = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:257:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double x_d = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X x_x = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:258:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X x_x = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y x_y = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:259:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y x_y = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z x_z = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:260:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z x_z = x.clamp(f(), f());
+ ^" in x.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num y_n = y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int y_i = y.{core::num::clamp}(self::f<core::int>(), self::f<core::int>());
+ core::double y_d = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:264:18: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+ double y_d = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::double;
+ self::clamp::X y_x = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:265:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X y_x = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y y_y = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:266:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y y_y = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z y_z = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:267:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z y_z = y.clamp(f(), f());
+ ^" in y.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ core::num z_n = z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>());
+ core::int z_i = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:270:15: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+ int z_i = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} core::int;
+ core::double z_d = z.{core::num::clamp}(self::f<core::double>(), self::f<core::double>());
+ self::clamp::X z_x = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:272:13: Error: A value of type 'num' can't be assigned to a variable of type 'X'.
+ X z_x = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Y z_y = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:273:13: Error: A value of type 'num' can't be assigned to a variable of type 'Y'.
+ Y z_y = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+ self::clamp::Z z_z = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/numbers_inferred.dart:274:13: Error: A value of type 'num' can't be assigned to a variable of type 'Z'.
+ Z z_z = z.clamp(f(), f());
+ ^" in z.{core::num::clamp}(self::f<core::num>(), self::f<core::num>()) as{TypeError,ForNonNullableByDefault} <BottomType>;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
index 7ba4b0f..df25b02 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.outline.expect
@@ -29,7 +29,7 @@
get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
set extensionProperty = self::Extension|set#extensionProperty;
}
-static field core::int? topLevelBinary;
+static field core::num topLevelBinary;
static field core::int topLevelUnary;
static field dynamic topLevelIndexGet;
static field core::int topLevelIndexSet;
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
index 7c80c76..c4c45a5 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
@@ -443,7 +443,7 @@
get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
set extensionProperty = self::Extension|set#extensionProperty;
}
-static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static field core::num topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
var topLevelBinary = nullableInt + 0;
^" in self::nullableInt.{core::num::+}(0);
static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -650,7 +650,7 @@
static get nullableClass() → self::Class?
return new self::Class::•();
static method test() → dynamic {
- core::int? localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ core::num localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
var localBinary = nullableInt + 0;
^" in self::nullableInt.{core::num::+}(0);
core::int localUnary = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
index 7c80c76..c4c45a5 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
@@ -443,7 +443,7 @@
get extensionFunctionTypeGetter = self::Extension|get#extensionFunctionTypeGetter;
set extensionProperty = self::Extension|set#extensionProperty;
}
-static field core::int? topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+static field core::num topLevelBinary = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:37:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
var topLevelBinary = nullableInt + 0;
^" in self::nullableInt.{core::num::+}(0);
static field core::int topLevelUnary = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:38:21: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
@@ -650,7 +650,7 @@
static get nullableClass() → self::Class?
return new self::Class::•();
static method test() → dynamic {
- core::int? localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ core::num localBinary = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:76:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
var localBinary = nullableInt + 0;
^" in self::nullableInt.{core::num::+}(0);
core::int localUnary = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/potentially_nullable_access.dart:77:20: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart b/pkg/front_end/testcases/nnbd/return_null.dart
index a044f19..93ea4d6 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart
+++ b/pkg/front_end/testcases/nnbd/return_null.dart
@@ -114,7 +114,7 @@
}
bool b = false;
- var local1 = () /* error */ {
+ var local1 = () /* ok */ {
if (b) return 0;
}();
var local2 = () /* ok */ {
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
index ec3912f..022f00c 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -52,10 +52,6 @@
// Enum caseReturn2(Enum e) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-// var local1 = () /* error */ {
-// ^
-//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
@@ -212,12 +208,9 @@
^" in null;
}
core::bool b = false;
- core::int local1 = (() → core::int {
+ core::int? local1 = (() → core::int? {
if(b)
return 0;
- return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
- var local1 = () /* error */ {
- ^" in null;
}).call();
core::int? local2 = (() → core::int? {
if(b)
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index e697630..6f1bd4c 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -52,10 +52,6 @@
// Enum caseReturn2(Enum e) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-// var local1 = () /* error */ {
-// ^
-//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
@@ -612,12 +608,9 @@
^" in null;
}
core::bool b = false;
- core::int local1 = (() → core::int {
+ core::int? local1 = (() → core::int? {
if(b)
return 0;
- return let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
- var local1 = () /* error */ {
- ^" in null;
}).call();
core::int? local2 = (() → core::int? {
if(b)
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
index 2aff0f0..4c9329b 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -52,10 +52,6 @@
// Enum caseReturn2(Enum e) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-// var local1 = () /* error */ {
-// ^
-//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
@@ -212,12 +208,9 @@
^" in null;
}
core::bool b = false;
- core::int local1 = (() → core::int {
+ core::int? local1 = (() → core::int? {
if(b)
return 0;
- return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
- var local1 = () /* error */ {
- ^" in null;
}).call();
core::int? local2 = (() → core::int? {
if(b)
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
index e888a45..b3b3e5b 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -52,10 +52,6 @@
// Enum caseReturn2(Enum e) /* error */ {
// ^
//
-// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
-// var local1 = () /* error */ {
-// ^
-//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
@@ -612,12 +608,9 @@
^" in null;
}
core::bool b = false;
- core::int local1 = (() → core::int {
+ core::int? local1 = (() → core::int? {
if(b)
return 0;
- return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
- var local1 = () /* error */ {
- ^" in null;
}).call();
core::int? local2 = (() → core::int? {
if(b)
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
@@ -54,7 +54,7 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.field + 2); // error
^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
throwsInStrong(() => -c?.field); // error
^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.next[0] + 2); // error
^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
@@ -54,7 +54,7 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.field + 2); // error
^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
throwsInStrong(() => -c?.field); // error
^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.next[0] + 2); // error
^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -54,7 +54,7 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.field + 2); // error
^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
throwsInStrong(() => -c?.field); // error
^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.next[0] + 2); // error
^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index fffeeb8..609cde0 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -54,7 +54,7 @@
}
static method test(self::Class? c) → dynamic {
let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::Class}.{self::Class::next}.{self::Class::field};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.field + 2); // error
^" in (let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{self::Class}.{self::Class::field}).{core::num::+}(2));
let final self::Class? #t4 = c in #t4.{core::Object::==}(null) ?{core::int?} null : let final core::int #t5 = #t4.{self::Class::field}.{core::num::+}(1) in let final void #t6 = #t4.{self::Class::field} = #t5 in #t5;
@@ -68,7 +68,7 @@
throwsInStrong(() => -c?.field); // error
^" in (let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : #t11{self::Class}.{self::Class::field}).{core::int::unary-}());
let final self::Class? #t12 = c in #t12.{core::Object::==}(null) ?{core::bool?} null : #t12{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
- self::throwsInStrong(() → core::int? => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+ self::throwsInStrong(() → core::num => let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
throwsInStrong(() => c?.next[0] + 2); // error
^" in (let final self::Class? #t14 = c in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
let final self::Class? #t15 = c in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::next} in let final core::int #t17 = 0 in let final core::int #t18 = #t16.{self::Class::[]}(#t17).{core::num::+}(1) in let final void #t19 = #t16.{self::Class::[]=}(#t17, #t18) in #t18;
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart
new file mode 100644
index 0000000..5765ffd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart
@@ -0,0 +1,17 @@
+// 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 Foo<T> {
+ dynamic bar;
+ dynamic baz;
+
+ dynamic qux() {
+ final T? v = bar;
+ if (v is num) {
+ baz['value'] = v.isFinite ? v : v.toString();
+ }
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect
new file mode 100644
index 0000000..c9c1d63
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.outline.expect
@@ -0,0 +1,14 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+ field dynamic bar;
+ field dynamic baz;
+ synthetic constructor •() → self::Foo<self::Foo::T%>
+ ;
+ method qux() → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+ field dynamic bar = null;
+ field dynamic baz = null;
+ synthetic constructor •() → self::Foo<self::Foo::T%>
+ : super core::Object::•()
+ ;
+ method qux() → dynamic {
+ final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+ if(v is{ForNonNullableByDefault} core::num) {
+ this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+ field dynamic bar = null;
+ field dynamic baz = null;
+ synthetic constructor •() → self::Foo<self::Foo::T%>
+ : super core::Object::•()
+ ;
+ method qux() → dynamic {
+ final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+ if(v is{ForNonNullableByDefault} core::num) {
+ this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+ field dynamic bar = null;
+ field dynamic baz = null;
+ synthetic constructor •() → self::Foo<self::Foo::T%>
+ : super core::Object::•()
+ ;
+ method qux() → dynamic {
+ final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+ if(v is{ForNonNullableByDefault} core::num) {
+ this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..78aceb3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/upper_bound_on_promoted_type.dart.weak.transformed.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object? = dynamic> extends core::Object {
+ field dynamic bar = null;
+ field dynamic baz = null;
+ synthetic constructor •() → self::Foo<self::Foo::T%>
+ : super core::Object::•()
+ ;
+ method qux() → dynamic {
+ final self::Foo::T? v = this.{self::Foo::bar} as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo::T?;
+ if(v is{ForNonNullableByDefault} core::num) {
+ this.{self::Foo::baz}.[]=("value", v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::isFinite} ?{core::Object?} v{self::Foo::T? & core::num /* '?' & '!' = '!' */} : v{self::Foo::T? & core::num /* '?' & '!' = '!' */}.{core::num::toString}());
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
new file mode 100644
index 0000000..b54e437
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
@@ -0,0 +1,10 @@
+// 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class EmptyClass {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
new file mode 100644
index 0000000..e608a1a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
@@ -0,0 +1,12 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class EmptyClass extends core::Object {
+ synthetic constructor •() → self::EmptyClass
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+ synthetic constructor •() → self::EmptyClass
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+ synthetic constructor •() → self::EmptyClass
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+ synthetic constructor •() → self::EmptyClass
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..6b2cbce
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
@@ -0,0 +1,16 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class EmptyClass extends core::Object {
+ synthetic constructor •() → self::EmptyClass
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
new file mode 100644
index 0000000..6c9da9d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ int? numLegs;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
new file mode 100644
index 0000000..4353f25
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+ field core::int? numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int? numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int? numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int? numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..2107377
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ field core::int? numLegs = null;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
new file mode 100644
index 0000000..efe2cdd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs = 4;
+}
+
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..0dc7afd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..dda377d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
new file mode 100644
index 0000000..3800fa1
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs = 4;
+}
+
+class Cat implements Animal {
+ int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..6303c33
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ field core::int numLegs;
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..756c16c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+class Cat extends core::Object implements self::Animal {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
new file mode 100644
index 0000000..522d957
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
@@ -0,0 +1,12 @@
+// 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
new file mode 100644
index 0000000..e16fd84
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
@@ -0,0 +1,13 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..264a8f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
new file mode 100644
index 0000000..d57a05b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+ final int numLegs = 4;
+}
+
+@valueClass
+class Cat implements Animal {
+ final int numLegs = 4;
+ final int numWhiskers = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
new file mode 100644
index 0000000..72f354d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+@self::valueClass
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs;
+ final field core::int numWhiskers;
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ final field core::int numWhiskers = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ final field core::int numWhiskers = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ final field core::int numWhiskers = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..c9c2a66
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ final field core::int numWhiskers = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/test.options b/pkg/front_end/testcases/nnbd/value_classes/test.options
new file mode 100644
index 0000000..81953a10
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/test.options
@@ -0,0 +1 @@
+--enable-experiment=non-nullable,value-class
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
new file mode 100644
index 0000000..79b694c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+ int numLegs = 4;
+}
+
+@valueClass
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
new file mode 100644
index 0000000..7d29b32
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+@self::valueClass
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..7e7b833
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
new file mode 100644
index 0000000..2cc85fc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+ final int numLegs = 4;
+}
+
+@valueClass
+class Cat extends Animal {}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
new file mode 100644
index 0000000..c0cd3b6
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+@self::valueClass
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..7e25746
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends self::Animal {
+ synthetic constructor •() → self::Cat
+ : super self::Animal::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
new file mode 100644
index 0000000..2d67798
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const String valueClass = "valueClass";
+
+class Animal {
+ final int numLegs = 4;
+}
+
+@valueClass
+class Cat implements Animal {
+ final int numLegs = 4;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
new file mode 100644
index 0000000..e4fba11
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
@@ -0,0 +1,18 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Animal
+ ;
+}
+@self::valueClass
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs;
+ synthetic constructor •() → self::Cat
+ ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
new file mode 100644
index 0000000..ba205d4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Animal
+ : super core::Object::•()
+ ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+ final field core::int numLegs = 4;
+ synthetic constructor •() → self::Cat
+ : super core::Object::•()
+ ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants {
+ #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart
new file mode 100644
index 0000000..ad9b510
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+
+void test() {
+ F f = null; // Static error
+ f = f1; // No error
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect
new file mode 100644
index 0000000..f3fb35c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+import 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+void test() {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..9ad4cf9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+import 'issue42181_lib.dart';
+
+int? f1(int x) => x;
+main() {}
+void test() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
new file mode 100644
index 0000000..6cfbab4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// F f = null; // Static error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42181_lib.dart";
+
+static method f1(core::int x) → core::int?
+ return x;
+static method test() → void {
+ (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+ F f = null; // Static error
+ ^" in null as{TypeError,ForNonNullableByDefault} (core::int*) → core::int*;
+ f = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+
+constants {
+ #C1 = tearoff self::f1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
new file mode 100644
index 0000000..87f79f9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181.dart.weak.transformed.expect
@@ -0,0 +1,32 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+// F f = null; // Static error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42181_lib.dart";
+
+static method f1(core::int x) → core::int?
+ return x;
+static method test() → void {
+ (core::int*) → core::int* f = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue42181.dart:10:9: Error: A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
+ F f = null; // Static error
+ ^" in null;
+ f = #C1;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+
+constants {
+ #C1 = tearoff self::f1
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart
new file mode 100644
index 0000000..16bc752
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42181_lib.dart
@@ -0,0 +1,7 @@
+// 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.
+
+// @dart=2.8
+
+typedef F = int Function(int);
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart
new file mode 100644
index 0000000..b6b0559
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart
@@ -0,0 +1,11 @@
+// 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 'issue42792_lib.dart';
+
+mixin M<T> on A<T> {}
+
+class B extends A<int> with M {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect
new file mode 100644
index 0000000..af0bbd2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+import 'issue42792_lib.dart';
+
+mixin M<T> on A<T> {}
+
+class B extends A<int> with M {}
+
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..7b313f7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+import 'issue42792_lib.dart';
+
+class B extends A<int> with M {}
+
+mixin M<T> on A<T> {}
+void main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect
new file mode 100644
index 0000000..3a81ec3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42792_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42792_lib.dart";
+
+abstract class M<T extends core::Object? = dynamic> extends iss::A<self::M::T%> /*isMixinDeclaration*/ {
+}
+abstract class _B&A&M = iss::A<core::int> with self::M<core::int> /*isAnonymousMixin*/ {
+ synthetic constructor •() → self::_B&A&M
+ : super iss::A::•()
+ ;
+}
+class B extends self::_B&A&M {
+ synthetic constructor •() → self::B
+ : super self::_B&A&M::•()
+ ;
+}
+static method main() → void {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → iss::A<iss::A::T*>*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect
new file mode 100644
index 0000000..6750224
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792.dart.weak.transformed.expect
@@ -0,0 +1,40 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "issue42792_lib.dart" as iss;
+
+import "org-dartlang-testcase:///issue42792_lib.dart";
+
+abstract class M<T extends core::Object? = dynamic> extends iss::A<self::M::T%> /*isMixinDeclaration*/ {
+}
+abstract class _B&A&M extends iss::A<core::int> implements self::M<core::int> /*isAnonymousMixin,isEliminatedMixin*/ {
+ synthetic constructor •() → self::_B&A&M
+ : super iss::A::•()
+ ;
+}
+class B extends self::_B&A&M {
+ synthetic constructor •() → self::B
+ : super self::_B&A&M::•()
+ ;
+}
+static method main() → void {}
+
+library;
+import self as iss;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → iss::A<iss::A::T*>*
+ : super core::Object::•()
+ ;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart
new file mode 100644
index 0000000..7a4b268
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42792_lib.dart
@@ -0,0 +1,7 @@
+// 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.
+
+// @dart = 2.8
+
+abstract class A<T> {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart
new file mode 100644
index 0000000..e23b8c0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// @dart=2.7
+
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+ int legacyMethod() => 3;
+}
+
+var legacyInstance = Legacy();
+
+test(bool b) {
+ var a1 = b ? legacyInstance : legacyInstance;
+ var a2 = b ? legacyInstance : nonNullableInstance;
+ var a3 = b ? legacyInstance : nullableInstance;
+ var b1 = b ? nonNullableInstance : legacyInstance;
+ var b2 = b ? nonNullableInstance : nonNullableInstance;
+ var b3 = b ? nonNullableInstance : nullableInstance;
+ var c1 = b ? nullableInstance : legacyInstance;
+ var c2 = b ? nullableInstance : nonNullableInstance;
+ var c3 = b ? nullableInstance : nullableInstance;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect
new file mode 100644
index 0000000..9bf1641
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+// @dart = 2.7
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+ int legacyMethod() => 3;
+}
+
+var legacyInstance = Legacy();
+test(bool b) {}
+main() {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..cd4b436
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+// @dart = 2.7
+import 'issue42836_lib.dart';
+
+class Legacy extends Generic<int> {
+ int legacyMethod() => 3;
+}
+
+main() {}
+test(bool b) {}
+var legacyInstance = Legacy();
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect
new file mode 100644
index 0000000..2ff8a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "issue42836_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42836_lib.dart";
+
+class Legacy extends iss::Generic<core::int*> {
+ synthetic constructor •() → self::Legacy*
+ : super iss::Generic::•()
+ ;
+ method legacyMethod() → core::int*
+ return 3;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
+static field self::Legacy* legacyInstance = new self::Legacy::•();
+static method test(core::bool* b) → dynamic {
+ self::Legacy* a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+ iss::Generic<core::int*>* a2 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nonNullableInstance;
+ iss::Generic<core::int*>* a3 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nullableInstance;
+ iss::Generic<core::int*>* b1 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : self::legacyInstance;
+ iss::NonNullable* b2 = b ?{iss::NonNullable*} iss::nonNullableInstance : iss::nonNullableInstance;
+ iss::Generic<core::int*>* b3 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : iss::nullableInstance;
+ iss::Generic<core::int*>* c1 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : self::legacyInstance;
+ iss::Generic<core::int*>* c2 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : iss::nonNullableInstance;
+ iss::Nullable* c3 = b ?{iss::Nullable*} iss::nullableInstance : iss::nullableInstance;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+import "issue42836.dart" as self;
+
+import "org-dartlang-testcase:///issue42836.dart";
+
+class Generic<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → iss::Generic<iss::Generic::T%>
+ : super core::Object::•()
+ ;
+}
+class NonNullable extends iss::Generic<core::int> {
+ synthetic constructor •() → iss::NonNullable
+ : super iss::Generic::•()
+ ;
+}
+class Nullable extends iss::Generic<core::int?> {
+ synthetic constructor •() → iss::Nullable
+ : super iss::Generic::•()
+ ;
+}
+static field iss::NonNullable nonNullableInstance = new iss::NonNullable::•();
+static field iss::Nullable nullableInstance = new iss::Nullable::•();
+static method test(core::bool b) → dynamic {
+ self::Legacy a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+ core::Object a2 = b ?{core::Object*} self::legacyInstance : iss::nonNullableInstance;
+ core::Object a3 = b ?{core::Object*} self::legacyInstance : iss::nullableInstance;
+ core::Object b1 = b ?{core::Object*} iss::nonNullableInstance : self::legacyInstance;
+ iss::NonNullable b2 = b ?{iss::NonNullable} iss::nonNullableInstance : iss::nonNullableInstance;
+ core::Object b3 = b ?{core::Object} iss::nonNullableInstance : iss::nullableInstance;
+ core::Object c1 = b ?{core::Object*} iss::nullableInstance : self::legacyInstance;
+ core::Object c2 = b ?{core::Object} iss::nullableInstance : iss::nonNullableInstance;
+ iss::Nullable c3 = b ?{iss::Nullable} iss::nullableInstance : iss::nullableInstance;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect
new file mode 100644
index 0000000..2ff8a4f
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836.dart.weak.transformed.expect
@@ -0,0 +1,73 @@
+library;
+import self as self;
+import "issue42836_lib.dart" as iss;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///issue42836_lib.dart";
+
+class Legacy extends iss::Generic<core::int*> {
+ synthetic constructor •() → self::Legacy*
+ : super iss::Generic::•()
+ ;
+ method legacyMethod() → core::int*
+ return 3;
+ abstract member-signature get _identityHashCode() → core::int*;
+ abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
+ abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
+ abstract member-signature operator ==(dynamic other) → core::bool*;
+ abstract member-signature get hashCode() → core::int*;
+ abstract member-signature method toString() → core::String*;
+ abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
+ abstract member-signature get runtimeType() → core::Type*;
+}
+static field self::Legacy* legacyInstance = new self::Legacy::•();
+static method test(core::bool* b) → dynamic {
+ self::Legacy* a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+ iss::Generic<core::int*>* a2 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nonNullableInstance;
+ iss::Generic<core::int*>* a3 = b ?{iss::Generic<core::int*>*} self::legacyInstance : iss::nullableInstance;
+ iss::Generic<core::int*>* b1 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : self::legacyInstance;
+ iss::NonNullable* b2 = b ?{iss::NonNullable*} iss::nonNullableInstance : iss::nonNullableInstance;
+ iss::Generic<core::int*>* b3 = b ?{iss::Generic<core::int*>*} iss::nonNullableInstance : iss::nullableInstance;
+ iss::Generic<core::int*>* c1 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : self::legacyInstance;
+ iss::Generic<core::int*>* c2 = b ?{iss::Generic<core::int*>*} iss::nullableInstance : iss::nonNullableInstance;
+ iss::Nullable* c3 = b ?{iss::Nullable*} iss::nullableInstance : iss::nullableInstance;
+}
+static method main() → dynamic {}
+
+library /*isNonNullableByDefault*/;
+import self as iss;
+import "dart:core" as core;
+import "issue42836.dart" as self;
+
+import "org-dartlang-testcase:///issue42836.dart";
+
+class Generic<T extends core::Object? = dynamic> extends core::Object {
+ synthetic constructor •() → iss::Generic<iss::Generic::T%>
+ : super core::Object::•()
+ ;
+}
+class NonNullable extends iss::Generic<core::int> {
+ synthetic constructor •() → iss::NonNullable
+ : super iss::Generic::•()
+ ;
+}
+class Nullable extends iss::Generic<core::int?> {
+ synthetic constructor •() → iss::Nullable
+ : super iss::Generic::•()
+ ;
+}
+static field iss::NonNullable nonNullableInstance = new iss::NonNullable::•();
+static field iss::Nullable nullableInstance = new iss::Nullable::•();
+static method test(core::bool b) → dynamic {
+ self::Legacy a1 = b ?{self::Legacy*} self::legacyInstance : self::legacyInstance;
+ core::Object a2 = b ?{core::Object*} self::legacyInstance : iss::nonNullableInstance;
+ core::Object a3 = b ?{core::Object*} self::legacyInstance : iss::nullableInstance;
+ core::Object b1 = b ?{core::Object*} iss::nonNullableInstance : self::legacyInstance;
+ iss::NonNullable b2 = b ?{iss::NonNullable} iss::nonNullableInstance : iss::nonNullableInstance;
+ core::Object b3 = b ?{core::Object} iss::nonNullableInstance : iss::nullableInstance;
+ core::Object c1 = b ?{core::Object*} iss::nullableInstance : self::legacyInstance;
+ core::Object c2 = b ?{core::Object} iss::nullableInstance : iss::nonNullableInstance;
+ iss::Nullable c3 = b ?{iss::Nullable} iss::nullableInstance : iss::nullableInstance;
+}
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart b/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart
new file mode 100644
index 0000000..74f567c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42836_lib.dart
@@ -0,0 +1,26 @@
+// 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 'issue42836.dart';
+
+class Generic<T> {}
+
+class NonNullable extends Generic<int> {}
+
+class Nullable extends Generic<int?> {}
+
+var nonNullableInstance = NonNullable();
+var nullableInstance = Nullable();
+
+test(bool b) {
+ var a1 = b ? legacyInstance : legacyInstance;
+ var a2 = b ? legacyInstance : nonNullableInstance;
+ var a3 = b ? legacyInstance : nullableInstance;
+ var b1 = b ? nonNullableInstance : legacyInstance;
+ var b2 = b ? nonNullableInstance : nonNullableInstance;
+ var b3 = b ? nonNullableInstance : nullableInstance;
+ var c1 = b ? nullableInstance : legacyInstance;
+ var c2 = b ? nullableInstance : nonNullableInstance;
+ var c3 = b ? nullableInstance : nullableInstance;
+}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index f58f9fe..3c00bd1 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -43,6 +43,7 @@
inference/mixin_inference_unification_2: TypeCheckError
late_lowering/covariant_late_field: TypeCheckError
nnbd/covariant_late_field: TypeCheckError
+nnbd/issue42603: TypeCheckError
rasta/native_is_illegal: Pass # Issue 29763
runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 66d7125..a38ef25a 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -173,6 +173,7 @@
nnbd/covariant_late_field: TypeCheckError
nnbd/issue41180: RuntimeError # Strong mode runtime checking fails due to mixed strong mode.
nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
nnbd/nullable_object_access: TypeCheckError
nnbd/nullable_receiver: TypeCheckError
nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index d31841a..bac74e7 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -171,6 +171,7 @@
nnbd/covariant_late_field: TypeCheckError
nnbd/issue41180: RuntimeError
nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
nnbd/nullable_object_access: TypeCheckError
nnbd/nullable_receiver: TypeCheckError
nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 80dbc59..65846ca 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -61,6 +61,7 @@
late_lowering/covariant_late_field: TypeCheckError
nnbd/covariant_late_field: TypeCheckError
nnbd/issue42546: TypeCheckError
+nnbd/issue42603: TypeCheckError
nnbd/nullable_object_access: TypeCheckError
nnbd/nullable_receiver: TypeCheckError
nnbd/potentially_nullable_access: TypeCheckError
diff --git a/pkg/frontend_server/test/src/expression_compiler_test.dart b/pkg/frontend_server/test/src/expression_compiler_test.dart
index 245118a..2dabd91 100644
--- a/pkg/frontend_server/test/src/expression_compiler_test.dart
+++ b/pkg/frontend_server/test/src/expression_compiler_test.dart
@@ -252,7 +252,7 @@
}
}
-int main() {
+void main() {
SetupCompilerOptions options = SetupCompilerOptions();
group('Expression compiler tests in extension method:', () {
@@ -1212,6 +1212,4 @@
''');
});
});
-
- return 0;
}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index ad82c3c..e1bf6e0 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3021,6 +3021,9 @@
if (type == context.typeEnvironment.nullType) {
return context.typeEnvironment.coreTypes
.bottomInterfaceType(superclass, context.nullable);
+ } else if (type is NeverType) {
+ return context.typeEnvironment.coreTypes
+ .bottomInterfaceType(superclass, type.nullability);
}
if (type is InterfaceType) {
List<DartType> upcastTypeArguments = context.typeEnvironment
@@ -3480,8 +3483,8 @@
v.visitDirectMethodInvocation(this, arg);
DartType getStaticType(StaticTypeContext context) {
- if (context.typeEnvironment.isOverloadedArithmeticOperator(target)) {
- return context.typeEnvironment.getTypeOfOverloadedArithmetic(
+ if (context.typeEnvironment.isSpecialCasedBinaryOperator(target)) {
+ return context.typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
receiver.getStaticType(context),
arguments.positional[0].getStaticType(context));
}
@@ -3883,8 +3886,8 @@
if (interfaceTarget != null) {
if (interfaceTarget is Procedure &&
context.typeEnvironment
- .isOverloadedArithmeticOperator(interfaceTarget)) {
- return context.typeEnvironment.getTypeOfOverloadedArithmetic(
+ .isSpecialCasedBinaryOperator(interfaceTarget)) {
+ return context.typeEnvironment.getTypeOfSpecialCasedBinaryOperator(
receiver.getStaticType(context),
arguments.positional[0].getStaticType(context));
}
@@ -8245,12 +8248,13 @@
/// null, it is an equivalent of setting the overall nullability.
@override
TypeParameterType withDeclaredNullability(Nullability declaredNullability) {
+ if (declaredNullability == this.declaredNullability) {
+ return this;
+ }
// TODO(dmitryas): Consider removing the assert.
assert(promotedBound == null,
"Can't change the nullability attribute of an intersection type.");
- return declaredNullability == this.declaredNullability
- ? this
- : new TypeParameterType(parameter, declaredNullability, promotedBound);
+ return new TypeParameterType(parameter, declaredNullability, promotedBound);
}
/// Gets the nullability of a type-parameter type based on the bound.
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 19a824a..e461ce3 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -48,6 +48,24 @@
/// If multiple members with that name are inherited and not overridden, the
/// member from the first declared supertype is returned.
Member getInterfaceMember(Class class_, Name name, {bool setter: false});
+
+ /// Returns the least upper bound of two interface types, as defined by Dart
+ /// 1.0.
+ ///
+ /// Given two interfaces I and J, let S_I be the set of superinterfaces of I,
+ /// let S_J be the set of superinterfaces of J, and let
+ /// S = (I union S_I) intersect (J union S_J). Furthermore, we define
+ /// S_n = {T | T in S and depth(T) = n} for any finite n where depth(T) is
+ /// the number of steps in the longest inheritance path from T to Object. Let
+ /// q be the largest number such that S_q has cardinality one. The least
+ /// upper bound of I and J is the sole element of S_q.
+ ///
+ /// This is called the "legacy" least upper bound to distinguish it from the
+ /// Dart 2 least upper bound, which has special behaviors in the case where
+ /// one type is a subtype of the other, or where both types are based on the
+ /// same class.
+ InterfaceType getLegacyLeastUpperBound(
+ InterfaceType type1, InterfaceType type2, Library clientLibrary);
}
/// Interface for answering various subclassing queries.
@@ -81,24 +99,6 @@
// interfaces).
List<Supertype> genericSupertypesOf(Class class_);
- /// Returns the least upper bound of two interface types, as defined by Dart
- /// 1.0.
- ///
- /// Given two interfaces I and J, let S_I be the set of superinterfaces of I,
- /// let S_J be the set of superinterfaces of J, and let
- /// S = (I union S_I) intersect (J union S_J). Furthermore, we define
- /// S_n = {T | T in S and depth(T) = n} for any finite n where depth(T) is
- /// the number of steps in the longest inheritance path from T to Object. Let
- /// q be the largest number such that S_q has cardinality one. The least
- /// upper bound of I and J is the sole element of S_q.
- ///
- /// This is called the "legacy" least upper bound to distinguish it from the
- /// Dart 2 least upper bound, which has special behaviors in the case where
- /// one type is a subtype of the other, or where both types are based on the
- /// same class.
- InterfaceType getLegacyLeastUpperBound(InterfaceType type1,
- InterfaceType type2, Library clientLibrary, CoreTypes coreTypes);
-
/// Returns the instantiation of [superclass] that is implemented by [class_],
/// or `null` if [class_] does not implement [superclass] at all.
Supertype getClassAsInstanceOf(Class class_, Class superclass);
@@ -571,8 +571,8 @@
}
@override
- InterfaceType getLegacyLeastUpperBound(InterfaceType type1,
- InterfaceType type2, Library clientLibrary, CoreTypes coreTypes) {
+ InterfaceType getLegacyLeastUpperBound(
+ InterfaceType type1, InterfaceType type2, Library clientLibrary) {
// The algorithm is: first we compute a list of superclasses for both types,
// ordered from greatest to least depth, and ordered by topological sort
// index within each depth. Due to the sort order, we can find the
@@ -669,6 +669,10 @@
? type2
: Substitution.fromInterfaceType(type2).substituteType(
info2.genericSuperType[next.classNode].asInterfaceType);
+ if (!clientLibrary.isNonNullableByDefault) {
+ superType1 = legacyErasure(coreTypes, superType1);
+ superType2 = legacyErasure(coreTypes, superType2);
+ }
if (superType1 == superType2) {
candidate = superType1.withDeclaredNullability(
uniteNullabilities(type1.nullability, type2.nullability));
@@ -715,6 +719,19 @@
@override
List<DartType> getTypeArgumentsAsInstanceOf(
InterfaceType type, Class superclass) {
+ if (type.classNode == superclass) {
+ // TODO(johnniwinther): This is necessary because [getClassAsInstanceOf]
+ // returns a [Supertype] whose type arguments are type parameter types
+ // whose nullability is set to the default nullability of the
+ // enclosing library. If for instance [type] is `A<int!>` but `A` is
+ // declared in an opt-out library, the substitution below will combine
+ // nullabilities of the type arguments in [type] with the type parameters
+ // and thus give the result `A<int*>`. See issue #42792.
+ // For now we bypass the substitution but long term we need to ensure
+ // that [getClassAsInstanceOf] doesn't cause similar problems in other
+ // situations.
+ return type.typeArguments;
+ }
Supertype castedType = getClassAsInstanceOf(type.classNode, superclass);
if (castedType == null) return null;
if (superclass.typeParameters.isEmpty) return const <DartType>[];
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 7c82be8..cc60986 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
library kernel.core_types;
+import 'package:kernel/type_algebra.dart';
+
import 'ast.dart';
import 'library_index.dart';
@@ -1254,13 +1256,10 @@
// TOP(T*) is true iff TOP(T) or OBJECT(T).
if (type.declaredNullability == Nullability.nullable ||
type.declaredNullability == Nullability.legacy) {
- DartType nonNullableType =
- type.withDeclaredNullability(Nullability.nonNullable);
- assert(
- !identical(type, nonNullableType),
- "Setting the declared nullability of type '${type}' "
- "to non-nullable was supposed to change the type, but it remained the same.");
- return isTop(nonNullableType) || isObject(nonNullableType);
+ DartType nonNullableType = unwrapNullabilityConstructor(type, this);
+ if (!identical(type, nonNullableType)) {
+ return isTop(nonNullableType) || isObject(nonNullableType);
+ }
}
// TOP(FutureOr<T>) is TOP(T).
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
new file mode 100644
index 0000000..e57f264
--- /dev/null
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -0,0 +1,1594 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+import 'dart:math' as math;
+
+import '../ast.dart'
+ show
+ BottomType,
+ Class,
+ DartType,
+ DynamicType,
+ FunctionType,
+ FutureOrType,
+ InterfaceType,
+ InvalidType,
+ Library,
+ NamedType,
+ NeverType,
+ Nullability,
+ TypeParameter,
+ TypeParameterType,
+ Variance,
+ VoidType;
+import '../class_hierarchy.dart';
+import '../core_types.dart';
+import '../type_algebra.dart';
+import '../type_environment.dart';
+import 'legacy_erasure.dart';
+
+mixin StandardBounds {
+ ClassHierarchyBase get hierarchy;
+
+ bool isSubtypeOf(DartType subtype, DartType supertype, SubtypeCheckMode mode);
+
+ bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode);
+
+ CoreTypes get coreTypes => hierarchy.coreTypes;
+
+ /// Checks the value of the MORETOP predicate for [s] and [t].
+ ///
+ /// For the definition of MORETOP see the following:
+ /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
+ bool moretop(DartType s, DartType t) {
+ assert(coreTypes.isTop(s) || coreTypes.isObject(s));
+ assert(coreTypes.isTop(t) || coreTypes.isObject(t));
+
+ // MORETOP(void, T) = true.
+ if (s is VoidType) return true;
+
+ // MORETOP(S, void) = false.
+ if (t is VoidType) return false;
+
+ // MORETOP(dynamic, T) = true.
+ if (s is DynamicType) return true;
+
+ // MORETOP(S, dynamic) = false.
+ if (t is DynamicType) return false;
+
+ // MORETOP(Object, T) = true.
+ if (s is InterfaceType &&
+ s.classNode == coreTypes.objectClass &&
+ s.declaredNullability == Nullability.nonNullable) {
+ return true;
+ }
+
+ // MORETOP(S, Object) = false.
+ if (t is InterfaceType &&
+ t.classNode == coreTypes.objectClass &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // MORETOP(S*, T*) = MORETOP(S, T).
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.legacy) {
+ DartType nonNullableS =
+ s.withDeclaredNullability(Nullability.nonNullable);
+ assert(!identical(s, nonNullableS));
+ DartType nonNullableT =
+ t.withDeclaredNullability(Nullability.nonNullable);
+ assert(!identical(t, nonNullableT));
+ return moretop(nonNullableS, nonNullableT);
+ }
+
+ // MORETOP(S, T*) = true.
+ if (s.declaredNullability == Nullability.nonNullable &&
+ t.declaredNullability == Nullability.legacy) {
+ return true;
+ }
+
+ // MORETOP(S*, T) = false.
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // MORETOP(S?, T?) == MORETOP(S, T).
+ if (s.declaredNullability == Nullability.nullable &&
+ t.declaredNullability == Nullability.nullable) {
+ DartType nonNullableS =
+ s.withDeclaredNullability(Nullability.nonNullable);
+ assert(!identical(s, nonNullableS));
+ DartType nonNullableT =
+ t.withDeclaredNullability(Nullability.nonNullable);
+ assert(!identical(t, nonNullableT));
+ return moretop(nonNullableS, nonNullableT);
+ }
+
+ // MORETOP(S, T?) = true.
+ if (s.declaredNullability == Nullability.nonNullable &&
+ t.declaredNullability == Nullability.nullable) {
+ return true;
+ }
+
+ // MORETOP(S?, T) = false.
+ if (s.declaredNullability == Nullability.nullable &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // TODO(dmitryas): Update the following after the spec is updated.
+ if (s.declaredNullability == Nullability.nullable &&
+ t.declaredNullability == Nullability.legacy) {
+ return true;
+ }
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.nullable) {
+ return false;
+ }
+
+ // MORETOP(FutureOr<S>, FutureOr<T>) = MORETOP(S, T).
+ if (s is FutureOrType &&
+ s.declaredNullability == Nullability.nonNullable &&
+ t is FutureOrType &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return moretop(s.typeArgument, t.typeArgument);
+ }
+
+ throw new UnsupportedError("moretop($s, $t)");
+ }
+
+ /// Checks the value of the MOREBOTTOM predicate for [s] and [t].
+ ///
+ /// For the definition of MOREBOTTOM see the following:
+ /// https://github.com/dart-lang/language/blob/master/resources/type-system/upper-lower-bounds.md#helper-predicates
+ bool morebottom(DartType s, DartType t) {
+ assert(coreTypes.isBottom(s) || coreTypes.isNull(s));
+ assert(coreTypes.isBottom(t) || coreTypes.isNull(t));
+
+ // MOREBOTTOM(Never, T) = true.
+ if (s is NeverType && s.declaredNullability == Nullability.nonNullable) {
+ return true;
+ }
+
+ // MOREBOTTOM(S, Never) = false.
+ if (t is NeverType && t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // MOREBOTTOM(Null, T) = true.
+ if (s == coreTypes.nullType) {
+ return true;
+ }
+
+ // MOREBOTTOM(S, Null) = false.
+ if (t == coreTypes.nullType) {
+ return false;
+ }
+
+ // MOREBOTTOM(S?, T?) = MOREBOTTOM(S, T).
+ if (t.declaredNullability == Nullability.nullable &&
+ s.declaredNullability == Nullability.nullable) {
+ DartType nonNullableS =
+ s.withDeclaredNullability(Nullability.nonNullable);
+ assert(s != nonNullableS);
+ DartType nonNullableT =
+ t.withDeclaredNullability(Nullability.nonNullable);
+ assert(t != nonNullableT);
+ return morebottom(nonNullableS, nonNullableT);
+ }
+
+ // MOREBOTTOM(S, T?) = true.
+ if (s.declaredNullability == Nullability.nonNullable &&
+ t.declaredNullability == Nullability.nullable) {
+ return true;
+ }
+
+ // MOREBOTTOM(S?, T) = false.
+ if (s.declaredNullability == Nullability.nullable &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // MOREBOTTOM(S*, T*) = MOREBOTTOM(S, T)
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.legacy) {
+ DartType nonNullableS =
+ s.withDeclaredNullability(Nullability.nonNullable);
+ assert(s != nonNullableS);
+ DartType nonNullableT =
+ t.withDeclaredNullability(Nullability.nonNullable);
+ assert(t != nonNullableT);
+ return morebottom(nonNullableS, nonNullableT);
+ }
+
+ // MOREBOTTOM(S, T*) = true.
+ if (s.declaredNullability == Nullability.nonNullable &&
+ t.declaredNullability == Nullability.legacy) {
+ return true;
+ }
+
+ // MOREBOTTOM(S*, T) = false.
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.nonNullable) {
+ return false;
+ }
+
+ // TODO(dmitryas): Update the following after the spec is updated.
+ if (s.declaredNullability == Nullability.nullable &&
+ t.declaredNullability == Nullability.legacy) {
+ return true;
+ }
+ if (s.declaredNullability == Nullability.legacy &&
+ t.declaredNullability == Nullability.nullable) {
+ return false;
+ }
+
+ // MOREBOTTOM(X&S, Y&T) = MOREBOTTOM(S, T).
+ if (s is TypeParameterType &&
+ s.promotedBound != null &&
+ t is TypeParameterType &&
+ t.promotedBound != null) {
+ return morebottom(s.promotedBound, t.promotedBound);
+ }
+
+ // MOREBOTTOM(X&S, T) = true.
+ if (s is TypeParameterType && s.promotedBound != null) {
+ return true;
+ }
+
+ // MOREBOTTOM(S, X&T) = false.
+ if (t is TypeParameterType && t.promotedBound != null) {
+ return false;
+ }
+
+ // MOREBOTTOM(X extends S, Y extends T) = MOREBOTTOM(S, T).
+ if (s is TypeParameterType && t is TypeParameterType) {
+ assert(s.promotedBound == null);
+ assert(t.promotedBound == null);
+ return morebottom(s.parameter.bound, t.parameter.bound);
+ }
+
+ throw new UnsupportedError("morebottom($s, $t)");
+ }
+
+ /// Computes the standard lower bound of [type1] and [type2].
+ ///
+ /// Standard lower bound is a lower bound function that imposes an
+ /// ordering on the top types `void`, `dynamic`, and `object`. This function
+ /// additionally handles the unknown type that appears during type inference.
+ DartType getStandardLowerBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ if (type1 is InvalidType || type2 is InvalidType) {
+ return const InvalidType();
+ }
+ if (clientLibrary.isNonNullableByDefault) {
+ return _getNullabilityAwareStandardLowerBound(
+ type1, type2, clientLibrary);
+ }
+ return _getNullabilityObliviousStandardLowerBound(
+ legacyErasure(coreTypes, type1),
+ legacyErasure(coreTypes, type2),
+ clientLibrary);
+ }
+
+ DartType _getNullabilityAwareStandardLowerBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // DOWN(T, T) = T.
+ if (identical(type1, type2)) return type1;
+
+ return getNullabilityAwareStandardLowerBoundInternal(
+ type1, type2, clientLibrary);
+ }
+
+ DartType getNullabilityAwareStandardLowerBoundInternal(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // DOWN(T1, T2) where TOP(T1) and TOP(T2) =
+ // T1 if MORETOP(T2, T1)
+ // T2 otherwise
+ // DOWN(T1, T2) = T2 if TOP(T1)
+ // DOWN(T1, T2) = T1 if TOP(T2)
+ if (coreTypes.isTop(type1)) {
+ if (coreTypes.isTop(type2)) return moretop(type2, type1) ? type1 : type2;
+ return type2;
+ } else if (coreTypes.isTop(type2)) {
+ return type1;
+ }
+
+ // DOWN(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
+ // T1 if MOREBOTTOM(T1, T2)
+ // T2 otherwise
+ // DOWN(T1, T2) = T2 if BOTTOM(T2)
+ // DOWN(T1, T2) = T1 if BOTTOM(T1)
+ if (coreTypes.isBottom(type1)) {
+ if (coreTypes.isBottom(type2)) {
+ return morebottom(type1, type2) ? type1 : type2;
+ }
+ return type1;
+ } else if (coreTypes.isBottom(type2)) {
+ return type2;
+ }
+
+ // DOWN(T1, T2) where NULL(T1) and NULL(T2) =
+ // T1 if MOREBOTTOM(T1, T2)
+ // T2 otherwise
+ // DOWN(Null, T2) =
+ // Null if Null <: T2
+ // Never otherwise
+ // DOWN(T1, Null) =
+ // Null if Null <: T1
+ // Never otherwise
+ if (coreTypes.isNull(type1)) {
+ if (coreTypes.isNull(type2)) {
+ return morebottom(type1, type2) ? type1 : type2;
+ }
+ Nullability type2Nullability = type2.declaredNullability;
+ if (type2Nullability == Nullability.legacy ||
+ type2Nullability == Nullability.nullable) {
+ return type1;
+ }
+ return const NeverType(Nullability.nonNullable);
+ } else if (coreTypes.isNull(type2)) {
+ Nullability type1Nullability = type1.declaredNullability;
+ if (type1Nullability == Nullability.legacy ||
+ type1Nullability == Nullability.nullable) {
+ return type2;
+ }
+ return const NeverType(Nullability.nonNullable);
+ }
+
+ // DOWN(T1, T2) where OBJECT(T1) and OBJECT(T2) =
+ // T1 if MORETOP(T2, T1)
+ // T2 otherwise
+ // DOWN(T1, T2) where OBJECT(T1) =
+ // T2 if T2 is non-nullable
+ // NonNull(T2) if NonNull(T2) is non-nullable
+ // Never otherwise
+ // DOWN(T1, T2) where OBJECT(T2) =
+ // T1 if T1 is non-nullable
+ // NonNull(T1) if NonNull(T1) is non-nullable
+ // Never otherwise
+ if (coreTypes.isObject(type1)) {
+ if (coreTypes.isObject(type2)) {
+ return moretop(type2, type1) ? type1 : type2;
+ }
+ if (type2.declaredNullability == Nullability.nonNullable) {
+ return type2;
+ }
+ type2 = type2.withDeclaredNullability(Nullability.nonNullable);
+ if (type2.declaredNullability == Nullability.nonNullable) {
+ return type2;
+ }
+ return const NeverType(Nullability.nonNullable);
+ } else if (coreTypes.isObject(type2)) {
+ if (type1.declaredNullability == Nullability.nonNullable) {
+ return type1;
+ }
+ type1 = type1.withDeclaredNullability(Nullability.nonNullable);
+ if (type1.declaredNullability == Nullability.nonNullable) {
+ return type1;
+ }
+ return const NeverType(Nullability.nonNullable);
+ }
+
+ // The effect of the following rules is accounted for in the code below via
+ // the invocations of intersectNullabilities.
+ // DOWN(T1*, T2*) = S* where S is DOWN(T1, T2)
+ // DOWN(T1*, T2?) = S* where S is DOWN(T1, T2)
+ // DOWN(T1?, T2*) = S* where S is DOWN(T1, T2)
+ // DOWN(T1*, T2) = S where S is DOWN(T1, T2)
+ // DOWN(T1, T2*) = S where S is DOWN(T1, T2)
+ // DOWN(T1?, T2?) = S? where S is DOWN(T1, T2)
+ // DOWN(T1?, T2) = S where S is DOWN(T1, T2)
+ // DOWN(T1, T2?) = S where S is DOWN(T1, T2)
+
+ if (type1 is FunctionType && type2 is FunctionType) {
+ return _getNullabilityAwareFunctionStandardLowerBound(
+ type1, type2, clientLibrary);
+ }
+
+ // DOWN(T1, T2) = T1 if T1 <: T2.
+ // DOWN(T1, T2) = T2 if T2 <: T1.
+
+ // We use the non-nullable variants of the two types to determine T1 <: T2
+ // without using the nullability of the outermost type. The result uses
+ // [intersectNullabilities] to compute the resulting type if the subtype
+ // relation is established.
+ DartType nonNullableType1 =
+ type1.withDeclaredNullability(Nullability.nonNullable);
+ DartType nonNullableType2 =
+ type2.withDeclaredNullability(Nullability.nonNullable);
+ if (isSubtypeOf(nonNullableType1, nonNullableType2,
+ SubtypeCheckMode.withNullabilities)) {
+ return type1.withDeclaredNullability(intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ if (isSubtypeOf(nonNullableType2, nonNullableType1,
+ SubtypeCheckMode.withNullabilities)) {
+ return type2.withDeclaredNullability(intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
+ if (type1 is FutureOrType) {
+ if (type2 is FutureOrType) {
+ // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+ DartType argument = getStandardLowerBound(
+ type1.typeArgument, type2.typeArgument, clientLibrary);
+ return new FutureOrType(argument, argument.declaredNullability);
+ }
+ if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+ // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+ return new InterfaceType(
+ coreTypes.futureClass,
+ intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ <DartType>[
+ getStandardLowerBound(
+ type1.typeArgument, type2.typeArguments[0], clientLibrary)
+ ]);
+ }
+ // GLB(FutureOr<A>, B) == GLB(A, B)
+ return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
+ }
+ // The if-statement below handles the following rule:
+ // GLB(A, FutureOr<B>) == GLB(FutureOr<B>, A)
+ // It's broken down into sub-cases instead of making a recursive call to
+ // avoid making the checks that were already made above. Note that at this
+ // point it's not possible for type1 to be a FutureOr.
+ if (type2 is FutureOrType) {
+ if (type1 is InterfaceType && type1.classNode == coreTypes.futureClass) {
+ // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
+ return new InterfaceType(
+ coreTypes.futureClass,
+ intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ <DartType>[
+ getStandardLowerBound(
+ type2.typeArgument, type1.typeArguments[0], clientLibrary)
+ ]);
+ }
+ // GLB(A, FutureOr<B>) == GLB(B, A)
+ return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
+ }
+
+ // DOWN(T1, T2) = Never otherwise.
+ return new NeverType(intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ DartType _getNullabilityObliviousStandardLowerBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // Do legacy erasure on the argument, so that the result types that are
+ // computed from arguments are legacy.
+ type1 = type1 == coreTypes.nullType
+ ? type1
+ : type1.withDeclaredNullability(Nullability.legacy);
+ type2 = type2 == coreTypes.nullType
+ ? type2
+ : type2.withDeclaredNullability(Nullability.legacy);
+
+ // For all types T, SLB(T,T) = T. Note that we don't test for equality
+ // because we don't want to make the algorithm quadratic. This is ok
+ // because the check is not needed for correctness; it's just a speed
+ // optimization.
+ if (identical(type1, type2)) {
+ return type1;
+ }
+
+ return getNullabilityObliviousStandardLowerBoundInternal(
+ type1, type2, clientLibrary);
+ }
+
+ DartType getNullabilityObliviousStandardLowerBoundInternal(
+ type1, type2, clientLibrary) {
+ // SLB(void, T) = SLB(T, void) = T.
+ if (type1 is VoidType) {
+ return type2;
+ }
+ if (type2 is VoidType) {
+ return type1;
+ }
+
+ // SLB(dynamic, T) = SLB(T, dynamic) = T if T is not void.
+ if (type1 is DynamicType) {
+ return type2;
+ }
+ if (type2 is DynamicType) {
+ return type1;
+ }
+
+ // SLB(Object, T) = SLB(T, Object) = T if T is not void or dynamic.
+ if (type1 == coreTypes.objectLegacyRawType) {
+ return type2;
+ }
+ if (type2 == coreTypes.objectLegacyRawType) {
+ return type1;
+ }
+
+ // SLB(bottom, T) = SLB(T, bottom) = bottom.
+ if (type1 is BottomType) return type1;
+ if (type2 is BottomType) return type2;
+ if (type1 == coreTypes.nullType) return type1;
+ if (type2 == coreTypes.nullType) return type2;
+
+ // Function types have structural lower bounds.
+ if (type1 is FunctionType && type2 is FunctionType) {
+ return _getNullabilityObliviousFunctionStandardLowerBound(
+ type1, type2, clientLibrary);
+ }
+
+ // Otherwise, the lower bounds of two types is one of them it if it is a
+ // subtype of the other.
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+ return type1;
+ }
+
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+ return type2;
+ }
+
+ // See https://github.com/dart-lang/sdk/issues/37439#issuecomment-519654959.
+ if (type1 is FutureOrType) {
+ if (type2 is FutureOrType) {
+ // GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+ DartType argument = getStandardLowerBound(
+ type1.typeArgument, type2.typeArgument, clientLibrary);
+ return new FutureOrType(argument, argument.declaredNullability);
+ }
+ if (type2 is InterfaceType && type2.classNode == coreTypes.futureClass) {
+ // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+ return new InterfaceType(
+ coreTypes.futureClass,
+ intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ <DartType>[
+ getStandardLowerBound(
+ type1.typeArgument, type2.typeArguments[0], clientLibrary)
+ ]);
+ }
+ // GLB(FutureOr<A>, B) == GLB(A, B)
+ return getStandardLowerBound(type1.typeArgument, type2, clientLibrary);
+ }
+ // The if-statement below handles the following rule:
+ // GLB(A, FutureOr<B>) == GLB(FutureOr<B>, A)
+ // It's broken down into sub-cases instead of making a recursive call to
+ // avoid making the checks that were already made above. Note that at this
+ // point it's not possible for type1 to be a FutureOr.
+ if (type2 is FutureOrType) {
+ if (type1 is FutureOrType) {
+ // GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>
+ return new InterfaceType(
+ coreTypes.futureClass,
+ intersectNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ <DartType>[
+ getStandardLowerBound(
+ type2.typeArgument, type1.typeArgument, clientLibrary)
+ ]);
+ }
+ // GLB(A, FutureOr<B>) == GLB(B, A)
+ return getStandardLowerBound(type2.typeArgument, type1, clientLibrary);
+ }
+
+ // No subtype relation, so the lower bound is bottom.
+ return const BottomType();
+ }
+
+ /// Computes the standard upper bound of two types.
+ ///
+ /// Standard upper bound is an upper bound function that imposes an ordering
+ /// on the top types 'void', 'dynamic', and `object`. This function
+ /// additionally handles the unknown type that appears during type inference.
+ DartType getStandardUpperBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ if (type1 is InvalidType || type2 is InvalidType) {
+ return const InvalidType();
+ }
+ if (clientLibrary.isNonNullableByDefault) {
+ return _getNullabilityAwareStandardUpperBound(
+ type1, type2, clientLibrary);
+ }
+ return _getNullabilityObliviousStandardUpperBound(
+ legacyErasure(coreTypes, type1),
+ legacyErasure(coreTypes, type2),
+ clientLibrary);
+ }
+
+ DartType _getNullabilityAwareStandardUpperBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // UP(T, T) = T
+ if (identical(type1, type2)) return type1;
+
+ return getNullabilityAwareStandardUpperBoundInternal(
+ type1, type2, clientLibrary);
+ }
+
+ DartType getNullabilityAwareStandardUpperBoundInternal(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // UP(T1, T2) where TOP(T1) and TOP(T2) =
+ // T1 if MORETOP(T1, T2)
+ // T2 otherwise
+ // UP(T1, T2) = T1 if TOP(T1)
+ // UP(T1, T2) = T2 if TOP(T2)
+ if (coreTypes.isTop(type1)) {
+ if (coreTypes.isTop(type2)) return moretop(type1, type2) ? type1 : type2;
+ return type1;
+ } else if (coreTypes.isTop(type2)) {
+ return type2;
+ }
+
+ // UP(T1, T2) where BOTTOM(T1) and BOTTOM(T2) =
+ // T2 if MOREBOTTOM(T1, T2)
+ // T1 otherwise
+ // UP(T1, T2) = T2 if BOTTOM(T1)
+ // UP(T1, T2) = T1 if BOTTOM(T2)
+ if (coreTypes.isBottom(type1)) {
+ if (coreTypes.isBottom(type2)) {
+ return morebottom(type1, type2) ? type2 : type1;
+ }
+ return type2;
+ } else if (coreTypes.isBottom(type2)) {
+ return type1;
+ }
+
+ // UP(T1, T2) where NULL(T1) and NULL(T2) =
+ // T2 if MOREBOTTOM(T1, T2)
+ // T1 otherwise
+ // UP(T1, T2) where NULL(T1) =
+ // T2 if T2 is nullable
+ // T2? otherwise
+ // UP(T1, T2) where NULL(T2) =
+ // T1 if T1 is nullable
+ // T1? otherwise
+ if (coreTypes.isNull(type1)) {
+ if (coreTypes.isNull(type2)) {
+ return morebottom(type1, type2) ? type2 : type1;
+ }
+ return type2.withDeclaredNullability(Nullability.nullable);
+ } else if (coreTypes.isNull(type2)) {
+ return type1.withDeclaredNullability(Nullability.nullable);
+ }
+
+ // UP(T1, T2) where OBJECT(T1) and OBJECT(T2) =
+ // T1 if MORETOP(T1, T2)
+ // T2 otherwise
+ // UP(T1, T2) where OBJECT(T1) =
+ // T1 if T2 is non-nullable
+ // T1? otherwise
+ // UP(T1, T2) where OBJECT(T2) =
+ // T2 if T1 is non-nullable
+ // T2? otherwise
+ if (coreTypes.isObject(type1)) {
+ if (coreTypes.isObject(type2)) {
+ return moretop(type1, type2) ? type1 : type2;
+ }
+ if (type2.declaredNullability == Nullability.nonNullable) {
+ return type1;
+ }
+ return type1.withDeclaredNullability(Nullability.nullable);
+ } else if (coreTypes.isObject(type2)) {
+ if (type1.declaredNullability == Nullability.nonNullable) {
+ return type2;
+ }
+ return type2.withDeclaredNullability(Nullability.nullable);
+ }
+
+ // The effect of the following rules is accounted for in the code below via
+ // the invocations of uniteNullabilities.
+ // UP(T1*, T2*) = S* where S is UP(T1, T2)
+ // UP(T1*, T2?) = S? where S is UP(T1, T2)
+ // UP(T1?, T2*) = S? where S is UP(T1, T2)
+ // UP(T1*, T2) = S* where S is UP(T1, T2)
+ // UP(T1, T2*) = S* where S is UP(T1, T2)
+ // UP(T1?, T2?) = S? where S is UP(T1, T2)
+ // UP(T1?, T2) = S? where S is UP(T1, T2)
+ // UP(T1, T2?) = S? where S is UP(T1, T2)
+
+ if (type1 is TypeParameterType) {
+ return _getNullabilityAwareTypeParameterStandardUpperBound(
+ type1, type2, clientLibrary);
+ }
+
+ if (type2 is TypeParameterType) {
+ return _getNullabilityAwareTypeParameterStandardUpperBound(
+ type2, type1, clientLibrary);
+ }
+
+ if (type1 is FunctionType) {
+ if (type2 is FunctionType) {
+ return _getNullabilityAwareFunctionStandardUpperBound(
+ type1, type2, clientLibrary);
+ }
+
+ if (type2 is InterfaceType &&
+ type2.classNode == coreTypes.functionClass) {
+ // UP(T Function<...>(...), Function) = Function
+ return coreTypes.functionRawType(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ // UP(T Function<...>(...), T2) = Object
+ return coreTypes.objectRawType(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ } else if (type2 is FunctionType) {
+ if (type1 is InterfaceType &&
+ type1.classNode == coreTypes.functionClass) {
+ // UP(Function, T Function<...>(...)) = Function
+ return coreTypes.functionRawType(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ // UP(T1, T Function<...>(...)) = Object
+ return coreTypes.objectRawType(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ if (type1 is FutureOrType || type2 is FutureOrType) {
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+ return type2;
+ }
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+ return type1;
+ }
+ if (type1 is FutureOrType && type2 is FutureOrType) {
+ return new FutureOrType(
+ getStandardUpperBound(
+ type1.typeArgument, type2.typeArgument, clientLibrary),
+ uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ }
+
+ // UP(T1, T2) = T2 if T1 <: T2
+ // Note that both types must be class types at this point.
+ assert(type1 is InterfaceType,
+ "Expected type1 to be an interface type, got '${type1.runtimeType}'.");
+ assert(type2 is InterfaceType,
+ "Expected type2 to be an interface type, got '${type2.runtimeType}'.");
+
+ // We use the non-nullable variants of the two interfaces types to determine
+ // T1 <: T2 without using the nullability of the outermost type. The result
+ // uses [uniteNullabilities] to compute the resulting type if the subtype
+ // relation is established.
+ InterfaceType nonNonNullableType1 =
+ type1.withDeclaredNullability(Nullability.nonNullable);
+ InterfaceType nonNonNullableType2 =
+ type2.withDeclaredNullability(Nullability.nonNullable);
+
+ if (isSubtypeOf(nonNonNullableType1, nonNonNullableType2,
+ SubtypeCheckMode.withNullabilities)) {
+ return type2.withDeclaredNullability(
+ uniteNullabilities(type1.nullability, type2.nullability));
+ }
+
+ // UP(T1, T2) = T1 if T2 <: T1
+ // Note that both types must be class types at this point.
+ if (isSubtypeOf(nonNonNullableType2, nonNonNullableType1,
+ SubtypeCheckMode.withNullabilities)) {
+ return type1.withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+
+ // UP(C<T0, ..., Tn>, C<S0, ..., Sn>) = C<R0,..., Rn> where Ri is UP(Ti, Si)
+ if (type1 is InterfaceType && type2 is InterfaceType) {
+ Class klass = type1.classNode;
+ if (type2.classNode == klass) {
+ int n = klass.typeParameters.length;
+ List<DartType> leftArguments = type1.typeArguments;
+ List<DartType> rightArguments = type2.typeArguments;
+ List<DartType> typeArguments = new List<DartType>(n);
+ for (int i = 0; i < n; ++i) {
+ int variance = klass.typeParameters[i].variance;
+ if (variance == Variance.contravariant) {
+ typeArguments[i] = _getNullabilityAwareStandardLowerBound(
+ leftArguments[i], rightArguments[i], clientLibrary);
+ } else if (variance == Variance.invariant) {
+ if (!areMutualSubtypes(leftArguments[i], rightArguments[i],
+ SubtypeCheckMode.withNullabilities)) {
+ return hierarchy.getLegacyLeastUpperBound(
+ type1, type2, clientLibrary);
+ }
+ } else {
+ typeArguments[i] = _getNullabilityAwareStandardUpperBound(
+ leftArguments[i], rightArguments[i], clientLibrary);
+ }
+ }
+ return new InterfaceType(
+ klass,
+ uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ typeArguments);
+ }
+ }
+
+ // UP(C0<T0, ..., Tn>, C1<S0, ..., Sk>)
+ // = least upper bound of two interfaces as in Dart 1.
+ return hierarchy.getLegacyLeastUpperBound(type1, type2, clientLibrary);
+ }
+
+ /// Computes the nullability-aware lower bound of two function types.
+ ///
+ /// The algorithm is defined as follows:
+ /// DOWN(
+ /// <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k) -> T0,
+ /// <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1l) -> T1)
+ /// =
+ /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
+ /// if:
+ /// each B0i and B1i are equal types (syntactically),
+ /// q is max(k, l),
+ /// R0 is DOWN(T0, T1),
+ /// B2i is B0i,
+ /// P2i is UP(P0i, P1i) for i <= than min(k, l),
+ /// P2i is P0i for k < i <= q,
+ /// P2i is P1i for l < i <= q, and
+ /// P2i is optional if P0i or P1i is optional.
+ ///
+ /// DOWN(
+ /// <X0 extends B00, ..., Xm extends B0m>(P00, ..., P0k, Named0) -> T0,
+ /// <X0 extends B10, ..., Xm extends B1m>(P10, ..., P1k, Named1) -> T1)
+ /// =
+ /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
+ /// if:
+ /// each B0i and B1i are equal types (syntactically),
+ /// R0 is DOWN(T0, T1),
+ /// B2i is B0i,
+ /// P2i is UP(P0i, P1i),
+ /// Named2 contains R2i xi for each xi in both Named0 and Named1,
+ /// where R0i xi is in Named0,
+ /// where R1i xi is in Named1,
+ /// and R2i is UP(R0i, R1i),
+ /// and R2i xi is required if xi is required in both Named0 and Named1,
+ /// Named2 contains R0i xi for each xi in Named0 and not Named1,
+ /// where xi is optional in Named2,
+ /// Named2 contains R1i xi for each xi in Named1 and not Named0, and
+ /// where xi is optional in Named2.
+ /// DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
+ DartType _getNullabilityAwareFunctionStandardLowerBound(
+ FunctionType f, FunctionType g, Library clientLibrary) {
+ bool haveNamed =
+ f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
+ bool haveOptionalPositional =
+ f.requiredParameterCount < f.positionalParameters.length ||
+ g.requiredParameterCount < g.positionalParameters.length;
+
+ // The fallback result for whenever the following rule applies:
+ // DOWN(T Function<...>(...), S Function<...>(...)) = Never otherwise.
+ final DartType fallbackResult = new NeverType(
+ intersectNullabilities(f.declaredNullability, g.declaredNullability));
+
+ if (haveNamed && haveOptionalPositional) return fallbackResult;
+ if (haveNamed &&
+ f.positionalParameters.length != g.positionalParameters.length) {
+ return fallbackResult;
+ }
+
+ int m = f.typeParameters.length;
+ bool boundsMatch = false;
+ Substitution substitution = Substitution.empty;
+ if (g.typeParameters.length == m) {
+ boundsMatch = true;
+ if (m != 0) {
+ Map<TypeParameter, DartType> substitutionMap =
+ <TypeParameter, DartType>{};
+ for (int i = 0; i < m; ++i) {
+ substitutionMap[g.typeParameters[i]] =
+ new TypeParameterType.forAlphaRenaming(
+ g.typeParameters[i], f.typeParameters[i]);
+ }
+ substitution = Substitution.fromMap(substitutionMap);
+ for (int i = 0; i < m && boundsMatch; ++i) {
+ // TODO(dmitryas): Figure out if a procedure for syntactic equality
+ // should be used instead.
+ if (!areMutualSubtypes(
+ f.typeParameters[i].bound,
+ substitution.substituteType(g.typeParameters[i].bound),
+ SubtypeCheckMode.withNullabilities)) {
+ boundsMatch = false;
+ }
+ }
+ }
+ }
+ if (!boundsMatch) return fallbackResult;
+ int maxPos =
+ math.max(f.positionalParameters.length, g.positionalParameters.length);
+ int minPos =
+ math.min(f.positionalParameters.length, g.positionalParameters.length);
+
+ List<TypeParameter> typeParameters = f.typeParameters;
+
+ List<DartType> positionalParameters =
+ new List<DartType>.filled(maxPos, null);
+ for (int i = 0; i < minPos; ++i) {
+ positionalParameters[i] = _getNullabilityAwareStandardUpperBound(
+ f.positionalParameters[i],
+ substitution.substituteType(g.positionalParameters[i]),
+ clientLibrary);
+ }
+ for (int i = minPos; i < f.positionalParameters.length; ++i) {
+ positionalParameters[i] = f.positionalParameters[i];
+ }
+ for (int i = minPos; i < g.positionalParameters.length; ++i) {
+ positionalParameters[i] =
+ substitution.substituteType(g.positionalParameters[i]);
+ }
+
+ List<NamedType> namedParameters = <NamedType>[];
+ {
+ // Assuming that the named parameters of both types are sorted
+ // lexicographically.
+ int i = 0;
+ int j = 0;
+ while (i < f.namedParameters.length && j < g.namedParameters.length) {
+ NamedType named1 = f.namedParameters[i];
+ NamedType named2 = g.namedParameters[j];
+ int order = named1.name.compareTo(named2.name);
+ NamedType named;
+ if (order < 0) {
+ named = new NamedType(named1.name, named1.type, isRequired: false);
+ ++i;
+ } else if (order > 0) {
+ named = !named2.isRequired
+ ? named2
+ : new NamedType(
+ named2.name, substitution.substituteType(named2.type),
+ isRequired: false);
+ ++j;
+ } else {
+ named = new NamedType(
+ named1.name,
+ _getNullabilityAwareStandardUpperBound(named1.type,
+ substitution.substituteType(named2.type), clientLibrary),
+ isRequired: named1.isRequired && named2.isRequired);
+ ++i;
+ ++j;
+ }
+ namedParameters.add(named);
+ }
+ while (i < f.namedParameters.length) {
+ NamedType named1 = f.namedParameters[i];
+ namedParameters.add(!named1.isRequired
+ ? named1
+ : new NamedType(named1.name, named1.type, isRequired: false));
+ ++i;
+ }
+ while (j < g.namedParameters.length) {
+ NamedType named2 = g.namedParameters[j];
+ namedParameters.add(new NamedType(
+ named2.name, substitution.substituteType(named2.type),
+ isRequired: false));
+ ++j;
+ }
+ }
+
+ DartType returnType = _getNullabilityAwareStandardLowerBound(
+ f.returnType, substitution.substituteType(g.returnType), clientLibrary);
+
+ return new FunctionType(positionalParameters, returnType,
+ intersectNullabilities(f.declaredNullability, g.declaredNullability),
+ namedParameters: namedParameters,
+ typeParameters: typeParameters,
+ requiredParameterCount: minPos);
+ }
+
+ /// Computes the nullability-aware lower bound of two function types.
+ ///
+ /// UP(
+ /// <X0 extends B00, ... Xm extends B0m>(P00, ... P0k) -> T0,
+ /// <X0 extends B10, ... Xm extends B1m>(P10, ... P1l) -> T1)
+ /// =
+ /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2q) -> R0
+ /// if:
+ /// each B0i and B1i are equal types (syntactically)
+ /// Both have the same number of required positional parameters
+ /// q is min(k, l)
+ /// R0 is UP(T0, T1)
+ /// B2i is B0i
+ /// P2i is DOWN(P0i, P1i)
+ /// UP(
+ /// <X0 extends B00, ... Xm extends B0m>(P00, ... P0k, Named0) -> T0,
+ /// <X0 extends B10, ... Xm extends B1m>(P10, ... P1k, Named1) -> T1)
+ /// =
+ /// <X0 extends B20, ..., Xm extends B2m>(P20, ..., P2k, Named2) -> R0
+ /// if:
+ /// each B0i and B1i are equal types (syntactically)
+ /// All positional parameters are required
+ /// R0 is UP(T0, T1)
+ /// B2i is B0i
+ /// P2i is DOWN(P0i, P1i)
+ /// Named0 contains R0i xi
+ /// if R1i xi is a required named parameter in Named1
+ /// Named1 contains R1i xi
+ /// if R0i xi is a required named parameter in Named0
+ /// Named2 contains exactly R2i xi
+ /// for each xi in both Named0 and Named1
+ /// where R0i xi is in Named0
+ /// where R1i xi is in Named1
+ /// and R2i is DOWN(R0i, R1i)
+ /// and R2i xi is required
+ /// if xi is required in either Named0 or Named1
+ /// UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
+ DartType _getNullabilityAwareFunctionStandardUpperBound(
+ FunctionType f, FunctionType g, Library clientLibrary) {
+ bool haveNamed =
+ f.namedParameters.isNotEmpty || g.namedParameters.isNotEmpty;
+ bool haveOptionalPositional =
+ f.requiredParameterCount < f.positionalParameters.length ||
+ g.requiredParameterCount < g.positionalParameters.length;
+
+ // The return value for whenever the following applies:
+ // UP(T Function<...>(...), S Function<...>(...)) = Function otherwise
+ final DartType fallbackResult = coreTypes.functionRawType(
+ uniteNullabilities(f.declaredNullability, g.declaredNullability));
+
+ if (haveNamed && haveOptionalPositional) return fallbackResult;
+ if (!haveNamed && f.requiredParameterCount != g.requiredParameterCount) {
+ return fallbackResult;
+ }
+ // Here we perform a quick check on the function types to figure out if we
+ // can compute a non-trivial upper bound for them. The check isn't merged
+ // with the computation of the non-trivial upper bound itself to avoid
+ // performing unnecessary computations.
+ if (haveNamed) {
+ if (f.positionalParameters.length != g.positionalParameters.length) {
+ return fallbackResult;
+ }
+ // Assuming that the named parameters are sorted lexicographically in
+ // both type1 and type2.
+ int i = 0;
+ int j = 0;
+ while (i < f.namedParameters.length && j < g.namedParameters.length) {
+ NamedType named1 = f.namedParameters[i];
+ NamedType named2 = g.namedParameters[j];
+ int order = named1.name.compareTo(named2.name);
+ if (order < 0) {
+ if (named1.isRequired) return fallbackResult;
+ ++i;
+ } else if (order > 0) {
+ if (named2.isRequired) return fallbackResult;
+ ++j;
+ } else {
+ ++i;
+ ++j;
+ }
+ }
+ while (i < f.namedParameters.length) {
+ if (f.namedParameters[i].isRequired) return fallbackResult;
+ ++i;
+ }
+ while (j < g.namedParameters.length) {
+ if (g.namedParameters[j].isRequired) return fallbackResult;
+ ++j;
+ }
+ }
+
+ int m = f.typeParameters.length;
+ bool boundsMatch = false;
+ Substitution substitution = Substitution.empty;
+ if (g.typeParameters.length == m) {
+ boundsMatch = true;
+ if (m != 0) {
+ Map<TypeParameter, DartType> substitutionMap =
+ <TypeParameter, DartType>{};
+ for (int i = 0; i < m; ++i) {
+ substitutionMap[g.typeParameters[i]] =
+ new TypeParameterType.forAlphaRenaming(
+ g.typeParameters[i], f.typeParameters[i]);
+ }
+ substitution = Substitution.fromMap(substitutionMap);
+ for (int i = 0; i < m && boundsMatch; ++i) {
+ // TODO(dmitryas): Figure out if a procedure for syntactic
+ // equality should be used instead.
+ if (!areMutualSubtypes(
+ f.typeParameters[i].bound,
+ substitution.substituteType(g.typeParameters[i].bound),
+ SubtypeCheckMode.withNullabilities)) {
+ boundsMatch = false;
+ }
+ }
+ }
+ }
+ if (!boundsMatch) return fallbackResult;
+ int minPos =
+ math.min(f.positionalParameters.length, g.positionalParameters.length);
+
+ List<TypeParameter> typeParameters = f.typeParameters;
+
+ List<DartType> positionalParameters =
+ new List<DartType>.filled(minPos, null);
+ for (int i = 0; i < minPos; ++i) {
+ positionalParameters[i] = _getNullabilityAwareStandardLowerBound(
+ f.positionalParameters[i],
+ substitution.substituteType(g.positionalParameters[i]),
+ clientLibrary);
+ }
+
+ List<NamedType> namedParameters = <NamedType>[];
+ {
+ // Assuming that the named parameters of both types are sorted
+ // lexicographically.
+ int i = 0;
+ int j = 0;
+ while (i < f.namedParameters.length && j < g.namedParameters.length) {
+ NamedType named1 = f.namedParameters[i];
+ NamedType named2 = g.namedParameters[j];
+ int order = named1.name.compareTo(named2.name);
+ if (order < 0) {
+ ++i;
+ } else if (order > 0) {
+ ++j;
+ } else {
+ namedParameters.add(new NamedType(
+ named1.name,
+ _getNullabilityAwareStandardLowerBound(named1.type,
+ substitution.substituteType(named2.type), clientLibrary),
+ isRequired: named1.isRequired || named2.isRequired));
+ ++i;
+ ++j;
+ }
+ }
+ }
+
+ DartType returnType = _getNullabilityAwareStandardUpperBound(
+ f.returnType, substitution.substituteType(g.returnType), clientLibrary);
+
+ return new FunctionType(positionalParameters, returnType,
+ uniteNullabilities(f.declaredNullability, g.declaredNullability),
+ namedParameters: namedParameters,
+ typeParameters: typeParameters,
+ requiredParameterCount: f.requiredParameterCount);
+ }
+
+ DartType _getNullabilityAwareTypeParameterStandardUpperBound(
+ TypeParameterType type1, DartType type2, Library clientLibrary) {
+ if (type1.promotedBound == null) {
+ // UP(X1 extends B1, T2) =
+ // T2 if X1 <: T2
+ // otherwise X1 if T2 <: X1
+ // otherwise UP(B1[Object/X1], T2)
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+ return type2.withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+ return type1.withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
+ type1.parameter: coreTypes.objectNonNullableRawType
+ };
+ return _getNullabilityAwareStandardUpperBound(
+ substitute(type1.parameter.bound, substitution),
+ type2,
+ clientLibrary)
+ .withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ } else {
+ // UP(X1 & B1, T2) =
+ // T2 if X1 <: T2
+ // otherwise X1 if T2 <: X1
+ // otherwise UP(B1[Object/X1], T2)
+ DartType demoted =
+ new TypeParameterType(type1.parameter, type1.declaredNullability);
+ if (isSubtypeOf(demoted, type2, SubtypeCheckMode.withNullabilities)) {
+ return type2.withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ if (isSubtypeOf(type2, demoted, SubtypeCheckMode.withNullabilities)) {
+ return demoted.withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{
+ type1.parameter: coreTypes.objectNonNullableRawType
+ };
+ return _getNullabilityAwareStandardUpperBound(
+ substitute(type1.promotedBound, substitution),
+ type2,
+ clientLibrary)
+ .withDeclaredNullability(uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ }
+
+ DartType _getNullabilityObliviousStandardUpperBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ /*assert(type1 == legacyErasure(coreTypes, type1),
+ "Non-legacy type $type1 in inference.");
+ assert(type2 == legacyErasure(coreTypes, type2),
+ "Non-legacy type $type2 in inference.");*/
+ // For all types T, SUB(T,T) = T. Note that we don't test for equality
+ // because we don't want to make the algorithm quadratic. This is ok
+ // because the check is not needed for correctness; it's just a speed
+ // optimization.
+ if (identical(type1, type2)) {
+ return type1;
+ }
+
+ return getNullabilityObliviousStandardUpperBoundInternal(
+ type1, type2, clientLibrary);
+ }
+
+ DartType getNullabilityObliviousStandardUpperBoundInternal(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // SUB(void, T) = SUB(T, void) = void.
+ if (type1 is VoidType) {
+ return type1;
+ }
+ if (type2 is VoidType) {
+ return type2;
+ }
+
+ // SUB(dynamic, T) = SUB(T, dynamic) = dynamic if T is not void.
+ if (type1 is DynamicType) {
+ return type1;
+ }
+ if (type2 is DynamicType) {
+ return type2;
+ }
+
+ // SUB(Object, T) = SUB(T, Object) = Object if T is not void or dynamic.
+ if (type1 == coreTypes.objectLegacyRawType) {
+ return type1;
+ }
+ if (type2 == coreTypes.objectLegacyRawType) {
+ return type2;
+ }
+
+ // SUB(bottom, T) = SUB(T, bottom) = T.
+ if (type1 is BottomType) return type2;
+ if (type2 is BottomType) return type1;
+ if (type1 == coreTypes.nullType) return type2;
+ if (type2 == coreTypes.nullType) return type1;
+
+ if (type1 is TypeParameterType || type2 is TypeParameterType) {
+ return _getNullabilityObliviousTypeParameterStandardUpperBound(
+ type1, type2, clientLibrary);
+ }
+
+ // The standard upper bound of a function type and an interface type T is
+ // the standard upper bound of Function and T.
+ if (type1 is FunctionType &&
+ (type2 is InterfaceType || type2 is FutureOrType)) {
+ type1 = coreTypes.functionLegacyRawType;
+ }
+ if (type2 is FunctionType &&
+ (type1 is InterfaceType || type2 is FutureOrType)) {
+ type2 = coreTypes.functionLegacyRawType;
+ }
+
+ // At this point type1 and type2 should both either be interface types or
+ // function types.
+ if (type1 is InterfaceType && type2 is InterfaceType) {
+ return _getInterfaceStandardUpperBound(type1, type2, clientLibrary);
+ }
+
+ if (type1 is FunctionType && type2 is FunctionType) {
+ return _getNullabilityObliviousFunctionStandardUpperBound(
+ type1, type2, clientLibrary);
+ }
+
+ if (type1 is FutureOrType || type2 is FutureOrType) {
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+ return type2;
+ }
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+ return type1;
+ }
+ if (type1 is FutureOrType && type2 is FutureOrType) {
+ return new FutureOrType(
+ getStandardUpperBound(
+ type1.typeArgument, type2.typeArgument, clientLibrary),
+ uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability));
+ }
+ }
+
+ if (type1 is InvalidType || type2 is InvalidType) {
+ return const InvalidType();
+ }
+
+ // Should never happen. As a defensive measure, return the dynamic type.
+ assert(false, "type1 = $type1; type2 = $type2");
+ return const DynamicType();
+ }
+
+ /// Compute the standard lower bound of function types [f] and [g].
+ ///
+ /// The spec rules for SLB on function types, informally, are pretty simple:
+ ///
+ /// - If a parameter is required in both, it stays required.
+ ///
+ /// - If a positional parameter is optional or missing in one, it becomes
+ /// optional. (This is because we're trying to build a function type which
+ /// is a subtype of both [f] and [g], meaning it accepts all possible inputs
+ /// that [f] and [g] accept.)
+ ///
+ /// - Named parameters are unioned together.
+ ///
+ /// - For any parameter that exists in both functions, use the SUB of them as
+ /// the resulting parameter type.
+ ///
+ /// - Use the SLB of their return types.
+ DartType _getNullabilityObliviousFunctionStandardLowerBound(
+ FunctionType f, FunctionType g, Library clientLibrary) {
+ // TODO(rnystrom,paulberry): Right now, this assumes f and g do not have any
+ // type parameters. Revisit that in the presence of generic methods.
+
+ // Calculate the SUB of each corresponding pair of parameters.
+ int totalPositional =
+ math.max(f.positionalParameters.length, g.positionalParameters.length);
+ List<DartType> positionalParameters = new List<DartType>(totalPositional);
+ for (int i = 0; i < totalPositional; i++) {
+ if (i < f.positionalParameters.length) {
+ DartType fType = f.positionalParameters[i];
+ if (i < g.positionalParameters.length) {
+ DartType gType = g.positionalParameters[i];
+ positionalParameters[i] =
+ getStandardUpperBound(fType, gType, clientLibrary);
+ } else {
+ positionalParameters[i] = fType;
+ }
+ } else {
+ positionalParameters[i] = g.positionalParameters[i];
+ }
+ }
+
+ // Parameters that are required in both functions are required in the
+ // result. Parameters that are optional or missing in either end up
+ // optional.
+ int requiredParameterCount =
+ math.min(f.requiredParameterCount, g.requiredParameterCount);
+ bool hasPositional = requiredParameterCount < totalPositional;
+
+ // Union the named parameters together.
+ List<NamedType> namedParameters = [];
+ {
+ int i = 0;
+ int j = 0;
+ while (true) {
+ if (i < f.namedParameters.length) {
+ if (j < g.namedParameters.length) {
+ String fName = f.namedParameters[i].name;
+ String gName = g.namedParameters[j].name;
+ int order = fName.compareTo(gName);
+ if (order < 0) {
+ namedParameters.add(f.namedParameters[i++]);
+ } else if (order > 0) {
+ namedParameters.add(g.namedParameters[j++]);
+ } else {
+ namedParameters.add(new NamedType(
+ fName,
+ getStandardUpperBound(f.namedParameters[i++].type,
+ g.namedParameters[j++].type, clientLibrary)));
+ }
+ } else {
+ namedParameters.addAll(f.namedParameters.skip(i));
+ break;
+ }
+ } else {
+ namedParameters.addAll(g.namedParameters.skip(j));
+ break;
+ }
+ }
+ }
+ bool hasNamed = namedParameters.isNotEmpty;
+
+ // Edge case. Dart does not support functions with both optional positional
+ // and named parameters. If we would synthesize that, give up.
+ if (hasPositional && hasNamed) return const BottomType();
+
+ // Calculate the SLB of the return type.
+ DartType returnType =
+ getStandardLowerBound(f.returnType, g.returnType, clientLibrary);
+ return new FunctionType(positionalParameters, returnType,
+ intersectNullabilities(f.declaredNullability, g.declaredNullability),
+ namedParameters: namedParameters,
+ requiredParameterCount: requiredParameterCount);
+ }
+
+ /// Compute the standard upper bound of function types [f] and [g].
+ ///
+ /// The rules for SUB on function types, informally, are pretty simple:
+ ///
+ /// - If the functions don't have the same number of required parameters,
+ /// always return `Function`.
+ ///
+ /// - Discard any optional named or positional parameters the two types do not
+ /// have in common.
+ ///
+ /// - Compute the SLB of each corresponding pair of parameter types, and the
+ /// SUB of the return types. Return a function type with those types.
+ DartType _getNullabilityObliviousFunctionStandardUpperBound(
+ FunctionType f, FunctionType g, Library clientLibrary) {
+ // TODO(rnystrom): Right now, this assumes f and g do not have any type
+ // parameters. Revisit that in the presence of generic methods.
+
+ // If F and G differ in their number of required parameters, then the
+ // standard upper bound of F and G is Function.
+ // TODO(paulberry): We could do better here, e.g.:
+ // SUB(([int]) -> void, (int) -> void) = (int) -> void
+ if (f.requiredParameterCount != g.requiredParameterCount) {
+ return new InterfaceType(
+ coreTypes.functionClass,
+ uniteNullabilities(f.declaredNullability, g.declaredNullability),
+ const <DynamicType>[]);
+ }
+ int requiredParameterCount = f.requiredParameterCount;
+
+ // Calculate the SLB of each corresponding pair of parameters.
+ // Ignore any extra optional positional parameters if one has more than the
+ // other.
+ int totalPositional =
+ math.min(f.positionalParameters.length, g.positionalParameters.length);
+ List<DartType> positionalParameters = new List<DartType>(totalPositional);
+ for (int i = 0; i < totalPositional; i++) {
+ positionalParameters[i] = getStandardLowerBound(
+ f.positionalParameters[i], g.positionalParameters[i], clientLibrary);
+ }
+
+ // Intersect the named parameters.
+ List<NamedType> namedParameters = [];
+ {
+ int i = 0;
+ int j = 0;
+ while (true) {
+ if (i < f.namedParameters.length) {
+ if (j < g.namedParameters.length) {
+ String fName = f.namedParameters[i].name;
+ String gName = g.namedParameters[j].name;
+ int order = fName.compareTo(gName);
+ if (order < 0) {
+ i++;
+ } else if (order > 0) {
+ j++;
+ } else {
+ namedParameters.add(new NamedType(
+ fName,
+ getStandardLowerBound(f.namedParameters[i++].type,
+ g.namedParameters[j++].type, clientLibrary)));
+ }
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ // Calculate the SUB of the return type.
+ DartType returnType =
+ getStandardUpperBound(f.returnType, g.returnType, clientLibrary);
+ return new FunctionType(positionalParameters, returnType,
+ uniteNullabilities(f.declaredNullability, g.declaredNullability),
+ namedParameters: namedParameters,
+ requiredParameterCount: requiredParameterCount);
+ }
+
+ DartType _getInterfaceStandardUpperBound(
+ InterfaceType type1, InterfaceType type2, Library clientLibrary) {
+ // This currently does not implement a very complete standard upper bound
+ // algorithm, but handles a couple of the very common cases that are
+ // causing pain in real code. The current algorithm is:
+ // 1. If either of the types is a supertype of the other, return it.
+ // This is in fact the best result in this case.
+ // 2. If the two types have the same class element and is implicitly or
+ // explicitly covariant, then take the pointwise standard upper bound of
+ // the type arguments. This is again the best result, except that the
+ // recursive calls may not return the true standard upper bounds. The
+ // result is guaranteed to be a well-formed type under the assumption
+ // that the input types were well-formed (and assuming that the
+ // recursive calls return well-formed types).
+ // If the variance of the type parameter is contravariant, we take the
+ // standard lower bound of the type arguments. If the variance of the
+ // type parameter is invariant, we verify if the type arguments satisfy
+ // subtyping in both directions, then choose a bound.
+ // 3. Otherwise return the spec-defined standard upper bound. This will
+ // be an upper bound, might (or might not) be least, and might
+ // (or might not) be a well-formed type.
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.withNullabilities)) {
+ return type2;
+ }
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+ return type1;
+ }
+ if (identical(type1.classNode, type2.classNode)) {
+ List<DartType> tArgs1 = type1.typeArguments;
+ List<DartType> tArgs2 = type2.typeArguments;
+ List<TypeParameter> tParams = type1.classNode.typeParameters;
+
+ assert(tArgs1.length == tArgs2.length);
+ assert(tArgs1.length == tParams.length);
+ List<DartType> tArgs = new List(tArgs1.length);
+ for (int i = 0; i < tArgs1.length; i++) {
+ if (tParams[i].variance == Variance.contravariant) {
+ tArgs[i] = getStandardLowerBound(tArgs1[i], tArgs2[i], clientLibrary);
+ } else if (tParams[i].variance == Variance.invariant) {
+ if (!areMutualSubtypes(
+ tArgs1[i], tArgs2[i], SubtypeCheckMode.withNullabilities)) {
+ // No bound will be valid, find bound at the interface level.
+ return hierarchy.getLegacyLeastUpperBound(
+ type1, type2, clientLibrary);
+ }
+ // TODO (kallentu) : Fix asymmetric bounds behavior for invariant type
+ // parameters.
+ tArgs[i] = tArgs1[i];
+ } else {
+ tArgs[i] = getStandardUpperBound(tArgs1[i], tArgs2[i], clientLibrary);
+ }
+ }
+ return new InterfaceType(
+ type1.classNode,
+ uniteNullabilities(
+ type1.declaredNullability, type2.declaredNullability),
+ tArgs);
+ }
+ return hierarchy.getLegacyLeastUpperBound(type1, type2, clientLibrary);
+ }
+
+ DartType _getNullabilityObliviousTypeParameterStandardUpperBound(
+ DartType type1, DartType type2, Library clientLibrary) {
+ // This currently just implements a simple standard upper bound to
+ // handle some common cases. It also avoids some termination issues
+ // with the naive spec algorithm. The standard upper bound of two types
+ // (at least one of which is a type parameter) is computed here as:
+ // 1. If either type is a supertype of the other, return it.
+ // 2. If the first type is a type parameter, replace it with its bound,
+ // with recursive occurrences of itself replaced with Object.
+ // The second part of this should ensure termination. Informally,
+ // each type variable instantiation in one of the arguments to the
+ // standard upper bound algorithm now strictly reduces the number
+ // of bound variables in scope in that argument position.
+ // 3. If the second type is a type parameter, do the symmetric operation
+ // to #2.
+ //
+ // It's not immediately obvious why this is symmetric in the case that both
+ // of them are type parameters. For #1, symmetry holds since subtype
+ // is antisymmetric. For #2, it's clearly not symmetric if upper bounds of
+ // bottom are allowed. Ignoring this (for various reasons, not least
+ // of which that there's no way to write it), there's an informal
+ // argument (that might even be right) that you will always either
+ // end up expanding both of them or else returning the same result no matter
+ // which order you expand them in. A key observation is that
+ // identical(expand(type1), type2) => subtype(type1, type2)
+ // and hence the contra-positive.
+ //
+ // TODO(leafp): Think this through and figure out what's the right
+ // definition. Be careful about termination.
+ //
+ // I suspect in general a reasonable algorithm is to expand the innermost
+ // type variable first. Alternatively, you could probably choose to treat
+ // it as just an instance of the interface type upper bound problem, with
+ // the "inheritance" chain extended by the bounds placed on the variables.
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
+ return type2;
+ }
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
+ return type1;
+ }
+ if (type1 is TypeParameterType) {
+ // TODO(paulberry): Analyzer collapses simple bounds in one step, i.e. for
+ // C<T extends U, U extends List>, T gets resolved directly to List. Do
+ // we need to replicate that behavior?
+ return getStandardUpperBound(
+ Substitution.fromMap({type1.parameter: coreTypes.objectLegacyRawType})
+ .substituteType(type1.parameter.bound),
+ type2,
+ clientLibrary);
+ } else if (type2 is TypeParameterType) {
+ return getStandardUpperBound(
+ type1,
+ Substitution.fromMap({type2.parameter: coreTypes.objectLegacyRawType})
+ .substituteType(type2.parameter.bound),
+ clientLibrary);
+ } else {
+ // We should only be called when at least one of the types is a
+ // TypeParameterType
+ assert(false);
+ return const DynamicType();
+ }
+ }
+}
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index a50dde0..88e6940 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -31,11 +31,28 @@
import '../type_environment.dart' show IsSubtypeOf, SubtypeCheckMode;
-class Types {
+import '../src/standard_bounds.dart';
+
+class Types with StandardBounds {
+ @override
final ClassHierarchyBase hierarchy;
Types(this.hierarchy);
+ @override
+ CoreTypes get coreTypes => hierarchy.coreTypes;
+
+ bool areMutualSubtypes(DartType s, DartType t, SubtypeCheckMode mode) {
+ IsSubtypeOf result = performNullabilityAwareMutualSubtypesCheck(s, t);
+ switch (mode) {
+ case SubtypeCheckMode.ignoringNullabilities:
+ return result.isSubtypeWhenIgnoringNullabilities();
+ case SubtypeCheckMode.withNullabilities:
+ return result.isSubtypeWhenUsingNullabilities();
+ }
+ return throw new StateError("Unhandled subtype check mode '$mode'.");
+ }
+
bool _isSubtypeFromMode(IsSubtypeOf isSubtypeOf, SubtypeCheckMode mode) {
switch (mode) {
case SubtypeCheckMode.withNullabilities:
@@ -48,6 +65,7 @@
}
/// Returns true if [s] is a subtype of [t].
+ @override
bool isSubtypeOf(DartType s, DartType t, SubtypeCheckMode mode) {
IsSubtypeOf result = performNullabilityAwareSubtypeCheck(s, t);
return _isSubtypeFromMode(result, mode);
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
index 15e0289..314803a 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/kernel/lib/transformations/mixin_full_resolution.dart
@@ -325,7 +325,7 @@
hierarchy.getDispatchTarget(lookupClass, new Name("noSuchMethod"));
String methodNameUsed = (isGetter)
? "get:$methodName"
- : (isSetter) ? "set:$methodName" : methodName;
+ : (isSetter) ? "set:$methodName=" : methodName;
if (noSuchMethod != null &&
noSuchMethod.function.positionalParameters.length == 1 &&
noSuchMethod.function.namedParameters.isEmpty) {
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 662ebfd..4661aeb 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -4,6 +4,7 @@
library kernel.type_algebra;
import 'ast.dart';
+import 'core_types.dart';
/// Returns a type where all occurrences of the given type parameters have been
/// replaced with the corresponding types.
@@ -1021,3 +1022,77 @@
@override
bool visitVoidType(VoidType node) => true;
}
+
+/// Removes the application of ? or * from the type.
+///
+/// Some types are nullable even without the application of the nullable type
+/// constructor at the top level, for example, Null or FutureOr<int?>.
+// TODO(dmitryas): Remove [coreTypes] parameter when NullType is landed.
+DartType unwrapNullabilityConstructor(DartType type, CoreTypes coreTypes) {
+ return type.accept1(const _NullabilityConstructorUnwrapper(), coreTypes);
+}
+
+/// Implementation of [unwrapNullabilityConstructor] as a visitor.
+///
+/// Implementing the function as a visitor makes the necessity of supporting a new implementation of [DartType] visible at compile time.
+// TODO(dmitryas): Remove CoreTypes as the second argument when NullType is landed.
+class _NullabilityConstructorUnwrapper
+ implements DartTypeVisitor1<DartType, CoreTypes> {
+ const _NullabilityConstructorUnwrapper();
+
+ @override
+ DartType defaultDartType(DartType node, CoreTypes coreTypes) {
+ throw new UnsupportedError(
+ "Unsupported operation: _NullabilityConstructorUnwrapper(${node.runtimeType})");
+ }
+
+ @override
+ DartType visitBottomType(BottomType node, CoreTypes coreTypes) => node;
+
+ @override
+ DartType visitDynamicType(DynamicType node, CoreTypes coreTypes) => node;
+
+ @override
+ DartType visitFunctionType(FunctionType node, CoreTypes coreTypes) {
+ return node.withDeclaredNullability(Nullability.nonNullable);
+ }
+
+ @override
+ DartType visitFutureOrType(FutureOrType node, CoreTypes coreTypes) {
+ return node.withDeclaredNullability(Nullability.nonNullable);
+ }
+
+ @override
+ DartType visitInterfaceType(InterfaceType node, CoreTypes coreTypes) {
+ return node == coreTypes.nullType
+ ? node
+ : node.withDeclaredNullability(Nullability.nonNullable);
+ }
+
+ @override
+ DartType visitInvalidType(InvalidType node, CoreTypes coreTypes) => node;
+
+ @override
+ DartType visitNeverType(NeverType node, CoreTypes coreTypes) {
+ return node.withDeclaredNullability(Nullability.nonNullable);
+ }
+
+ @override
+ DartType visitTypeParameterType(TypeParameterType node, CoreTypes coreTypes) {
+ if (node.promotedBound != null) {
+ // Intersection types don't have their own nullabilities.
+ return node;
+ } else {
+ return node.withDeclaredNullability(
+ TypeParameterType.computeNullabilityFromBound(node.parameter));
+ }
+ }
+
+ @override
+ DartType visitTypedefType(TypedefType node, CoreTypes coreTypes) {
+ return node.withDeclaredNullability(Nullability.nonNullable);
+ }
+
+ @override
+ DartType visitVoidType(VoidType node, CoreTypes coreTypes) => node;
+}
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index d5a0a2e..5db606b 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -249,7 +249,7 @@
while (type is TypeParameterType) {
type = (type as TypeParameterType).bound;
}
- if (type is BottomType) {
+ if (type is BottomType || type is NeverType || type == coreTypes.nullType) {
// The bottom type is a subtype of all types, so it should be allowed.
return Substitution.bottomForClass(superclass);
}
@@ -632,11 +632,12 @@
checkUnresolvedInvocation(receiver, node);
return handleDynamicCall(receiver, node.arguments);
} else if (target is Procedure &&
- environment.isOverloadedArithmeticOperator(target)) {
+ environment.isSpecialCasedBinaryOperator(target)) {
assert(node.arguments.positional.length == 1);
var receiver = visitExpression(node.receiver);
var argument = visitExpression(node.arguments.positional[0]);
- return environment.getTypeOfOverloadedArithmetic(receiver, argument);
+ return environment.getTypeOfSpecialCasedBinaryOperator(
+ receiver, argument);
} else {
return handleCall(node.arguments, target.getterType,
receiver: getReceiverType(node, node.receiver, node.interfaceTarget));
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 14bb59d..04d02a6 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -165,49 +165,146 @@
}
}
- /// True if [member] is a binary operator that returns an `int` if both
- /// operands are `int`, and otherwise returns `double`.
- ///
- /// This is a case of type-based overloading, which in Dart is only supported
- /// by giving special treatment to certain arithmetic operators.
- bool isOverloadedArithmeticOperator(Procedure member) {
- Class class_ = member.enclosingClass;
- if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
- String name = member.name.name;
- return name == '+' ||
- name == '-' ||
- name == '*' ||
- name == 'remainder' ||
- name == '%';
+ /// True if [member] is a binary operator whose return type is defined by
+ /// the both operand types.
+ bool isSpecialCasedBinaryOperator(Procedure member,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ Class class_ = member.enclosingClass;
+ // TODO(johnniwinther): Do we need to recognize backend implementation
+ // methods?
+ if (class_ == coreTypes.intClass ||
+ class_ == coreTypes.numClass ||
+ class_ == coreTypes.doubleClass) {
+ String name = member.name.name;
+ return name == '+' ||
+ name == '-' ||
+ name == '*' ||
+ name == 'remainder' ||
+ name == '%';
+ }
+ } else {
+ Class class_ = member.enclosingClass;
+ if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
+ String name = member.name.name;
+ return name == '+' ||
+ name == '-' ||
+ name == '*' ||
+ name == 'remainder' ||
+ name == '%';
+ }
}
return false;
}
- /// Returns the static return type of an overloaded arithmetic operator
- /// (see [isOverloadedArithmeticOperator]) given the static type of the
- /// operands.
- ///
- /// If both types are `int`, the returned type is `int`.
- /// If either type is `double`, the returned type is `double`.
- /// If both types refer to the same type variable (typically with `num` as
- /// the upper bound), then that type variable is returned.
- /// Otherwise `num` is returned.
- DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) {
- type1 = _resolveTypeParameterType(type1);
- type2 = _resolveTypeParameterType(type2);
-
- if (type1 == type2) return type1;
-
- if (type1 is InterfaceType && type2 is InterfaceType) {
- if (type1.classNode == type2.classNode) {
- return type1;
- }
- if (type1.classNode == coreTypes.doubleClass ||
- type2.classNode == coreTypes.doubleClass) {
- return coreTypes.doubleRawType(type1.nullability);
+ /// True if [member] is a ternary operator whose return type is defined by
+ /// the least upper bound of the operand types.
+ bool isSpecialCasedTernaryOperator(Procedure member,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ Class class_ = member.enclosingClass;
+ if (class_ == coreTypes.intClass || class_ == coreTypes.numClass) {
+ String name = member.name.name;
+ return name == 'clamp';
}
}
+ return false;
+ }
+ /// Returns the static return type of a special cased binary operator
+ /// (see [isSpecialCasedBinaryOperator]) given the static type of the
+ /// operands.
+ DartType getTypeOfSpecialCasedBinaryOperator(DartType type1, DartType type2,
+ {bool isNonNullableByDefault: false}) {
+ if (isNonNullableByDefault) {
+ // Let e be an expression of one of the forms e1 + e2, e1 - e2, e1 * e2,
+ // e1 % e2 or e1.remainder(e2), where the static type of e1 is a non-Never
+ // type T and T <: num, and where the static type of e2 is S and S is
+ // assignable to num. Then:
+ if (type1 is! NeverType &&
+ isSubtypeOf(type1, coreTypes.numNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ type2 is DynamicType ||
+ isSubtypeOf(type2, coreTypes.numNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If T <: double then the static type of e is double. This includes S
+ // being dynamic or Never.
+ return coreTypes.doubleNonNullableRawType;
+ } else if (type2 is! NeverType &&
+ isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If S <: double and not S <:Never, then the static type of e is
+ // double.
+ return coreTypes.doubleNonNullableRawType;
+ } else if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ type2 is! NeverType &&
+ isSubtypeOf(type2, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If T <: int , S <: int and not S <: Never, then the static type of
+ // e is int.
+ return coreTypes.intNonNullableRawType;
+ } else if (type2 is! NeverType &&
+ isSubtypeOf(type2, type1, SubtypeCheckMode.withNullabilities)) {
+ // Otherwise the static type of e is num.
+ return coreTypes.numNonNullableRawType;
+ }
+ }
+ // Otherwise the static type of e is num.
+ return coreTypes.numNonNullableRawType;
+ } else {
+ type1 = _resolveTypeParameterType(type1);
+ type2 = _resolveTypeParameterType(type2);
+
+ if (type1 == type2) return type1;
+
+ if (type1 is InterfaceType && type2 is InterfaceType) {
+ if (type1.classNode == type2.classNode) {
+ return type1;
+ }
+ if (type1.classNode == coreTypes.doubleClass ||
+ type2.classNode == coreTypes.doubleClass) {
+ return coreTypes.doubleRawType(type1.nullability);
+ }
+ }
+
+ return coreTypes.numRawType(type1.nullability);
+ }
+ }
+
+ DartType getTypeOfSpecialCasedTernaryOperator(
+ DartType type1, DartType type2, DartType type3, Library clientLibrary) {
+ if (clientLibrary.isNonNullableByDefault) {
+ // Let e be a normal invocation of the form e1.clamp(e2, e3), where the
+ // static types of e1, e2 and e3 are T1, T2 and T3 respectively, and where
+ // T1, T2, and T3 are all non-Never subtypes of num. Then:
+ if (type1 is! NeverType && type2 is! NeverType && type3 is! NeverType
+ /* We skip the check that all types are subtypes of num because, if
+ not, we'll compute the static type to be num, anyway.*/
+ ) {
+ if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type2, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type3, coreTypes.intNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If T1, T2 and T3 are all subtypes of int, the static type of e is int.
+ return coreTypes.intNonNullableRawType;
+ } else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities) &&
+ isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
+ SubtypeCheckMode.withNullabilities)) {
+ // If T1, T2 and T3 are all subtypes of double, the static type of e is double.
+ return coreTypes.doubleNonNullableRawType;
+ }
+ }
+ // Otherwise the static type of e is num.
+ return coreTypes.numNonNullableRawType;
+ }
return coreTypes.numRawType(type1.nullability);
}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 18fe5c2..52583d6 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -62,6 +62,7 @@
compiler/test/sourcemaps/stacktrace_test: Slow, Pass
dartdev/test/commands/analyze_test: Slow, Pass
dartdev/test/commands/help_test: Slow, Pass
+dartdev/test/smoke/*: Slow, Pass
dev_compiler/test/modular/*: Slow, Pass
dev_compiler/test/options/*: Skip # test needs fixes
dev_compiler/test/sourcemap/*: SkipByDesign # Skip sourcemap tests
diff --git a/pkg/vm/bin/dump_bytecode_ngrams.dart b/pkg/vm/bin/dump_bytecode_ngrams.dart
index dead72c..50ec2a4 100644
--- a/pkg/vm/bin/dump_bytecode_ngrams.dart
+++ b/pkg/vm/bin/dump_bytecode_ngrams.dart
@@ -36,11 +36,11 @@
const int _badUsageExitCode = 1;
-int main(List<String> arguments) {
+void main(List<String> arguments) {
final ArgResults options = _argParser.parse(arguments);
if ((options.rest.length != 1) || (options['output'] == null)) {
print(_usage);
- return _badUsageExitCode;
+ io.exit(_badUsageExitCode);
}
final basicBlocks = options['basic-blocks'];
@@ -54,12 +54,11 @@
if (!(new io.File(input).existsSync())) {
print("The file '$input' does not exist");
print(_usage);
- return _badUsageExitCode;
+ io.exit(_badUsageExitCode);
}
NGramReader nGramReader = new NGramReader(input);
nGramReader.readAllNGrams(windowSize,
basicBlocks: basicBlocks, mergePushes: mergePushes);
nGramReader.writeNGramStats(output, sort: sort, minCount: threshold);
- return 0;
}
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 8bcbb48..82af071 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -233,7 +233,7 @@
bool isGetter = false, isSetter = false, isMethod = false;
if (name.startsWith("set:")) {
isSetter = true;
- name = name.substring(4) + "=";
+ name = name.substring(4);
} else if (name.startsWith("get:")) {
isGetter = true;
name = name.substring(4);
diff --git a/runtime/bin/dartdev_isolate.cc b/runtime/bin/dartdev_isolate.cc
index 6e0ed3d..1f91437 100644
--- a/runtime/bin/dartdev_isolate.cc
+++ b/runtime/bin/dartdev_isolate.cc
@@ -56,7 +56,7 @@
(strncmp(script_uri, "google3://", 10) != 0));
}
-const char* DartDevIsolate::TryResolveDartDevSnapshotPath() {
+Utils::CStringUniquePtr DartDevIsolate::TryResolveDartDevSnapshotPath() {
// |dir_prefix| includes the last path seperator.
auto dir_prefix = EXEUtils::GetDirectoryPrefixFromExeName();
@@ -64,7 +64,7 @@
char* snapshot_path =
Utils::SCreate("%ssnapshots/dartdev.dart.snapshot", dir_prefix.get());
if (File::Exists(nullptr, snapshot_path)) {
- return snapshot_path;
+ return Utils::CreateCStringUniquePtr(snapshot_path);
}
free(snapshot_path);
@@ -72,12 +72,12 @@
// directories. Try to use a snapshot rom a previously built SDK.
snapshot_path = Utils::SCreate("%sdartdev.dart.snapshot", dir_prefix.get());
if (File::Exists(nullptr, snapshot_path)) {
- return snapshot_path;
+ return Utils::CreateCStringUniquePtr(snapshot_path);
}
free(snapshot_path);
Syslog::PrintErr("Could not find DartDev snapshot.\n");
- return nullptr;
+ return Utils::CreateCStringUniquePtr(nullptr);
}
void DartDevIsolate::DartDevRunner::Run(
@@ -102,9 +102,7 @@
// Clear the DartDev dart_options and replace them with the processed
// options provided by DartDev.
dart_options_->Reset();
- for (intptr_t i = 0; i < argc_; ++i) {
- dart_options_->AddArguments(const_cast<const char**>(argv_.get()), argc_);
- }
+ dart_options_->AddArguments(const_cast<const char**>(argv_.get()), argc_);
}
}
@@ -136,7 +134,6 @@
}
delete[] args;
};
-
argv_ =
std::unique_ptr<char*[], void (*)(char**)>(new char*[argc_], deleter);
for (intptr_t i = 0; i < argc_; ++i) {
@@ -176,7 +173,7 @@
// TODO(bkonyi): bring up DartDev from kernel instead of a app-jit snapshot.
// See https://github.com/dart-lang/sdk/issues/42804
- const char* dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
+ auto dartdev_path = DartDevIsolate::TryResolveDartDevSnapshotPath();
if (dartdev_path == nullptr) {
ProcessError("Failed to find DartDev snapshot.", kErrorExitCode);
return;
@@ -192,9 +189,8 @@
char* error;
Dart_Isolate dartdev_isolate = runner->create_isolate_(
- dartdev_path, "dartdev", nullptr, runner->packages_file_, &flags,
+ dartdev_path.get(), "dartdev", nullptr, runner->packages_file_, &flags,
NULL /* callback_data */, const_cast<char**>(&error));
- free(const_cast<char*>(dartdev_path));
if (dartdev_isolate == nullptr) {
ProcessError(error, kErrorExitCode);
diff --git a/runtime/bin/dartdev_isolate.h b/runtime/bin/dartdev_isolate.h
index e2ade66..ef6c780 100644
--- a/runtime/bin/dartdev_isolate.h
+++ b/runtime/bin/dartdev_isolate.h
@@ -13,6 +13,7 @@
#include "include/dart_api.h"
#include "include/dart_native_api.h"
#include "platform/globals.h"
+#include "platform/utils.h"
namespace dart {
namespace bin {
@@ -83,7 +84,7 @@
private:
// Attempts to find the DartDev snapshot. If the snapshot cannot be found,
// the VM will shutdown.
- static const char* TryResolveDartDevSnapshotPath();
+ static Utils::CStringUniquePtr TryResolveDartDevSnapshotPath();
static DartDevRunner runner_;
static bool should_run_dart_dev_;
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 29a7c11..cbeb39a 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -1305,6 +1305,10 @@
case Dart_TypedData_kUint64:
case Dart_TypedData_kFloat64:
return 8;
+ case Dart_TypedData_kInt32x4:
+ case Dart_TypedData_kFloat32x4:
+ case Dart_TypedData_kFloat64x2:
+ return 16;
default:
break;
}
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index d4ac70f..ac8ff5c 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -1221,9 +1221,16 @@
#endif // !defined(DART_PRECOMPILED_RUNTIME)
if (should_run_user_program) {
- // Run the main isolate until we aren't told to restart.
- while (RunMainIsolate(script_name, &dart_options)) {
- Syslog::PrintErr("Restarting VM\n");
+ if (!Dart_IsPrecompiledRuntime() && Snapshot::IsAOTSnapshot(script_name)) {
+ Syslog::PrintErr(
+ "%s is an AOT snapshot and should be run with 'dartaotruntime'\n",
+ script_name);
+ Platform::Exit(kErrorExitCode);
+ } else {
+ // Run the main isolate until we aren't told to restart.
+ while (RunMainIsolate(script_name, &dart_options)) {
+ Syslog::PrintErr("Restarting VM\n");
+ }
}
}
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 2adc48e..ed6b491a 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -537,5 +537,24 @@
}
}
+bool Snapshot::IsAOTSnapshot(const char* snapshot_filename) {
+ // Header is simply "ELF" prefixed with the DEL character.
+ const char elf_header[] = {0x7F, 0x45, 0x4C, 0x46, 0x0};
+ const int64_t elf_header_len = strlen(elf_header);
+ File* file = File::Open(NULL, snapshot_filename, File::kRead);
+ if (file == nullptr) {
+ return false;
+ }
+ if (file->Length() < elf_header_len) {
+ file->Release();
+ return false;
+ }
+ auto buf = std::unique_ptr<char[]>(new char[elf_header_len]);
+ bool success = file->ReadFully(buf.get(), elf_header_len);
+ file->Release();
+ ASSERT(success);
+ return (strncmp(elf_header, buf.get(), elf_header_len) == 0);
+}
+
} // namespace bin
} // namespace dart
diff --git a/runtime/bin/snapshot_utils.h b/runtime/bin/snapshot_utils.h
index 1b8c666..57d8929 100644
--- a/runtime/bin/snapshot_utils.h
+++ b/runtime/bin/snapshot_utils.h
@@ -34,6 +34,10 @@
static void GenerateAppJIT(const char* snapshot_filename);
static void GenerateAppAOTAsAssembly(const char* snapshot_filename);
+ // Returns true if snapshot_filename points to an AOT snapshot (aka,
+ // an ELF binary). May report false negatives.
+ static bool IsAOTSnapshot(const char* snapshot_filename);
+
static AppSnapshot* TryReadAppendedAppSnapshotElf(const char* container_path);
static AppSnapshot* TryReadAppSnapshot(
const char* script_uri,
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 978d67b..bbd3d2ca 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2358,7 +2358,9 @@
Dart_TypedData_kUint64,
Dart_TypedData_kFloat32,
Dart_TypedData_kFloat64,
+ Dart_TypedData_kInt32x4,
Dart_TypedData_kFloat32x4,
+ Dart_TypedData_kFloat64x2,
Dart_TypedData_kInvalid
} Dart_TypedData_Type;
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 7b86301..7dd5823 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -11,6 +11,7 @@
#include "vm/native_entry.h"
#include "vm/object.h"
#include "vm/object_store.h"
+#include "vm/resolver.h"
#include "vm/stack_frame.h"
#include "vm/symbols.h"
@@ -510,14 +511,11 @@
function = Closure::Cast(receiver).function();
} else {
Class& cls = Class::Handle(receiver.clazz());
- if (level != InvocationMirror::kSuper) {
- function = cls.LookupDynamicFunction(method_name);
- }
- while (function.IsNull()) {
+ if (level == InvocationMirror::kSuper) {
cls = cls.SuperClass();
- if (cls.IsNull()) break;
- function = cls.LookupDynamicFunction(method_name);
}
+ function = Resolver::ResolveDynamicAnyArgs(zone, cls, method_name,
+ /*allow_add=*/false);
}
if (!function.IsNull()) {
return function.UserVisibleSignature();
diff --git a/runtime/observatory/lib/service_html.dart b/runtime/observatory/lib/service_html.dart
index 60f552c..5c217d7 100644
--- a/runtime/observatory/lib/service_html.dart
+++ b/runtime/observatory/lib/service_html.dart
@@ -22,7 +22,14 @@
// to DDS, but the dart:html WebSocket doesn't follow redirects. If the
// 'implicit-redirect' protocol is provided, the VM service will manually
// forward traffic to DDS.
- _webSocket = new WebSocket(address, ['implicit-redirect']);
+
+ // TODO(bkonyi): uncomment when DDS is re-enabled.
+ // See https://github.com/dart-lang/sdk/issues/42727
+ // const protocols = ['implicit-redirect'];
+ _webSocket = new WebSocket(
+ address,
+ // protocols,
+ );
_webSocket.onClose.listen((CloseEvent) => onClose());
_webSocket.onError.listen((Event) => onError());
_webSocket.onOpen.listen((Event) => onOpen());
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index 79139c3..ae66a6a8 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -222,9 +222,9 @@
..classes = ['compact']
..text = _isCompacted ? 'expand â–¼' : 'compact â–²'
..onClick.listen((_) {
- _isCompacted = !_isCompacted;
- _r.dirty();
- }),
+ _isCompacted = !_isCompacted;
+ _r.dirty();
+ }),
new HRElement()
],
new DivElement()
@@ -365,35 +365,26 @@
_SortingField.newInternalSize, _SortingDirection.descending),
_createHeaderButton(const ['bytes'], 'External',
_SortingField.newExternalSize, _SortingDirection.descending),
- _createHeaderButton(const ['bytes'], 'Size',
- _SortingField.newSize, _SortingDirection.descending),
- _createHeaderButton(
- const ['instances'], 'Instances',
- _SortingField.newInstances,
+ _createHeaderButton(const ['bytes'], 'Size', _SortingField.newSize,
_SortingDirection.descending),
-
+ _createHeaderButton(const ['instances'], 'Instances',
+ _SortingField.newInstances, _SortingDirection.descending),
_createHeaderButton(const ['bytes'], 'Internal',
_SortingField.oldInternalSize, _SortingDirection.descending),
_createHeaderButton(const ['bytes'], 'External',
_SortingField.oldExternalSize, _SortingDirection.descending),
- _createHeaderButton(const ['bytes'], 'Size',
- _SortingField.oldSize, _SortingDirection.descending),
- _createHeaderButton(
- const ['instances'], 'Instances',
- _SortingField.oldInstances,
+ _createHeaderButton(const ['bytes'], 'Size', _SortingField.oldSize,
_SortingDirection.descending),
-
+ _createHeaderButton(const ['instances'], 'Instances',
+ _SortingField.oldInstances, _SortingDirection.descending),
_createHeaderButton(const ['bytes'], 'Internal',
_SortingField.internalSize, _SortingDirection.descending),
_createHeaderButton(const ['bytes'], 'External',
_SortingField.externalSize, _SortingDirection.descending),
- _createHeaderButton(const ['bytes'], 'Size',
- _SortingField.size, _SortingDirection.descending),
- _createHeaderButton(
- const ['instances'], 'Instances',
- _SortingField.instances,
+ _createHeaderButton(const ['bytes'], 'Size', _SortingField.size,
_SortingDirection.descending),
-
+ _createHeaderButton(const ['instances'], 'Instances',
+ _SortingField.instances, _SortingDirection.descending),
_createHeaderButton(const ['name'], 'Class',
_SortingField.className, _SortingDirection.ascending)
],
@@ -564,28 +555,19 @@
].join(',');
}
- static int _getNewInstances(M.ClassHeapStats s) =>
- s.newSpace.instances;
- static int _getNewInternalSize(M.ClassHeapStats s) =>
- s.newSpace.internalSize;
- static int _getNewExternalSize(M.ClassHeapStats s) =>
- s.newSpace.externalSize;
- static int _getNewSize(M.ClassHeapStats s) =>
- s.newSpace.size;
- static int _getOldInstances(M.ClassHeapStats s) =>
- s.oldSpace.instances;
- static int _getOldInternalSize(M.ClassHeapStats s) =>
- s.oldSpace.internalSize;
- static int _getOldExternalSize(M.ClassHeapStats s) =>
- s.oldSpace.externalSize;
- static int _getOldSize(M.ClassHeapStats s) =>
- s.oldSpace.size;
+ static int _getNewInstances(M.ClassHeapStats s) => s.newSpace.instances;
+ static int _getNewInternalSize(M.ClassHeapStats s) => s.newSpace.internalSize;
+ static int _getNewExternalSize(M.ClassHeapStats s) => s.newSpace.externalSize;
+ static int _getNewSize(M.ClassHeapStats s) => s.newSpace.size;
+ static int _getOldInstances(M.ClassHeapStats s) => s.oldSpace.instances;
+ static int _getOldInternalSize(M.ClassHeapStats s) => s.oldSpace.internalSize;
+ static int _getOldExternalSize(M.ClassHeapStats s) => s.oldSpace.externalSize;
+ static int _getOldSize(M.ClassHeapStats s) => s.oldSpace.size;
static int _getInstances(M.ClassHeapStats s) =>
s.newSpace.instances + s.oldSpace.instances;
static int _getInternalSize(M.ClassHeapStats s) =>
s.newSpace.internalSize + s.oldSpace.internalSize;
static int _getExternalSize(M.ClassHeapStats s) =>
s.newSpace.externalSize + s.oldSpace.externalSize;
- static int _getSize(M.ClassHeapStats s) =>
- s.newSpace.size + s.oldSpace.size;
+ static int _getSize(M.ClassHeapStats s) => s.newSpace.size + s.oldSpace.size;
}
diff --git a/runtime/observatory/lib/src/elements/class_allocation_profile.dart b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
index 1f0013c..46cc688 100644
--- a/runtime/observatory/lib/src/elements/class_allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/class_allocation_profile.dart
@@ -49,7 +49,8 @@
return e;
}
- ClassAllocationProfileElement.created() : super.created('class-allocation-profile');
+ ClassAllocationProfileElement.created()
+ : super.created('class-allocation-profile');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
index 8f24d9c..7044f5c 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile/virtual_tree.dart
@@ -65,7 +65,8 @@
return e;
}
- CpuProfileVirtualTreeElement.created() : super.created('cpu-profile-virtual-tree');
+ CpuProfileVirtualTreeElement.created()
+ : super.created('cpu-profile-virtual-tree');
@override
attached() {
diff --git a/runtime/observatory/lib/src/elements/helpers/custom_element.dart b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
index 90b0c71..2af0d6c 100644
--- a/runtime/observatory/lib/src/elements/helpers/custom_element.dart
+++ b/runtime/observatory/lib/src/elements/helpers/custom_element.dart
@@ -46,7 +46,8 @@
}
final HtmlElement element;
- CustomElement.created(String elementClass) : element = document.createElement("shadow") {
+ CustomElement.created(String elementClass)
+ : element = document.createElement("shadow") {
reverseElements[element] = this;
element.classes = [elementClass];
diff --git a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
index f7abef6..7823a1d 100644
--- a/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
+++ b/runtime/observatory/lib/src/elements/isolate/shared_summary.dart
@@ -33,7 +33,8 @@
return e;
}
- IsolateSharedSummaryElement.created() : super.created('isolate-shared-summary');
+ IsolateSharedSummaryElement.created()
+ : super.created('isolate-shared-summary');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
index 6dc78b5..fb1f262 100644
--- a/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
+++ b/runtime/observatory/lib/src/elements/megamorphiccache_view.dart
@@ -85,7 +85,8 @@
return e;
}
- MegamorphicCacheViewElement.created() : super.created('megamorphiccache-view');
+ MegamorphicCacheViewElement.created()
+ : super.created('megamorphiccache-view');
@override
attached() {
diff --git a/runtime/observatory/lib/src/elements/observatory_application.dart b/runtime/observatory/lib/src/elements/observatory_application.dart
index bb58e9e..1ba16ef 100644
--- a/runtime/observatory/lib/src/elements/observatory_application.dart
+++ b/runtime/observatory/lib/src/elements/observatory_application.dart
@@ -13,7 +13,8 @@
class ObservatoryApplicationElement extends CustomElement {
ObservatoryApplication app;
- ObservatoryApplicationElement.created() : super.created('observatory-application');
+ ObservatoryApplicationElement.created()
+ : super.created('observatory-application');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/persistent_handles.dart b/runtime/observatory/lib/src/elements/persistent_handles.dart
index 468d700..72eef36 100644
--- a/runtime/observatory/lib/src/elements/persistent_handles.dart
+++ b/runtime/observatory/lib/src/elements/persistent_handles.dart
@@ -71,7 +71,8 @@
return e;
}
- PersistentHandlesPageElement.created() : super.created('persistent-handles-page');
+ PersistentHandlesPageElement.created()
+ : super.created('persistent-handles-page');
@override
attached() {
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
index 1355521..0e0a674 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_ref.dart
@@ -34,7 +34,8 @@
return e;
}
- SingleTargetCacheRefElement.created() : super.created('singletargetcache-ref');
+ SingleTargetCacheRefElement.created()
+ : super.created('singletargetcache-ref');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/singletargetcache_view.dart b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
index ae96da9..f25a184 100644
--- a/runtime/observatory/lib/src/elements/singletargetcache_view.dart
+++ b/runtime/observatory/lib/src/elements/singletargetcache_view.dart
@@ -83,7 +83,10 @@
return e;
}
- SingleTargetCacheViewElement.created() : super.created('singletargetcache-view',);
+ SingleTargetCacheViewElement.created()
+ : super.created(
+ 'singletargetcache-view',
+ );
@override
attached() {
diff --git a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
index c478bf8..ff23373 100644
--- a/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
+++ b/runtime/observatory/lib/src/elements/stack_trace_tree_config.dart
@@ -86,7 +86,8 @@
return e;
}
- StackTraceTreeConfigElement.created() : super.created('stack-trace-tree-config');
+ StackTraceTreeConfigElement.created()
+ : super.created('stack-trace-tree-config');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
index 33a556e..340686a 100644
--- a/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
+++ b/runtime/observatory/lib/src/elements/strongly_reachable_instances.dart
@@ -49,7 +49,8 @@
return e;
}
- StronglyReachableInstancesElement.created() : super.created('strongly-reachable-instances');
+ StronglyReachableInstancesElement.created()
+ : super.created('strongly-reachable-instances');
@override
void attached() {
diff --git a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
index 9f0d68e..740298f 100644
--- a/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
+++ b/runtime/observatory/lib/src/elements/subtypetestcache_view.dart
@@ -82,7 +82,8 @@
return e;
}
- SubtypeTestCacheViewElement.created() : super.created('subtypetestcache-view');
+ SubtypeTestCacheViewElement.created()
+ : super.created('subtypetestcache-view');
@override
attached() {
diff --git a/runtime/observatory/web/main.dart b/runtime/observatory/web/main.dart
index dec58d7..b09362d 100644
--- a/runtime/observatory/web/main.dart
+++ b/runtime/observatory/web/main.dart
@@ -7,7 +7,6 @@
import 'package:observatory/elements.dart';
import 'package:stack_trace/stack_trace.dart';
-
main() async {
Chain.capture(() async {
Logger.root.level = Level.INFO;
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 50b0bf3..0ffe25e 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -157,6 +157,19 @@
await (throwAsync().timeout(Duration(seconds: 1)));
}
+// ----
+// Scenario: Future.wait:
+// ----
+
+Future awaitWait() async {
+ await Future.wait([
+ throwAsync(),
+ () async {
+ await Future.value();
+ }()
+ ]);
+}
+
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
@@ -689,6 +702,48 @@
r'^#6 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^^<asynchronous suspension>$',
+ r'^#1 awaitWait ',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwait ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwaitThen ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwaitCatchError ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
}
// For: --no-causal-async-stacks --no-lazy-async-stacks
@@ -1027,6 +1082,25 @@
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
await doTestAwaitCatchError(
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^#1 _RootZone.runUnary ',
+ r'^#2 _FutureListener.handleValue ',
+ r'^#3 Future._propagateToListeners.handleValueCallback ',
+ r'^#4 Future._propagateToListeners ',
+ r'^#5 Future.(_addListener|_prependListeners).<anonymous closure> ',
+ r'^#6 _microtaskLoop ',
+ r'^#7 _startMicrotaskLoop ',
+ r'^#8 _runPendingImmediateCallback ',
+ r'^#9 _RawReceivePortImpl._handleMessage ',
+ ];
+ await doTestAwait(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
}
// For: --lazy-async-stacks
@@ -1319,4 +1393,35 @@
debugInfoFilename);
await doTestAwaitCatchError(
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
}
diff --git a/runtime/tests/vm/dart/scavenger_abort_test.dart b/runtime/tests/vm/dart/scavenger_abort_test.dart
new file mode 100644
index 0000000..ee3b38d
--- /dev/null
+++ b/runtime/tests/vm/dart/scavenger_abort_test.dart
@@ -0,0 +1,158 @@
+// 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:io";
+import "package:expect/expect.dart";
+
+// The sizes of these classes are co-prime multiples of the allocation unit to
+// increase the likelihood that scavenging fails from fragmentation.
+
+// header + 13 fields = 7 allocation units
+class A {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+}
+
+// header + 17 fields = 9 allocation units
+class B {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+ dynamic field14;
+ dynamic field15;
+ dynamic field16;
+ dynamic field17;
+}
+
+// header + 19 fields = 10 allocation units
+class C {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+ dynamic field14;
+ dynamic field15;
+ dynamic field16;
+ dynamic field17;
+ dynamic field18;
+ dynamic field19;
+}
+
+makeA(n) {
+ var a = new A();
+ if (n > 0) {
+ a.field1 = makeB(n - 1);
+ a.field2 = makeC(n - 1);
+ a.field3 = makeB(n - 1);
+ a.field4 = makeC(n - 1);
+ }
+ return a;
+}
+
+makeB(n) {
+ var b = new B();
+ if (n > 0) {
+ b.field1 = makeC(n - 1);
+ b.field2 = makeA(n - 1);
+ b.field3 = makeC(n - 1);
+ b.field4 = makeA(n - 1);
+ }
+ return b;
+}
+
+makeC(n) {
+ var c = new C();
+ if (n > 0) {
+ c.field1 = makeA(n - 1);
+ c.field2 = makeB(n - 1);
+ c.field3 = makeA(n - 1);
+ c.field4 = makeB(n - 1);
+ }
+ return c;
+}
+
+readFields(x) {
+ print(x.field1);
+ print(x.field2);
+ print(x.field3);
+ print(x.field4);
+}
+
+main(List<String> argsIn) async {
+ if (argsIn.contains("--testee")) {
+ // Trigger OOM.
+ // Must read the fields to prevent the writes from being optimized away. If
+ // the writes are optimized away, most of the tree is collectible right away
+ // and we timeout instead of triggering OOM.
+ readFields(makeA(50));
+ readFields(makeB(50));
+ readFields(makeC(50));
+ return;
+ }
+
+ var exec = Platform.executable;
+ var args = Platform.executableArguments +
+ [
+ "--old_gen_heap_size=15" /*MB*/,
+ "--verbose_gc",
+ "--verify_after_gc",
+ "--verify_store_buffer",
+ Platform.script.toFilePath(),
+ "--testee"
+ ];
+ print("+ $exec ${args.join(' ')}");
+
+ var result = await Process.run(exec, args);
+ print("Command stdout:");
+ print(result.stdout);
+ print("Command stderr:");
+ print(result.stderr);
+
+ Expect.equals(255, result.exitCode,
+ "Should see runtime exception error code, not SEGV");
+
+ Expect.isTrue(
+ result.stderr.contains("Unhandled exception:\nOut of Memory") ||
+ result.stderr.contains("Unhandled exception:\r\nOut of Memory"),
+ "Should see the Dart OutOfMemoryError");
+
+ // --verbose_gc not available in product mode
+ if (!new bool.fromEnvironment("dart.vm.product")) {
+ Expect.isTrue(result.stderr.contains("Aborting scavenge"),
+ "Should abort scavenge at least once");
+ }
+
+ Expect.isFalse(result.stderr.contains("error: Out of memory"),
+ "Should not see the C++ OUT_OF_MEMORY()");
+}
diff --git a/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart b/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart
new file mode 100644
index 0000000..467c0ea
--- /dev/null
+++ b/runtime/tests/vm/dart/unboxed_implicit_accessors_test.dart
@@ -0,0 +1,71 @@
+// 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.
+
+final l = <I>[A(), B(42, 4.2)];
+final l2 = <I2>[A2(), B2(42, 4.2)];
+
+main() {
+ if (l[0].intValue != 23) throw 'a';
+ if (l[0].doubleValue != 2.3) throw 'b';
+ if (l[1].intValue != 42) throw 'c';
+ if (l[1].doubleValue != 4.2) throw 'd';
+
+ if (l2[0].intValue != null) throw 'a';
+ if (l2[0].doubleValue != null) throw 'b';
+ if (l2[1].intValue != 42) throw 'c';
+ if (l2[1].doubleValue != 4.2) throw 'd';
+
+ if (int.parse('1') == 1) {
+ l2[0].intValue = 24;
+ l2[0].doubleValue = 2.4;
+ l2[1].intValue = 24;
+ l2[1].doubleValue = 2.4;
+ } else {
+ (l2[0] as A2).intValue = null;
+ (l2[0] as A2).doubleValue = null;
+ }
+}
+
+abstract class I {
+ int? get intValue;
+ double? get doubleValue;
+}
+
+class A implements I {
+ int get intValue => 23;
+ double get doubleValue => 2.3;
+}
+
+class B implements I {
+ // Field as well as getter/setter will be unboxed.
+ final int? intValue;
+ // Field as well as getter/setter will be unboxed.
+ final double? doubleValue;
+ B(this.intValue, this.doubleValue);
+}
+
+abstract class I2 {
+ void set intValue(int? v) {}
+ void set doubleValue(double? v) {}
+
+ int? get intValue;
+ double? get doubleValue;
+}
+
+class A2 implements I2 {
+ void set intValue(int? v) {}
+ void set doubleValue(double? v) {}
+
+ int? get intValue => null;
+ double? get doubleValue => null;
+}
+
+class B2 implements I2 {
+ // Field itself will get unboxed, but getter/setter will be boxed.
+ int? intValue;
+ // Field itself will get unboxed, but getter/setter will be boxed.
+ double? doubleValue;
+
+ B2(this.intValue, this.doubleValue);
+}
diff --git a/runtime/tests/vm/dart_2/causal_stacks/utils.dart b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
index ec787cf..6354b59 100644
--- a/runtime/tests/vm/dart_2/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart_2/causal_stacks/utils.dart
@@ -157,6 +157,19 @@
await (throwAsync().timeout(Duration(seconds: 1)));
}
+// ----
+// Scenario: Future.wait:
+// ----
+
+Future awaitWait() async {
+ await Future.wait([
+ throwAsync(),
+ () async {
+ await Future.value();
+ }()
+ ]);
+}
+
// Helpers:
// We want lines that either start with a frame index or an async gap marker.
@@ -689,6 +702,48 @@
r'^#6 _RawReceivePortImpl._handleMessage ',
],
debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^^<asynchronous suspension>$',
+ r'^#1 awaitWait ',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwait ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwaitThen ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#2 doTestAwaitCatchError ',
+ r'^#3 doTestsCausal ',
+ r'^<asynchronous suspension>$',
+ r'^#4 main \(.+\)$',
+ r'^#5 _startIsolate.<anonymous closure> ',
+ r'^#6 _RawReceivePortImpl._handleMessage ',
+ ],
+ debugInfoFilename);
}
// For: --no-causal-async-stacks --no-lazy-async-stacks
@@ -1027,6 +1082,25 @@
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
await doTestAwaitCatchError(
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^#1 _RootZone.runUnary ',
+ r'^#2 _FutureListener.handleValue ',
+ r'^#3 Future._propagateToListeners.handleValueCallback ',
+ r'^#4 Future._propagateToListeners ',
+ r'^#5 Future.(_addListener|_prependListeners).<anonymous closure> ',
+ r'^#6 _microtaskLoop ',
+ r'^#7 _startMicrotaskLoop ',
+ r'^#8 _runPendingImmediateCallback ',
+ r'^#9 _RawReceivePortImpl._handleMessage ',
+ ];
+ await doTestAwait(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
}
// For: --lazy-async-stacks
@@ -1319,4 +1393,35 @@
debugInfoFilename);
await doTestAwaitCatchError(
awaitTimeout, awaitTimeoutExpected + const <String>[], debugInfoFilename);
+
+ final awaitWaitExpected = const <String>[
+ r'^#0 throwAsync \(.*/utils.dart:21(:3)?\)$',
+ r'^<asynchronous suspension>$',
+ r'^#1 Future.wait.<anonymous closure> \(dart:async/future.dart\)$',
+ r'^<asynchronous suspension>$',
+ r'^#2 awaitWait ',
+ r'^<asynchronous suspension>$',
+ ];
+ await doTestAwait(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwait ',
+ r'^<asynchronous suspension>$',
+ r'^#4 doTestsLazy ',
+ r'^<asynchronous suspension>$',
+ r'^#5 main ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitThen(
+ awaitWait,
+ awaitWaitExpected +
+ const <String>[
+ r'^#3 doTestAwaitThen.<anonymous closure> ',
+ r'^<asynchronous suspension>$',
+ ],
+ debugInfoFilename);
+ await doTestAwaitCatchError(
+ awaitWait, awaitWaitExpected + const <String>[], debugInfoFilename);
}
diff --git a/runtime/tests/vm/dart_2/scavenger_abort_test.dart b/runtime/tests/vm/dart_2/scavenger_abort_test.dart
new file mode 100644
index 0000000..ee3b38d
--- /dev/null
+++ b/runtime/tests/vm/dart_2/scavenger_abort_test.dart
@@ -0,0 +1,158 @@
+// 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:io";
+import "package:expect/expect.dart";
+
+// The sizes of these classes are co-prime multiples of the allocation unit to
+// increase the likelihood that scavenging fails from fragmentation.
+
+// header + 13 fields = 7 allocation units
+class A {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+}
+
+// header + 17 fields = 9 allocation units
+class B {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+ dynamic field14;
+ dynamic field15;
+ dynamic field16;
+ dynamic field17;
+}
+
+// header + 19 fields = 10 allocation units
+class C {
+ dynamic field1;
+ dynamic field2;
+ dynamic field3;
+ dynamic field4;
+ dynamic field5;
+ dynamic field6;
+ dynamic field7;
+ dynamic field8;
+ dynamic field9;
+ dynamic field10;
+ dynamic field11;
+ dynamic field12;
+ dynamic field13;
+ dynamic field14;
+ dynamic field15;
+ dynamic field16;
+ dynamic field17;
+ dynamic field18;
+ dynamic field19;
+}
+
+makeA(n) {
+ var a = new A();
+ if (n > 0) {
+ a.field1 = makeB(n - 1);
+ a.field2 = makeC(n - 1);
+ a.field3 = makeB(n - 1);
+ a.field4 = makeC(n - 1);
+ }
+ return a;
+}
+
+makeB(n) {
+ var b = new B();
+ if (n > 0) {
+ b.field1 = makeC(n - 1);
+ b.field2 = makeA(n - 1);
+ b.field3 = makeC(n - 1);
+ b.field4 = makeA(n - 1);
+ }
+ return b;
+}
+
+makeC(n) {
+ var c = new C();
+ if (n > 0) {
+ c.field1 = makeA(n - 1);
+ c.field2 = makeB(n - 1);
+ c.field3 = makeA(n - 1);
+ c.field4 = makeB(n - 1);
+ }
+ return c;
+}
+
+readFields(x) {
+ print(x.field1);
+ print(x.field2);
+ print(x.field3);
+ print(x.field4);
+}
+
+main(List<String> argsIn) async {
+ if (argsIn.contains("--testee")) {
+ // Trigger OOM.
+ // Must read the fields to prevent the writes from being optimized away. If
+ // the writes are optimized away, most of the tree is collectible right away
+ // and we timeout instead of triggering OOM.
+ readFields(makeA(50));
+ readFields(makeB(50));
+ readFields(makeC(50));
+ return;
+ }
+
+ var exec = Platform.executable;
+ var args = Platform.executableArguments +
+ [
+ "--old_gen_heap_size=15" /*MB*/,
+ "--verbose_gc",
+ "--verify_after_gc",
+ "--verify_store_buffer",
+ Platform.script.toFilePath(),
+ "--testee"
+ ];
+ print("+ $exec ${args.join(' ')}");
+
+ var result = await Process.run(exec, args);
+ print("Command stdout:");
+ print(result.stdout);
+ print("Command stderr:");
+ print(result.stderr);
+
+ Expect.equals(255, result.exitCode,
+ "Should see runtime exception error code, not SEGV");
+
+ Expect.isTrue(
+ result.stderr.contains("Unhandled exception:\nOut of Memory") ||
+ result.stderr.contains("Unhandled exception:\r\nOut of Memory"),
+ "Should see the Dart OutOfMemoryError");
+
+ // --verbose_gc not available in product mode
+ if (!new bool.fromEnvironment("dart.vm.product")) {
+ Expect.isTrue(result.stderr.contains("Aborting scavenge"),
+ "Should abort scavenge at least once");
+ }
+
+ Expect.isFalse(result.stderr.contains("error: Out of memory"),
+ "Should not see the C++ OUT_OF_MEMORY()");
+}
diff --git a/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart b/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart
new file mode 100644
index 0000000..08eea3a
--- /dev/null
+++ b/runtime/tests/vm/dart_2/unboxed_implicit_accessors_test.dart
@@ -0,0 +1,71 @@
+// 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.
+
+final l = <I>[A(), B(42, 4.2)];
+final l2 = <I2>[A2(), B2(42, 4.2)];
+
+main() {
+ if (l[0].intValue != 23) throw 'a';
+ if (l[0].doubleValue != 2.3) throw 'b';
+ if (l[1].intValue != 42) throw 'c';
+ if (l[1].doubleValue != 4.2) throw 'd';
+
+ if (l2[0].intValue != null) throw 'a';
+ if (l2[0].doubleValue != null) throw 'b';
+ if (l2[1].intValue != 42) throw 'c';
+ if (l2[1].doubleValue != 4.2) throw 'd';
+
+ if (int.parse('1') == 1) {
+ l2[0].intValue = 24;
+ l2[0].doubleValue = 2.4;
+ l2[1].intValue = 24;
+ l2[1].doubleValue = 2.4;
+ } else {
+ (l2[0] as A2).intValue = null;
+ (l2[0] as A2).doubleValue = null;
+ }
+}
+
+abstract class I {
+ int get intValue;
+ double get doubleValue;
+}
+
+class A implements I {
+ int get intValue => 23;
+ double get doubleValue => 2.3;
+}
+
+class B implements I {
+ // Field as well as getter/setter will be unboxed.
+ final int intValue;
+ // Field as well as getter/setter will be unboxed.
+ final double doubleValue;
+ B(this.intValue, this.doubleValue);
+}
+
+abstract class I2 {
+ void set intValue(int v) {}
+ void set doubleValue(double v) {}
+
+ int get intValue;
+ double get doubleValue;
+}
+
+class A2 implements I2 {
+ void set intValue(int v) {}
+ void set doubleValue(double v) {}
+
+ int get intValue => null;
+ double get doubleValue => null;
+}
+
+class B2 implements I2 {
+ // Field itself will get unboxed, but getter/setter will be boxed.
+ int intValue;
+ // Field itself will get unboxed, but getter/setter will be boxed.
+ double doubleValue;
+
+ B2(this.intValue, this.doubleValue);
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index e18c310..13c1e72 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -88,11 +88,13 @@
dart/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # --no-lazy... does nothing on precompiler.
dart/causal_stacks/async_throws_stack_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
dart/causal_stacks/async_throws_stack_test: SkipByDesign # --no-lazy... does nothing on precompiler.
+dart/scavenger_abort_test: SkipSlow
dart/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
dart_2/causal_stacks/async_throws_stack_no_causal_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
dart_2/causal_stacks/async_throws_stack_no_causal_test: SkipByDesign # --no-lazy... does nothing on precompiler.
dart_2/causal_stacks/async_throws_stack_non_symbolic_test: SkipByDesign # --no-lazy... does nothing on precompiler.
dart_2/causal_stacks/async_throws_stack_test: SkipByDesign # --no-lazy... does nothing on precompiler.
+dart_2/scavenger_abort_test: SkipSlow
dart_2/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
[ $compiler != dartkp ]
diff --git a/runtime/vm/compiler/backend/block_builder.h b/runtime/vm/compiler/backend/block_builder.h
index 02ea193..99d3764 100644
--- a/runtime/vm/compiler/backend/block_builder.h
+++ b/runtime/vm/compiler/backend/block_builder.h
@@ -102,7 +102,7 @@
// adjust reaching type. This is done manually because there is no type
// propagation when building intrinsics.
unboxed_value->AsUnbox()->value()->SetReachingType(
- new CompileType(CompileType::FromCid(CidForRepresentation(rep))));
+ TypeForRepresentation(rep));
}
return unboxed_value;
}
@@ -139,21 +139,22 @@
}
private:
- static intptr_t CidForRepresentation(Representation rep) {
+ static CompileType* TypeForRepresentation(Representation rep) {
switch (rep) {
case kUnboxedDouble:
- return kDoubleCid;
+ return new CompileType(CompileType::FromCid(kDoubleCid));
case kUnboxedFloat32x4:
- return kFloat32x4Cid;
+ return new CompileType(CompileType::FromCid(kFloat32x4Cid));
case kUnboxedInt32x4:
- return kInt32x4Cid;
+ return new CompileType(CompileType::FromCid(kInt32x4Cid));
case kUnboxedFloat64x2:
- return kFloat64x2Cid;
+ return new CompileType(CompileType::FromCid(kFloat64x2Cid));
case kUnboxedUint32:
- return kDynamicCid; // smi or mint.
+ case kUnboxedInt64:
+ return new CompileType(CompileType::Int());
default:
UNREACHABLE();
- return kIllegalCid;
+ return nullptr;
}
}
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index bc98ea2..7d81c2b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -1279,58 +1279,24 @@
set_intrinsic_slow_path_label(&exit);
if (FLAG_intrinsify) {
- // Intrinsification skips arguments checks, therefore disable if in checked
- // mode or strong mode.
- //
- // Though for implicit getters, which have only the receiver as parameter,
- // there are no checks necessary in any case and we can therefore intrinsify
- // them even in checked mode and strong mode.
- switch (parsed_function().function().kind()) {
- case FunctionLayout::kImplicitGetter: {
- Field& field = Field::Handle(function().accessor_field());
- ASSERT(!field.IsNull());
-#if defined(DEBUG)
- // HACK: Clone the field to ignore assertion in Field::guarded_cid().
- // The assertion is intended to ensure that the background compiler sees
- // consistent cids, but that's not important in this case because
- // IsPotentialUnboxedField can go from true to false, but not false to
- // true, and we only do this optimisation if it is false.
- field = field.CloneFromOriginal();
-#endif
-
- // Only intrinsify getter if the field cannot contain a mutable double.
- // Reading from a mutable double box requires allocating a fresh double.
- if (field.is_instance() && !field.needs_load_guard() &&
- !field.is_late() && !IsPotentialUnboxedField(field)) {
- SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
- GenerateGetterIntrinsic(compiler::target::Field::OffsetOf(field));
- SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
- return true;
- }
- return false;
- }
- case FunctionLayout::kImplicitSetter:
- break;
+ const auto& function = parsed_function().function();
+ if (function.IsMethodExtractor()) {
#if !defined(TARGET_ARCH_IA32)
- case FunctionLayout::kMethodExtractor: {
- auto& extracted_method = Function::ZoneHandle(
- parsed_function().function().extracted_method_closure());
- auto& klass = Class::Handle(extracted_method.Owner());
- const intptr_t type_arguments_field_offset =
- compiler::target::Class::HasTypeArgumentsField(klass)
- ? (compiler::target::Class::TypeArgumentsFieldOffset(klass) -
- kHeapObjectTag)
- : 0;
+ auto& extracted_method =
+ Function::ZoneHandle(function.extracted_method_closure());
+ auto& klass = Class::Handle(extracted_method.Owner());
+ const intptr_t type_arguments_field_offset =
+ compiler::target::Class::HasTypeArgumentsField(klass)
+ ? (compiler::target::Class::TypeArgumentsFieldOffset(klass) -
+ kHeapObjectTag)
+ : 0;
- SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
- GenerateMethodExtractorIntrinsic(extracted_method,
- type_arguments_field_offset);
- SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
- return true;
- }
+ SpecialStatsBegin(CombinedCodeStatistics::kTagIntrinsics);
+ GenerateMethodExtractorIntrinsic(extracted_method,
+ type_arguments_field_offset);
+ SpecialStatsEnd(CombinedCodeStatistics::kTagIntrinsics);
+ return true;
#endif // !defined(TARGET_ARCH_IA32)
- default:
- break;
}
}
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 2706648..9efcd30 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -957,6 +957,7 @@
friend class CheckStackOverflowSlowPath; // For pending_deoptimization_env_.
friend class CheckedSmiSlowPath; // Same.
friend class CheckedSmiComparisonSlowPath; // Same.
+ friend class GraphInstrinsicCodeGenScope; // For optimizing_.
// Architecture specific implementation of simple native moves.
void EmitNativeMoveArchitecture(const compiler::ffi::NativeLocation& dst,
@@ -1083,7 +1084,7 @@
void GenerateMethodExtractorIntrinsic(const Function& extracted_method,
intptr_t type_arguments_field_offset);
- void GenerateGetterIntrinsic(intptr_t offset);
+ void GenerateGetterIntrinsic(const Function& accessor, const Field& field);
// Perform a greedy local register allocation. Consider all registers free.
void AllocateRegistersLocally(Instruction* instr);
@@ -1206,7 +1207,7 @@
// The table selectors of all dispatch table calls in the current function.
GrowableArray<const compiler::TableSelector*> dispatch_table_call_targets_;
GrowableArray<IndirectGotoInstr*> indirect_gotos_;
- const bool is_optimizing_;
+ bool is_optimizing_;
SpeculativeInliningPolicy* speculative_policy_;
// Set to true if optimized code has IC calls.
bool may_reoptimize_;
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 13b6e62..65cba11 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -875,16 +875,6 @@
compiler::target::Code::entry_point_offset(Code::EntryKind::kUnchecked)));
}
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
- // LR: return address.
- // SP: receiver.
- // Sequence node has one return node, its input is load field node.
- __ Comment("Intrinsic Getter");
- __ ldr(R0, compiler::Address(SP, 0 * compiler::target::kWordSize));
- __ LoadFieldFromOffset(kWord, R0, R0, offset);
- __ Ret();
-}
-
void FlowGraphCompiler::EmitFrameEntry() {
const Function& function = parsed_function().function();
if (CanOptimizeFunction() && function.IsOptimizable() &&
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 7bbe356..131308c 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -840,16 +840,6 @@
__ br(R0);
}
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
- // LR: return address.
- // SP: receiver.
- // Sequence node has one return node, its input is load field node.
- __ Comment("Intrinsic Getter");
- __ LoadFromOffset(R0, SP, 0 * kWordSize);
- __ LoadFieldFromOffset(R0, R0, offset);
- __ ret();
-}
-
void FlowGraphCompiler::EmitFrameEntry() {
const Function& function = parsed_function().function();
if (CanOptimizeFunction() && function.IsOptimizable() &&
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index f5fd0a2..6b96aff 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -755,16 +755,6 @@
}
}
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
- // TOS: return address.
- // +1 : receiver.
- // Sequence node has one return node, its input is load field node.
- __ Comment("Intrinsic Getter");
- __ movl(EAX, compiler::Address(ESP, 1 * kWordSize));
- __ movl(EAX, compiler::FieldAddress(EAX, offset));
- __ ret();
-}
-
// NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
// needs to be updated to match.
void FlowGraphCompiler::EmitFrameEntry() {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 756778ee..cf229f3 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -847,16 +847,6 @@
CODE_REG, Code::entry_point_offset(Code::EntryKind::kUnchecked)));
}
-void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
- // TOS: return address.
- // +1 : receiver.
- // Sequence node has one return node, its input is load field node.
- __ Comment("Intrinsic Getter");
- __ movq(RAX, compiler::Address(RSP, 1 * kWordSize));
- __ movq(RAX, compiler::FieldAddress(RAX, offset));
- __ ret();
-}
-
// NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
// needs to be updated to match.
void FlowGraphCompiler::EmitFrameEntry() {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 308d0b9..e372b4a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -5534,7 +5534,7 @@
return LoadFieldInstr::IsFixedLengthArrayCid(cid);
}
-Definition* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) {
+Definition* CheckBoundBase::Canonicalize(FlowGraph* flow_graph) {
return IsRedundant() ? index()->definition() : this;
}
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index f26a6ee..3ee05ef 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -8640,6 +8640,8 @@
Value* length() const { return inputs_[kLengthPos]; }
Value* index() const { return inputs_[kIndexPos]; }
+ virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
virtual CheckBoundBase* AsCheckBoundBase() { return this; }
virtual const CheckBoundBase* AsCheckBoundBase() const { return this; }
virtual Value* RedefinedValue() const;
@@ -8676,8 +8678,6 @@
void mark_generalized() { generalized_ = true; }
- virtual Definition* Canonicalize(FlowGraph* flow_graph);
-
// Returns the length offset for array and string types.
static intptr_t LengthOffsetFor(intptr_t class_id);
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 5b4b827..2607860 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -4960,24 +4960,35 @@
// Shared slow path is used in BoxInt64Instr::EmitNativeCode in
// FLAG_use_bare_instructions mode and only after VM isolate stubs where
// replaced with isolate-specific stubs.
+ auto object_store = Isolate::Current()->object_store();
+ const bool stubs_in_vm_isolate =
+ object_store->allocate_mint_with_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap() ||
+ object_store->allocate_mint_without_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap();
+ const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
+ FLAG_use_bare_instructions &&
+ !stubs_in_vm_isolate;
LocationSummary* summary = new (zone) LocationSummary(
zone, kNumInputs, kNumTemps,
ValueFitsSmi()
? LocationSummary::kNoCall
- : ((SlowPathSharingSupported(opt) && FLAG_use_bare_instructions &&
- !Isolate::Current()
- ->object_store()
- ->allocate_mint_with_fpu_regs_stub()
- ->ptr()
- ->InVMIsolateHeap())
- ? LocationSummary::kCallOnSharedSlowPath
- : LocationSummary::kCallOnSlowPath));
+ : ((shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath)));
summary->set_in(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
- if (!ValueFitsSmi()) {
- summary->set_temp(0, Location::RegisterLocation(R1));
+ if (ValueFitsSmi()) {
+ summary->set_out(0, Location::RequiresRegister());
+ } else if (shared_slow_path_call) {
+ summary->set_out(0,
+ Location::RegisterLocation(AllocateMintABI::kResultReg));
+ summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
+ } else {
+ summary->set_out(0, Location::RequiresRegister());
+ summary->set_temp(0, Location::RequiresRegister());
}
- summary->set_out(0, Location::RegisterLocation(R0));
return summary;
}
@@ -5013,7 +5024,8 @@
live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
: object_store->allocate_mint_without_fpu_regs_stub());
- ASSERT(!locs()->live_registers()->ContainsRegister(R0));
+ ASSERT(!locs()->live_registers()->ContainsRegister(
+ AllocateMintABI::kResultReg));
auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
locs(), DeoptId::kNone, extended_env);
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index bf7a7f6..3102576 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -4168,16 +4168,14 @@
// Shared slow path is used in BoxInt64Instr::EmitNativeCode in
// FLAG_use_bare_instructions mode and only after VM isolate stubs where
// replaced with isolate-specific stubs.
- const bool stubs_in_vm_isolate = (Isolate::Current()
- ->object_store()
- ->allocate_mint_with_fpu_regs_stub()
- ->ptr()
- ->InVMIsolateHeap() ||
- Isolate::Current()
- ->object_store()
- ->allocate_mint_without_fpu_regs_stub()
- ->ptr()
- ->InVMIsolateHeap());
+ auto object_store = Isolate::Current()->object_store();
+ const bool stubs_in_vm_isolate =
+ object_store->allocate_mint_with_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap() ||
+ object_store->allocate_mint_without_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap();
const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
FLAG_use_bare_instructions &&
!stubs_in_vm_isolate;
@@ -4187,13 +4185,13 @@
? LocationSummary::kNoCall
: shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
: LocationSummary::kCallOnSlowPath);
-
summary->set_in(0, Location::RequiresRegister());
if (ValueFitsSmi()) {
summary->set_out(0, Location::RequiresRegister());
} else if (shared_slow_path_call) {
- summary->set_out(0, Location::RegisterLocation(R0));
- summary->set_temp(0, Location::RegisterLocation(R1));
+ summary->set_out(0,
+ Location::RegisterLocation(AllocateMintABI::kResultReg));
+ summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
} else {
summary->set_out(0, Location::RequiresRegister());
summary->set_temp(0, Location::RequiresRegister());
@@ -4216,28 +4214,25 @@
__ b(&done, NO_OVERFLOW);
Register temp = locs()->temp(0).reg();
-
if (compiler->intrinsic_mode()) {
__ TryAllocate(compiler->mint_class(),
compiler->intrinsic_slow_path_label(), out, temp);
- } else {
- if (locs()->call_on_shared_slow_path()) {
- auto object_store = compiler->isolate()->object_store();
- const bool live_fpu_regs =
- locs()->live_registers()->FpuRegisterCount() > 0;
- const auto& stub = Code::ZoneHandle(
- compiler->zone(),
- live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
- : object_store->allocate_mint_without_fpu_regs_stub());
+ } else if (locs()->call_on_shared_slow_path()) {
+ auto object_store = compiler->isolate()->object_store();
+ const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0;
+ const auto& stub = Code::ZoneHandle(
+ compiler->zone(),
+ live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
+ : object_store->allocate_mint_without_fpu_regs_stub());
- ASSERT(!locs()->live_registers()->ContainsRegister(R0));
- auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
- compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
- locs(), DeoptId::kNone, extended_env);
- } else {
- BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
- out, temp);
- }
+ ASSERT(!locs()->live_registers()->ContainsRegister(
+ AllocateMintABI::kResultReg));
+ auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
+ compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
+ locs(), DeoptId::kNone, extended_env);
+ } else {
+ BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
+ temp);
}
__ StoreToOffset(in, out, Mint::value_offset() - kHeapObjectTag);
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index f15c658..128012a 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -4446,15 +4446,37 @@
bool opt) const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps,
- ValueFitsSmi() ? LocationSummary::kNoCall
- : LocationSummary::kCallOnSlowPath);
+ // Shared slow path is used in BoxInt64Instr::EmitNativeCode in
+ // FLAG_use_bare_instructions mode and only after VM isolate stubs where
+ // replaced with isolate-specific stubs.
+ auto object_store = Isolate::Current()->object_store();
+ const bool stubs_in_vm_isolate =
+ object_store->allocate_mint_with_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap() ||
+ object_store->allocate_mint_without_fpu_regs_stub()
+ ->ptr()
+ ->InVMIsolateHeap();
+ const bool shared_slow_path_call = SlowPathSharingSupported(opt) &&
+ FLAG_use_bare_instructions &&
+ !stubs_in_vm_isolate;
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps,
+ ValueFitsSmi()
+ ? LocationSummary::kNoCall
+ : ((shared_slow_path_call ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath)));
summary->set_in(0, Location::RequiresRegister());
- if (!ValueFitsSmi()) {
+ if (ValueFitsSmi()) {
+ summary->set_out(0, Location::RequiresRegister());
+ } else if (shared_slow_path_call) {
+ summary->set_out(0,
+ Location::RegisterLocation(AllocateMintABI::kResultReg));
+ summary->set_temp(0, Location::RegisterLocation(AllocateMintABI::kTempReg));
+ } else {
+ summary->set_out(0, Location::RequiresRegister());
summary->set_temp(0, Location::RequiresRegister());
}
- summary->set_out(0, Location::RequiresRegister());
return summary;
}
@@ -4463,17 +4485,39 @@
const Register value = locs()->in(0).reg();
__ MoveRegister(out, value);
__ SmiTag(out);
- if (!ValueFitsSmi()) {
- const Register temp = locs()->temp(0).reg();
- compiler::Label done;
- // If the value doesn't fit in a smi, the tagging changes the sign,
- // which causes the overflow flag to be set.
- __ j(NO_OVERFLOW, &done);
+ if (ValueFitsSmi()) {
+ return;
+ }
+ // If the value doesn't fit in a smi, the tagging changes the sign,
+ // which causes the overflow flag to be set.
+ compiler::Label done;
+ __ j(NO_OVERFLOW, &done);
+
+ const Register temp = locs()->temp(0).reg();
+ if (compiler->intrinsic_mode()) {
+ __ TryAllocate(compiler->mint_class(),
+ compiler->intrinsic_slow_path_label(),
+ /*near_jump=*/true, out, temp);
+ } else if (locs()->call_on_shared_slow_path()) {
+ auto object_store = compiler->isolate()->object_store();
+ const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0;
+ const auto& stub = Code::ZoneHandle(
+ compiler->zone(),
+ live_fpu_regs ? object_store->allocate_mint_with_fpu_regs_stub()
+ : object_store->allocate_mint_without_fpu_regs_stub());
+
+ ASSERT(!locs()->live_registers()->ContainsRegister(
+ AllocateMintABI::kResultReg));
+ auto extended_env = compiler->SlowPathEnvironmentFor(this, 0);
+ compiler->GenerateStubCall(token_pos(), stub, PcDescriptorsLayout::kOther,
+ locs(), DeoptId::kNone, extended_env);
+ } else {
BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
temp);
- __ movq(compiler::FieldAddress(out, Mint::value_offset()), value);
- __ Bind(&done);
}
+
+ __ movq(compiler::FieldAddress(out, Mint::value_offset()), value);
+ __ Bind(&done);
}
LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 13529c2..fd73901 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -25,13 +25,11 @@
// and non-generic-covariant parameters. The same applies to type parameters
// bounds for type parameters of generic functions.
//
- // In JIT mode we dynamically generate trampolines (dynamic invocation
- // forwarders) that perform type checks when arriving to a method from a
- // dynamic call-site.
+ // Normally dynamic call sites will call dyn:* forwarders which perform type
+ // checks.
//
- // In AOT mode we don't dynamically generate such trampolines but instead rely
- // on a static analysis to discover which methods can be invoked dynamically,
- // and generate the necessary trampolines during precompilation.
+ // Though for some kinds of methods (e.g. ffi trampolines called from native
+ // code) we do have to perform type checks for all parameters.
return !method.CanReceiveDynamicInvocation();
}
@@ -409,7 +407,7 @@
}
case FunctionLayout::kNoSuchMethodDispatcher:
case FunctionLayout::kInvokeFieldDispatcher:
- case FunctionLayout::kFfiTrampoline:
+ case FunctionLayout::kFfiTrampoline: {
for (intptr_t i = 0; i < function.NumParameters(); ++i) {
LocalVariable* variable = MakeVariable(
TokenPosition::kNoSource, TokenPosition::kNoSource,
@@ -433,6 +431,7 @@
--depth_.catch_;
}
break;
+ }
case FunctionLayout::kSignatureFunction:
case FunctionLayout::kIrregexpFunction:
UNREACHABLE();
@@ -443,6 +442,7 @@
if (parsed_function_->function().MayHaveUncheckedEntryPoint()) {
scope_->AddVariable(parsed_function_->EnsureEntryPointsTemp());
}
+
parsed_function_->AllocateVariables();
return result_;
@@ -633,6 +633,13 @@
LocalVariable* future = scope_->LookupVariable(Symbols::_future(), true);
ASSERT(future != nullptr);
future->set_is_chained_future();
+ future->set_expected_context_index(Context::kFutureTimeoutFutureIndex);
+ } else if (function.recognized_kind() == MethodRecognizer::kFutureWait &&
+ depth_.function_ == 1) {
+ LocalVariable* future = scope_->LookupVariable(Symbols::_future(), true);
+ ASSERT(future != nullptr);
+ future->set_is_chained_future();
+ future->set_expected_context_index(Context::kFutureWaitFutureIndex);
}
}
@@ -1313,7 +1320,8 @@
variable->set_is_late();
variable->set_late_init_offset(initializer_offset);
}
- // Lift the two special async vars out of the function body scope, into the
+
+ // Lift the special async vars out of the function body scope, into the
// outer function declaration scope.
// This way we can allocate them in the outermost context at fixed indices,
// allowing support for --lazy-async-stacks implementation to find awaiters.
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index fc8fa3d..3f77aa2 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -13,6 +13,7 @@
#include "vm/compiler/backend/linearscan.h"
#include "vm/compiler/backend/range_analysis.h"
#include "vm/compiler/compiler_pass.h"
+#include "vm/compiler/intrinsifier.h"
#include "vm/compiler/jit/compiler.h"
#include "vm/cpu.h"
#include "vm/flag_list.h"
@@ -22,9 +23,29 @@
DECLARE_FLAG(bool, print_flow_graph);
DECLARE_FLAG(bool, print_flow_graph_optimized);
+class GraphInstrinsicCodeGenScope {
+ public:
+ explicit GraphInstrinsicCodeGenScope(FlowGraphCompiler* compiler)
+ : compiler_(compiler), old_is_optimizing_(compiler->is_optimizing()) {
+ compiler_->is_optimizing_ = true;
+ }
+ ~GraphInstrinsicCodeGenScope() {
+ compiler_->is_optimizing_ = old_is_optimizing_;
+ }
+
+ private:
+ FlowGraphCompiler* compiler_;
+ bool old_is_optimizing_;
+};
+
namespace compiler {
static void EmitCodeFor(FlowGraphCompiler* compiler, FlowGraph* graph) {
+ // For graph intrinsics we run the linearscan register allocator, which will
+ // pass opt=true for MakeLocationSummary. We therefore also have to ensure
+ // `compiler->is_optimizing()` is set to true during EmitNativeCode.
+ GraphInstrinsicCodeGenScope optimizing_scope(compiler);
+
// The FlowGraph here is constructed by the intrinsics builder methods, and
// is different from compiler->flow_graph(), the original method's flow graph.
compiler->assembler()->Comment("Graph intrinsic begin");
@@ -75,6 +96,7 @@
FlowGraph* graph =
new FlowGraph(parsed_function, graph_entry, block_id, prologue_info);
const Function& function = parsed_function.function();
+
switch (function.recognized_kind()) {
#define EMIT_CASE(class_name, function_name, enum_name, fp) \
case MethodRecognizer::k##enum_name: \
@@ -82,9 +104,15 @@
break;
GRAPH_INTRINSICS_LIST(EMIT_CASE);
- default:
- return false;
#undef EMIT_CASE
+ default:
+ if (function.IsImplicitGetterFunction()) {
+ if (!Build_ImplicitGetter(graph)) return false;
+ } else if (function.IsImplicitSetterFunction()) {
+ if (!Build_ImplicitSetter(graph)) return false;
+ } else {
+ return false;
+ }
}
if (FLAG_support_il_printer && FLAG_print_flow_graph &&
@@ -1054,5 +1082,94 @@
flow_graph);
}
+bool GraphIntrinsifier::Build_ImplicitGetter(FlowGraph* flow_graph) {
+ // This code will only be invoked if our assumptions have been met (see
+ // [Intrinsifier::CanIntrinsifyFieldAccessor])
+ auto zone = flow_graph->zone();
+ const auto& function = flow_graph->function();
+ ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+
+ auto& field = Field::Handle(zone, function.accessor_field());
+ if (Field::ShouldCloneFields()) {
+ field = field.CloneFromOriginal();
+ }
+ ASSERT(field.is_instance() && !field.is_late() && !field.needs_load_guard());
+
+ const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+
+ GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+ auto normal_entry = graph_entry->normal_entry();
+ BlockBuilder builder(flow_graph, normal_entry);
+
+ auto receiver = builder.AddParameter(0, /*with_frame=*/false);
+ auto field_value = builder.AddDefinition(new (zone) LoadFieldInstr(
+ new (zone) Value(receiver), slot, builder.TokenPos()));
+ builder.AddReturn(new (zone) Value(field_value));
+ return true;
+}
+
+bool GraphIntrinsifier::Build_ImplicitSetter(FlowGraph* flow_graph) {
+ // This code will only be invoked if our assumptions have been met (see
+ // [Intrinsifier::CanIntrinsifyFieldAccessor])
+ auto zone = flow_graph->zone();
+ const auto& function = flow_graph->function();
+ ASSERT(Intrinsifier::CanIntrinsifyFieldAccessor(function));
+
+ auto& field = Field::Handle(zone, function.accessor_field());
+ if (Field::ShouldCloneFields()) {
+ field = field.CloneFromOriginal();
+ }
+ ASSERT(field.is_instance() && !field.is_final());
+ ASSERT(!function.HasUnboxedParameters() ||
+ FlowGraphCompiler::IsUnboxedField(field));
+
+ const auto& slot = Slot::Get(field, &flow_graph->parsed_function());
+
+ const auto barrier_mode = FlowGraphCompiler::IsUnboxedField(field)
+ ? kNoStoreBarrier
+ : kEmitStoreBarrier;
+
+ flow_graph->CreateCommonConstants();
+ GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+ auto normal_entry = graph_entry->normal_entry();
+ BlockBuilder builder(flow_graph, normal_entry);
+
+ auto receiver = builder.AddParameter(0, /*with_frame=*/false);
+ auto value = builder.AddParameter(1, /*with_frame=*/false);
+
+ if (!function.HasUnboxedParameters() &&
+ FlowGraphCompiler::IsUnboxedField(field)) {
+ // We do not support storing to possibly guarded fields in JIT in graph
+ // intrinsics.
+ ASSERT(FLAG_precompiled_mode);
+
+ Representation representation = kNoRepresentation;
+ switch (field.guarded_cid()) {
+ case kDoubleCid:
+ representation = kUnboxedDouble;
+ break;
+ case kFloat32x4Cid:
+ representation = kUnboxedFloat32x4;
+ break;
+ case kFloat64x2Cid:
+ representation = kUnboxedFloat64x2;
+ break;
+ default:
+ ASSERT(field.is_non_nullable_integer());
+ representation = kUnboxedInt64;
+ break;
+ }
+ value = builder.AddUnboxInstr(representation, new Value(value),
+ /*is_checked=*/true);
+ }
+
+ builder.AddInstruction(new (zone) StoreInstanceFieldInstr(
+ slot, new (zone) Value(receiver), new (zone) Value(value), barrier_mode,
+ builder.TokenPos()));
+
+ builder.AddReturn(new (zone) Value(flow_graph->constant_null()));
+ return true;
+}
+
} // namespace compiler
} // namespace dart
diff --git a/runtime/vm/compiler/graph_intrinsifier.h b/runtime/vm/compiler/graph_intrinsifier.h
index c122b5c..3104d2f 100644
--- a/runtime/vm/compiler/graph_intrinsifier.h
+++ b/runtime/vm/compiler/graph_intrinsifier.h
@@ -48,6 +48,9 @@
GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
#undef DECLARE_FUNCTION
+
+ static bool Build_ImplicitGetter(FlowGraph* flow_graph);
+ static bool Build_ImplicitSetter(FlowGraph* flow_graph);
};
} // namespace compiler
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index e14922b..7277c21 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -45,7 +45,7 @@
}
return false;
}
- if (!function.is_intrinsic()) {
+ if (!function.is_intrinsic() && !CanIntrinsifyFieldAccessor(function)) {
if (FLAG_trace_intrinsifier) {
THR_Print("No, not intrinsic function.\n");
}
@@ -74,6 +74,85 @@
return true;
}
+bool Intrinsifier::CanIntrinsifyFieldAccessor(const Function& function) {
+ const bool is_getter = function.IsImplicitGetterFunction();
+ const bool is_setter = function.IsImplicitSetterFunction();
+ if (!is_getter && !is_setter) return false;
+
+ Field& field = Field::Handle(function.accessor_field());
+ ASSERT(!field.IsNull());
+
+ // The checks further down examine the field and its guard.
+ //
+ // In JIT mode we only intrinsify the field accessor if there is no active
+ // guard, meaning the state transition has reached its final `kDynamicCid`
+ // state (where it stays).
+ //
+ // If we intrinsify, the intrinsified code therefore does not depend on the
+ // field guard and we do not add it to the guarded fields via
+ // [ParsedFunction::AddToGuardedFields].
+ if (Field::ShouldCloneFields()) {
+ field = field.CloneFromOriginal();
+ }
+
+ // We only graph intrinsify implicit instance getters/setter for now.
+ if (!field.is_instance()) return false;
+
+ if (is_getter) {
+ // We don't support complex getter cases.
+ if (field.is_late() || field.needs_load_guard()) return false;
+
+ if (FlowGraphCompiler::IsPotentialUnboxedField(field)) {
+ if (function.HasUnboxedReturnValue()) {
+ // In AOT mode: Unboxed fields contain the unboxed value and can be
+ // returned in unboxed form.
+ ASSERT(FLAG_precompiled_mode);
+ } else {
+ // In JIT mode: Unboxed fields contain a mutable box which we cannot
+ // return.
+ return false;
+ }
+ } else {
+ // If the field is boxed, then the getter cannot return an unboxed value
+ // either (if it could, we would know the field itself can be unboxed).
+ RELEASE_ASSERT(!function.HasUnboxedReturnValue());
+ }
+ } else {
+ ASSERT(is_setter);
+
+ // We don't support complex setter cases.
+ if (field.is_final()) {
+ RELEASE_ASSERT(field.is_late());
+ return false;
+ }
+
+ // We only support cases where there is no need to check for argument types.
+ //
+ // Normally we have to check the parameter type.
+ ASSERT(function.NeedsArgumentTypeChecks());
+ // Dynamic call sites will go to dyn:set:* instead.
+ ASSERT(!function.CanReceiveDynamicInvocation());
+ // Covariant parameter types have to be checked, which we don't support.
+ if (field.is_covariant() || field.is_generic_covariant_impl()) return false;
+
+ // If the incoming value is unboxed we only support real unboxed fields to
+ // avoid the need for boxing (which we cannot do in the intrinsic).
+ if (function.HasUnboxedParameters()) {
+ ASSERT(FLAG_precompiled_mode);
+ if (!FlowGraphCompiler::IsUnboxedField(field)) {
+ return false;
+ }
+ }
+
+ // We don't support field guards in graph intrinsic stores.
+ if (!FLAG_precompiled_mode && field.guarded_cid() != kDynamicCid) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
struct IntrinsicDesc {
const char* class_name;
const char* function_name;
diff --git a/runtime/vm/compiler/intrinsifier.h b/runtime/vm/compiler/intrinsifier.h
index f8895a4..835f73f 100644
--- a/runtime/vm/compiler/intrinsifier.h
+++ b/runtime/vm/compiler/intrinsifier.h
@@ -34,7 +34,9 @@
static void InitializeState();
private:
+ friend class GraphIntrinsifier; // For CanIntrinsifyFieldAccessor.
static bool CanIntrinsify(const Function& function);
+ static bool CanIntrinsifyFieldAccessor(const Function& function);
};
} // namespace compiler
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index 688084b..6ce72c4 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -30,15 +30,12 @@
#define I (isolate())
#define Z (zone())
-static bool ShouldCloneFields() {
- return Compiler::IsBackgroundCompilation() ||
- FLAG_force_clone_compiler_objects;
-}
-
JitCallSpecializer::JitCallSpecializer(
FlowGraph* flow_graph,
SpeculativeInliningPolicy* speculative_policy)
- : CallSpecializer(flow_graph, speculative_policy, ShouldCloneFields()) {}
+ : CallSpecializer(flow_graph,
+ speculative_policy,
+ Field::ShouldCloneFields()) {}
bool JitCallSpecializer::IsAllowedForInlining(intptr_t deopt_id) const {
return true;
diff --git a/runtime/vm/compiler/offsets_extractor.cc b/runtime/vm/compiler/offsets_extractor.cc
index 80a6870..a75c847 100644
--- a/runtime/vm/compiler/offsets_extractor.cc
+++ b/runtime/vm/compiler/offsets_extractor.cc
@@ -53,9 +53,6 @@
"_element_size = " \
<< Class::ArrayTraits::kElementSize << ";\n";
-#define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName, \
- FieldOffset)
-
#define PRINT_SIZEOF(Class, Name, What) \
std::cout << "static constexpr dart::compiler::target::word AOT_" #Class \
"_" #Name " = " \
@@ -81,8 +78,6 @@
"_" #Name " = " \
<< Class::Name << ";\n";
-#define PRECOMP_NO_CHECK(Code)
-
#else // defined(DART_PRECOMPILED_RUNTIME)
#define PRINT_FIELD_OFFSET(Class, Name) \
@@ -98,9 +93,6 @@
"_element_size = " \
<< Class::ArrayTraits::kElementSize << ";\n";
-#define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName, \
- FieldOffset)
-
#define PRINT_SIZEOF(Class, Name, What) \
std::cout << "static constexpr dart::compiler::target::word " #Class \
"_" #Name " = " \
@@ -126,21 +118,19 @@
"_" #Name " = " \
<< Class::Name << ";\n";
-#define PRECOMP_NO_CHECK(Code) Code
+ JIT_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
+ PRINT_RANGE, PRINT_CONSTANT)
#endif // defined(DART_PRECOMPILED_RUNTIME)
- OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT,
- PRINT_ARRAY_STRUCTFIELD_OFFSET, PRINT_SIZEOF, PRINT_RANGE,
- PRINT_CONSTANT, PRECOMP_NO_CHECK)
+ COMMON_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
+ PRINT_RANGE, PRINT_CONSTANT)
#undef PRINT_FIELD_OFFSET
#undef PRINT_ARRAY_LAYOUT
-#undef PRINT_ARRAY_STRUCTFIELD_OFFSET
#undef PRINT_SIZEOF
#undef PRINT_RANGE
#undef PRINT_CONSTANT
-#undef PRECOMP_NO_CHECK
}
};
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index d497854..c05d57b 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -178,6 +178,7 @@
V(::, reachabilityFence, ReachabilityFence, 0xad39d0a6) \
V(_Utf8Decoder, _scan, Utf8DecoderScan, 0x78f44c3c) \
V(_Future, timeout, FutureTimeout, 0x010f8ad4) \
+ V(Future, wait, FutureWait, 0x486414a9) \
// List of intrinsics:
// (class-name, function-name, intrinsification method, fingerprint).
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 16b4c0c..8a16400 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -508,6 +508,10 @@
return TranslateOffsetInWords(dart::Context::variable_offset(n));
}
+#define DEFINE_CONSTANT(Class, Name) const word Class::Name = Class##_##Name;
+
+#if defined(TARGET_ARCH_IA32)
+
#define DEFINE_FIELD(clazz, name) \
word clazz::name() { return clazz##_##name; }
@@ -516,50 +520,120 @@
return clazz##_elements_start_offset + index * clazz##_element_size; \
}
-#define DEFINE_ARRAY_STRUCTFIELD(clazz, name, element_offset, field_offset) \
- word clazz::name(intptr_t index) { \
- return element_offset(index) + field_offset; \
- }
-
-#if defined(TARGET_ARCH_IA32)
-
#define DEFINE_SIZEOF(clazz, name, what) \
word clazz::name() { return clazz##_##name; }
-#else
-
-#define DEFINE_SIZEOF(clazz, name, what) \
- word clazz::name() { \
- return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name; \
- }
-
-#endif // defined(TARGET_ARCH_IA32)
-
#define DEFINE_RANGE(Class, Getter, Type, First, Last, Filter) \
word Class::Getter(Type index) { \
return Class##_##Getter[static_cast<intptr_t>(index) - \
static_cast<intptr_t>(First)]; \
}
-#define DEFINE_CONSTANT(Class, Name) const word Class::Name = Class##_##Name;
+JIT_OFFSETS_LIST(DEFINE_FIELD,
+ DEFINE_ARRAY,
+ DEFINE_SIZEOF,
+ DEFINE_RANGE,
+ DEFINE_CONSTANT)
-#define PRECOMP_NO_CHECK(Code) Code
+COMMON_OFFSETS_LIST(DEFINE_FIELD,
+ DEFINE_ARRAY,
+ DEFINE_SIZEOF,
+ DEFINE_RANGE,
+ DEFINE_CONSTANT)
-OFFSETS_LIST(DEFINE_FIELD,
- DEFINE_ARRAY,
- DEFINE_ARRAY_STRUCTFIELD,
- DEFINE_SIZEOF,
- DEFINE_RANGE,
- DEFINE_CONSTANT,
- PRECOMP_NO_CHECK)
+#else
+
+#define DEFINE_JIT_FIELD(clazz, name) \
+ word clazz::name() { \
+ if (FLAG_precompiled_mode) { \
+ FATAL1("Use JIT-only field %s in precompiled mode", #clazz "::" #name); \
+ } \
+ return clazz##_##name; \
+ }
+
+#define DEFINE_JIT_ARRAY(clazz, name) \
+ word clazz::name(intptr_t index) { \
+ if (FLAG_precompiled_mode) { \
+ FATAL1("Use of JIT-only array %s in precompiled mode", \
+ #clazz "::" #name); \
+ } \
+ return clazz##_elements_start_offset + index * clazz##_element_size; \
+ }
+
+#define DEFINE_JIT_SIZEOF(clazz, name, what) \
+ word clazz::name() { \
+ if (FLAG_precompiled_mode) { \
+ FATAL1("Use of JIT-only sizeof %s in precompiled mode", \
+ #clazz "::" #name); \
+ } \
+ return clazz##_##name; \
+ }
+
+#define DEFINE_JIT_RANGE(Class, Getter, Type, First, Last, Filter) \
+ word Class::Getter(Type index) { \
+ if (FLAG_precompiled_mode) { \
+ FATAL1("Use of JIT-only range %s in precompiled mode", \
+ #Class "::" #Getter); \
+ } \
+ return Class##_##Getter[static_cast<intptr_t>(index) - \
+ static_cast<intptr_t>(First)]; \
+ }
+
+JIT_OFFSETS_LIST(DEFINE_JIT_FIELD,
+ DEFINE_JIT_ARRAY,
+ DEFINE_JIT_SIZEOF,
+ DEFINE_JIT_RANGE,
+ DEFINE_CONSTANT)
+
+#undef DEFINE_JIT_FIELD
+#undef DEFINE_JIT_ARRAY
+#undef DEFINE_JIT_SIZEOF
+#undef DEFINE_JIT_RANGE
+
+#define DEFINE_FIELD(clazz, name) \
+ word clazz::name() { \
+ return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name; \
+ }
+
+#define DEFINE_ARRAY(clazz, name) \
+ word clazz::name(intptr_t index) { \
+ if (FLAG_precompiled_mode) { \
+ return AOT_##clazz##_elements_start_offset + \
+ index * AOT_##clazz##_element_size; \
+ } else { \
+ return clazz##_elements_start_offset + index * clazz##_element_size; \
+ } \
+ }
+
+#define DEFINE_SIZEOF(clazz, name, what) \
+ word clazz::name() { \
+ return FLAG_precompiled_mode ? AOT_##clazz##_##name : clazz##_##name; \
+ }
+
+#define DEFINE_RANGE(Class, Getter, Type, First, Last, Filter) \
+ word Class::Getter(Type index) { \
+ if (FLAG_precompiled_mode) { \
+ return AOT_##Class##_##Getter[static_cast<intptr_t>(index) - \
+ static_cast<intptr_t>(First)]; \
+ } else { \
+ return Class##_##Getter[static_cast<intptr_t>(index) - \
+ static_cast<intptr_t>(First)]; \
+ } \
+ }
+
+COMMON_OFFSETS_LIST(DEFINE_FIELD,
+ DEFINE_ARRAY,
+ DEFINE_SIZEOF,
+ DEFINE_RANGE,
+ DEFINE_CONSTANT)
+
+#endif
#undef DEFINE_FIELD
#undef DEFINE_ARRAY
-#undef DEFINE_ARRAY_STRUCTFIELD
#undef DEFINE_SIZEOF
#undef DEFINE_RANGE
#undef DEFINE_CONSTANT
-#undef PRECOMP_NO_CHECK
const word StoreBufferBlock::kSize = dart::StoreBufferBlock::kSize;
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 0f16b0f..d222e0f 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -18,6 +18,10 @@
#if !defined(PRODUCT)
#if defined(TARGET_ARCH_ARM)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 76;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 16;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
8;
static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -118,8 +122,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 44;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 76;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
4;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -137,8 +139,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 20;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 40;
@@ -510,6 +510,10 @@
#endif // defined(TARGET_ARCH_ARM)
#if defined(TARGET_ARCH_X64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 132;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 32;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
16;
static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -612,8 +616,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 88;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 132;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
8;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -631,8 +633,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 40;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 80;
@@ -1010,6 +1010,10 @@
#endif // defined(TARGET_ARCH_X64)
#if defined(TARGET_ARCH_IA32)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 76;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 16;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
8;
static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -1110,8 +1114,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 44;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 76;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
4;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -1129,8 +1131,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 20;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 40;
@@ -1499,6 +1499,10 @@
#endif // defined(TARGET_ARCH_IA32)
#if defined(TARGET_ARCH_ARM64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 132;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 32;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
16;
static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -1601,8 +1605,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 88;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 132;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
8;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -1620,8 +1622,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 40;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 80;
@@ -2002,6 +2002,10 @@
#else // !defined(PRODUCT)
#if defined(TARGET_ARCH_ARM)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 76;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 16;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
8;
static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -2100,8 +2104,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 44;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 76;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
4;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -2119,8 +2121,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 20;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 40;
@@ -2488,6 +2488,10 @@
#endif // defined(TARGET_ARCH_ARM)
#if defined(TARGET_ARCH_X64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 132;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 32;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
16;
static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -2588,8 +2592,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 88;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 132;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
8;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -2607,8 +2609,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 40;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 80;
@@ -2982,6 +2982,10 @@
#endif // defined(TARGET_ARCH_X64)
#if defined(TARGET_ARCH_IA32)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 76;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 16;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
8;
static constexpr dart::compiler::target::word ObjectPool_element_size = 4;
@@ -3080,8 +3084,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 44;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 76;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
4;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -3099,8 +3101,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 20;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 40;
@@ -3465,6 +3465,10 @@
#endif // defined(TARGET_ARCH_IA32)
#if defined(TARGET_ARCH_ARM64)
+static constexpr dart::compiler::target::word Function_usage_counter_offset =
+ 132;
+static constexpr dart::compiler::target::word
+ ICData_receivers_static_type_offset = 32;
static constexpr dart::compiler::target::word ObjectPool_elements_start_offset =
16;
static constexpr dart::compiler::target::word ObjectPool_element_size = 8;
@@ -3565,8 +3569,6 @@
static constexpr dart::compiler::target::word Function_code_offset = 88;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
-static constexpr dart::compiler::target::word Function_usage_counter_offset =
- 132;
static constexpr dart::compiler::target::word FutureOr_type_arguments_offset =
8;
static constexpr dart::compiler::target::word GrowableObjectArray_data_offset =
@@ -3584,8 +3586,6 @@
static constexpr dart::compiler::target::word ICData_owner_offset = 40;
static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
static constexpr dart::compiler::target::word
- ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word
Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
Isolate_cached_class_table_table_offset = 80;
@@ -4059,6 +4059,13 @@
AOT_Field_initializer_function_offset = 16;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 20;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 44;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 24;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {4, 8};
@@ -4077,6 +4084,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 12;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 16;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 20;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
@@ -4596,6 +4605,13 @@
AOT_Field_initializer_function_offset = 32;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
@@ -4614,6 +4630,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
@@ -5139,6 +5157,13 @@
AOT_Field_initializer_function_offset = 32;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
@@ -5157,6 +5182,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
@@ -5679,6 +5706,13 @@
AOT_Field_initializer_function_offset = 16;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 20;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 44;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 24;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {4, 8};
@@ -5697,6 +5731,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 12;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 16;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 20;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 36;
static constexpr dart::compiler::target::word
@@ -6209,6 +6245,13 @@
AOT_Field_initializer_function_offset = 32;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
@@ -6227,6 +6270,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
@@ -6745,6 +6790,13 @@
AOT_Field_initializer_function_offset = 32;
static constexpr dart::compiler::target::word
AOT_Field_host_offset_or_field_id_offset = 40;
+static constexpr dart::compiler::target::word AOT_Field_guarded_cid_offset = 72;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_in_object_offset_offset = 76;
+static constexpr dart::compiler::target::word
+ AOT_Field_guarded_list_length_offset = 48;
+static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
+static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
@@ -6763,6 +6815,8 @@
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedMask = 3;
static constexpr dart::compiler::target::word AOT_ICData_NumArgsTestedShift = 0;
static constexpr dart::compiler::target::word AOT_ICData_entries_offset = 24;
+static constexpr dart::compiler::target::word AOT_ICData_owner_offset = 32;
+static constexpr dart::compiler::target::word AOT_ICData_state_bits_offset = 40;
static constexpr dart::compiler::target::word
AOT_Isolate_shared_class_table_offset = 72;
static constexpr dart::compiler::target::word
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index d241c74..67b3283 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -21,16 +21,17 @@
// FIELD(Class, Name) Offset of a field within a class.
// ARRAY(Class, Name) Offset of the first element and the size of the elements
// in an array of this class.
-// ARRAY_STRUCTFIELD(Class, Name, Element, Field) Offset of a field within a
-// struct in an array of that struct, relative to the start of the array.
// SIZEOF(Class, Name, What) Size of an object.
// RANGE(Class, Name, Type, First, Last, Filter) An array of offsets generated
// by passing a value of the given Type in the range from First to Last to
// Class::Name() if Filter returns true for that value.
// CONSTANT(Class, Name) Miscellaneous constant.
-// PRECOMP_NO_CHECK(Code) Don't check this offset in the precompiled runtime.
-#define OFFSETS_LIST(FIELD, ARRAY, ARRAY_STRUCTFIELD, SIZEOF, RANGE, CONSTANT, \
- PRECOMP_NO_CHECK) \
+//
+// COMMON_OFFSETS_LIST is for declarations that are valid in all contexts.
+// JIT_OFFSETS_LIST is for declarations that are only valid in JIT mode.
+// A declaration that is not valid in product mode can be wrapped with
+// NOT_IN_PRODUCT().
+#define COMMON_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT) \
ARRAY(ObjectPool, element_offset) \
CONSTANT(Array, kMaxElements) \
CONSTANT(Array, kMaxNewSpaceElements) \
@@ -85,15 +86,14 @@
FIELD(Float64x2, value_offset) \
FIELD(Field, initializer_function_offset) \
FIELD(Field, host_offset_or_field_id_offset) \
- PRECOMP_NO_CHECK(FIELD(Field, guarded_cid_offset)) \
- PRECOMP_NO_CHECK(FIELD(Field, guarded_list_length_in_object_offset_offset)) \
- PRECOMP_NO_CHECK(FIELD(Field, guarded_list_length_offset)) \
- PRECOMP_NO_CHECK(FIELD(Field, is_nullable_offset)) \
- PRECOMP_NO_CHECK(FIELD(Field, kind_bits_offset)) \
+ FIELD(Field, guarded_cid_offset) \
+ FIELD(Field, guarded_list_length_in_object_offset_offset) \
+ FIELD(Field, guarded_list_length_offset) \
+ FIELD(Field, is_nullable_offset) \
+ FIELD(Field, kind_bits_offset) \
FIELD(Function, code_offset) \
RANGE(Function, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal, \
CodeEntryKind::kUnchecked, [](CodeEntryKind value) { return true; }) \
- PRECOMP_NO_CHECK(FIELD(Function, usage_counter_offset)) \
FIELD(FutureOr, type_arguments_offset) \
FIELD(GrowableObjectArray, data_offset) \
FIELD(GrowableObjectArray, length_offset) \
@@ -103,9 +103,8 @@
FIELD(ICData, NumArgsTestedMask) \
FIELD(ICData, NumArgsTestedShift) \
FIELD(ICData, entries_offset) \
- PRECOMP_NO_CHECK(FIELD(ICData, owner_offset)) \
- PRECOMP_NO_CHECK(FIELD(ICData, state_bits_offset)) \
- NOT_IN_PRECOMPILED_RUNTIME(FIELD(ICData, receivers_static_type_offset)) \
+ FIELD(ICData, owner_offset) \
+ FIELD(ICData, state_bits_offset) \
FIELD(Isolate, shared_class_table_offset) \
FIELD(Isolate, cached_class_table_table_offset) \
FIELD(Isolate, current_tag_offset) \
@@ -355,4 +354,8 @@
SIZEOF(WeakSerializationReference, InstanceSize, \
WeakSerializationReferenceLayout)
+#define JIT_OFFSETS_LIST(FIELD, ARRAY, SIZEOF, RANGE, CONSTANT) \
+ FIELD(Function, usage_counter_offset) \
+ FIELD(ICData, receivers_static_type_offset)
+
#endif // RUNTIME_VM_COMPILER_RUNTIME_OFFSETS_LIST_H_
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 2ef0df4..deb8784 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -195,7 +195,7 @@
}
__ LeaveStubFrame();
__ PopRegisters(all_registers);
- __ Pop(LR);
+ __ Drop(1); // We use the LR restored via LeaveStubFrame.
__ bx(LR);
}
@@ -208,7 +208,7 @@
ASSERT(!store_runtime_result_in_r0 || allow_return);
auto perform_runtime_call = [&]() {
if (store_runtime_result_in_r0) {
- __ PushRegister(LR); // Push an even register.
+ __ PushRegister(LR);
}
__ CallRuntime(*target, /*argument_count=*/0);
if (store_runtime_result_in_r0) {
@@ -1205,12 +1205,13 @@
// For test purpose call allocation stub without inline allocation attempt.
if (!FLAG_use_slow_path) {
Label slow_case;
- __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
- /*temp_reg=*/R1);
+ __ TryAllocate(compiler::MintClass(), &slow_case,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
__ Ret();
__ Bind(&slow_case);
}
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
&kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
@@ -1224,12 +1225,13 @@
// For test purpose call allocation stub without inline allocation attempt.
if (!FLAG_use_slow_path) {
Label slow_case;
- __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
- /*temp_reg=*/R1);
+ __ TryAllocate(compiler::MintClass(), &slow_case,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
__ Ret();
__ Bind(&slow_case);
}
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
GenerateSharedStub(
assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
@@ -2201,6 +2203,10 @@
Assembler* assembler) {
Register ic_reg = R9;
Register func_reg = R8;
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
if (FLAG_trace_optimized_ic_calls) {
__ EnterStubFrame();
__ PushList((1 << R9) | (1 << R8)); // Preserve.
@@ -2219,6 +2225,10 @@
// Loads function into 'temp_reg'.
void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
Register temp_reg) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
if (FLAG_optimization_counter_threshold >= 0) {
Register ic_reg = R9;
Register func_reg = temp_reg;
@@ -2333,6 +2343,11 @@
Optimized optimized,
CallType type,
Exactness exactness) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
+
const bool save_entry_point = kind == Token::kILLEGAL;
if (save_entry_point) {
GenerateRecordEntryPoint(assembler);
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 8050974..db103f75 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -209,7 +209,7 @@
}
__ LeaveStubFrame();
__ PopRegisters(all_registers);
- __ Pop(LR);
+ __ Drop(1); // We use the LR restored via LeaveStubFrame.
__ ret(LR);
}
@@ -1331,12 +1331,13 @@
// For test purpose call allocation stub without inline allocation attempt.
if (!FLAG_use_slow_path) {
Label slow_case;
- __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
- /*temp_reg=*/R1);
+ __ TryAllocate(compiler::MintClass(), &slow_case,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
__ Ret();
__ Bind(&slow_case);
}
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
&kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
@@ -1349,12 +1350,13 @@
// For test purpose call allocation stub without inline allocation attempt.
if (!FLAG_use_slow_path) {
Label slow_case;
- __ TryAllocate(compiler::MintClass(), &slow_case, /*instance_reg=*/R0,
- /*temp_reg=*/R1);
+ __ TryAllocate(compiler::MintClass(), &slow_case,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
__ Ret();
__ Bind(&slow_case);
}
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
GenerateSharedStub(
assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
@@ -2348,6 +2350,10 @@
Assembler* assembler) {
Register ic_reg = R5;
Register func_reg = R6;
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
if (FLAG_trace_optimized_ic_calls) {
__ EnterStubFrame();
__ Push(R6); // Preserve.
@@ -2370,6 +2376,10 @@
// Loads function into 'temp_reg'.
void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
Register temp_reg) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
if (FLAG_optimization_counter_threshold >= 0) {
Register ic_reg = R5;
Register func_reg = temp_reg;
@@ -2487,6 +2497,11 @@
CallType type,
Exactness exactness) {
const bool save_entry_point = kind == Token::kILLEGAL;
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
+
if (save_entry_point) {
GenerateRecordEntryPoint(assembler);
}
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 7096c77..a4a6045 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -194,14 +194,11 @@
return;
}
__ LeaveStubFrame();
-
- // Drop "official" return address -- we can just use the one stored above the
- // saved registers.
- __ Drop(1);
-
+ // Copy up the return address (in case it was changed).
+ __ popq(TMP);
+ __ movq(Address(RSP, kAllSavedRegistersSlots * target::kWordSize), TMP);
__ PopRegisters(kDartAvailableCpuRegs,
save_fpu_registers ? kAllFpuRegistersList : 0);
-
__ ret();
}
@@ -209,9 +206,20 @@
bool save_fpu_registers,
const RuntimeEntry* target,
intptr_t self_code_stub_offset_from_thread,
- bool allow_return) {
+ bool allow_return,
+ bool store_runtime_result_in_rax = false) {
auto perform_runtime_call = [&]() {
+ if (store_runtime_result_in_rax) {
+ __ PushImmediate(Immediate(0));
+ }
__ CallRuntime(*target, /*argument_count=*/0);
+ if (store_runtime_result_in_rax) {
+ __ PopRegister(RAX);
+ __ movq(Address(RBP,
+ target::kWordSize *
+ StubCodeCompiler::WordOffsetFromFpToCpuRegister(RAX)),
+ RAX);
+ }
};
GenerateSharedStubGeneric(assembler, save_fpu_registers,
self_code_stub_offset_from_thread, allow_return,
@@ -1241,12 +1249,40 @@
void StubCodeCompiler::GenerateAllocateMintSharedWithFPURegsStub(
Assembler* assembler) {
- __ Stop("Unimplemented");
+ // For test purpose call allocation stub without inline allocation attempt.
+ if (!FLAG_use_slow_path) {
+ Label slow_case;
+ __ TryAllocate(compiler::MintClass(), &slow_case, /*near_jump=*/true,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
+ __ Ret();
+
+ __ Bind(&slow_case);
+ }
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+ GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
+ &kAllocateMintRuntimeEntry,
+ target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
+ /*allow_return=*/true,
+ /*store_runtime_result_in_rax=*/true);
}
void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
Assembler* assembler) {
- __ Stop("Unimplemented");
+ // For test purpose call allocation stub without inline allocation attempt.
+ if (!FLAG_use_slow_path) {
+ Label slow_case;
+ __ TryAllocate(compiler::MintClass(), &slow_case, /*near_jump=*/true,
+ AllocateMintABI::kResultReg, AllocateMintABI::kTempReg);
+ __ Ret();
+
+ __ Bind(&slow_case);
+ }
+ COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
+ target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
+ /*allow_return=*/true,
+ /*store_runtime_result_in_rax=*/true);
}
// Called when invoking Dart code from C++ (VM code).
@@ -2240,6 +2276,10 @@
// function and not the top-scope function.
void StubCodeCompiler::GenerateOptimizedUsageCounterIncrement(
Assembler* assembler) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
Register ic_reg = RBX;
Register func_reg = RDI;
if (FLAG_trace_optimized_ic_calls) {
@@ -2261,6 +2301,10 @@
// Loads function into 'temp_reg', preserves 'ic_reg'.
void StubCodeCompiler::GenerateUsageCounterIncrement(Assembler* assembler,
Register temp_reg) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
if (FLAG_optimization_counter_threshold >= 0) {
Register ic_reg = RBX;
Register func_reg = temp_reg;
@@ -2380,6 +2424,11 @@
Optimized optimized,
CallType type,
Exactness exactness) {
+ if (FLAG_precompiled_mode) {
+ __ Breakpoint();
+ return;
+ }
+
const bool save_entry_point = kind == Token::kILLEGAL;
if (save_entry_point) {
GenerateRecordEntryPoint(assembler);
@@ -2558,8 +2607,8 @@
FieldAddress(RBX, target::ICData::receivers_static_type_offset()));
__ movq(RCX, FieldAddress(RCX, target::Type::arguments_offset()));
// RAX contains an offset to type arguments in words as a smi,
- // hence TIMES_4. RDX is guaranteed to be non-smi because it is expected to
- // have type arguments.
+ // hence TIMES_4. RDX is guaranteed to be non-smi because it is expected
+ // to have type arguments.
__ cmpq(RCX, FieldAddress(RDX, RAX, TIMES_4, 0));
__ j(EQUAL, &call_target_function_through_unchecked_entry);
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 7a34b6e..ea46f78a 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -387,6 +387,12 @@
static const Register kIndexReg = R1;
};
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+ static const Register kResultReg = R0;
+ static const Register kTempReg = R1;
+};
+
// TODO(regis): Add ABIs for type testing stubs and is-type test stubs instead
// of reusing the constants of the instantiation stubs ABI.
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 1568201..2ce6ac37 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -219,6 +219,12 @@
static const Register kIndexReg = R1;
};
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+ static const Register kResultReg = R0;
+ static const Register kTempReg = R1;
+};
+
// TODO(regis): Add ABIs for type testing stubs and is-type test stubs instead
// of reusing the constants of the instantiation stubs ABI.
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 84d27c1..d696eac 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -200,6 +200,12 @@
static const Register kIndexReg = RBX;
};
+// ABI for AllocateMint*Stub.
+struct AllocateMintABI {
+ static const Register kResultReg = RAX;
+ static const Register kTempReg = RBX;
+};
+
// Registers used inside the implementation of type testing stubs.
struct TTSInternalRegs {
static const Register kInstanceTypeArgumentsReg = RSI;
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 99aa048..72d86d6 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -106,26 +106,48 @@
ok = false; \
}
-#define CHECK_FIELD(Class, Name) CHECK_OFFSET(Class::Name(), Class##_##Name)
+#if defined(DART_PRECOMPILED_RUNTIME)
+#define CHECK_FIELD(Class, Name) \
+ CHECK_OFFSET(Class::Name(), AOT_##Class##_##Name);
#define CHECK_ARRAY(Class, Name) \
CHECK_OFFSET(Class::ArrayTraits::elements_start_offset(), \
- Class##_elements_start_offset) \
- CHECK_OFFSET(Class::ArrayTraits::kElementSize, Class##_element_size)
-#define CHECK_ARRAY_STRUCTFIELD(Class, Name, ElementOffsetName, FieldOffset)
-
-#if defined(DART_PRECOMPILED_RUNTIME)
+ AOT_##Class##_elements_start_offset); \
+ CHECK_OFFSET(Class::ArrayTraits::kElementSize, AOT_##Class##_element_size)
#define CHECK_SIZEOF(Class, Name, What) \
- CHECK_OFFSET(sizeof(What), AOT_##Class##_##Name)
+ CHECK_OFFSET(sizeof(What), AOT_##Class##_##Name);
+#define CHECK_RANGE(Class, Getter, Type, First, Last, Filter) \
+ for (intptr_t i = static_cast<intptr_t>(First); \
+ i <= static_cast<intptr_t>(Last); i++) { \
+ if (Filter(static_cast<Type>(i))) { \
+ CHECK_OFFSET(Class::Getter(static_cast<Type>(i)), \
+ AOT_##Class##_##Getter[i]); \
+ } \
+ }
+#define CHECK_CONSTANT(Class, Name) \
+ CHECK_OFFSET(Class::Name, AOT_##Class##_##Name);
#else
+#define CHECK_FIELD(Class, Name) CHECK_OFFSET(Class::Name(), Class##_##Name);
+#define CHECK_ARRAY(Class, Name) \
+ CHECK_OFFSET(Class::ArrayTraits::elements_start_offset(), \
+ Class##_elements_start_offset); \
+ CHECK_OFFSET(Class::ArrayTraits::kElementSize, Class##_element_size);
#define CHECK_SIZEOF(Class, Name, What) \
- CHECK_OFFSET(sizeof(What), Class##_##Name)
-#endif
+ CHECK_OFFSET(sizeof(What), Class##_##Name);
+#define CHECK_RANGE(Class, Getter, Type, First, Last, Filter) \
+ for (intptr_t i = static_cast<intptr_t>(First); \
+ i <= static_cast<intptr_t>(Last); i++) { \
+ if (Filter(static_cast<Type>(i))) { \
+ CHECK_OFFSET(Class::Getter(static_cast<Type>(i)), Class##_##Getter[i]); \
+ } \
+ }
+#define CHECK_CONSTANT(Class, Name) CHECK_OFFSET(Class::Name, Class##_##Name);
+#endif // defined(DART_PRECOMPILED_RUNTIME)
-#define CHECK_RANGE(Class, Name, Type, First, Last, Filter)
-#define CHECK_CONSTANT(Class, Name) CHECK_OFFSET(Class::Name, Class##_##Name)
+ COMMON_OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE,
+ CHECK_CONSTANT)
- OFFSETS_LIST(CHECK_FIELD, CHECK_ARRAY, CHECK_ARRAY_STRUCTFIELD, CHECK_SIZEOF,
- CHECK_RANGE, CHECK_CONSTANT, NOT_IN_PRECOMPILED_RUNTIME)
+ NOT_IN_PRECOMPILED_RUNTIME(JIT_OFFSETS_LIST(
+ CHECK_FIELD, CHECK_ARRAY, CHECK_SIZEOF, CHECK_RANGE, CHECK_CONSTANT))
if (!ok) {
FATAL(
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index d77f84c..1b04132 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -3820,11 +3820,21 @@
case kExternalTypedDataFloat64ArrayCid:
type = Dart_TypedData_kFloat64;
break;
+ case kTypedDataInt32x4ArrayCid:
+ case kTypedDataInt32x4ArrayViewCid:
+ case kExternalTypedDataInt32x4ArrayCid:
+ type = Dart_TypedData_kInt32x4;
+ break;
case kTypedDataFloat32x4ArrayCid:
case kTypedDataFloat32x4ArrayViewCid:
case kExternalTypedDataFloat32x4ArrayCid:
type = Dart_TypedData_kFloat32x4;
break;
+ case kTypedDataFloat64x2ArrayCid:
+ case kTypedDataFloat64x2ArrayViewCid:
+ case kExternalTypedDataFloat64x2ArrayCid:
+ type = Dart_TypedData_kFloat64x2;
+ break;
default:
type = Dart_TypedData_kInvalid;
break;
@@ -4000,8 +4010,12 @@
return NewTypedData(T, kTypedDataFloat32ArrayCid, length);
case Dart_TypedData_kFloat64:
return NewTypedData(T, kTypedDataFloat64ArrayCid, length);
+ case Dart_TypedData_kInt32x4:
+ return NewTypedData(T, kTypedDataInt32x4ArrayCid, length);
case Dart_TypedData_kFloat32x4:
return NewTypedData(T, kTypedDataFloat32x4ArrayCid, length);
+ case Dart_TypedData_kFloat64x2:
+ return NewTypedData(T, kTypedDataFloat64x2ArrayCid, length);
default:
return Api::NewError("%s expects argument 'type' to be of 'TypedData'",
CURRENT_FUNC);
@@ -4077,10 +4091,18 @@
return NewExternalTypedData(T, kExternalTypedDataFloat64ArrayCid, data,
length, peer, external_allocation_size,
callback);
+ case Dart_TypedData_kInt32x4:
+ return NewExternalTypedData(T, kExternalTypedDataInt32x4ArrayCid, data,
+ length, peer, external_allocation_size,
+ callback);
case Dart_TypedData_kFloat32x4:
return NewExternalTypedData(T, kExternalTypedDataFloat32x4ArrayCid, data,
length, peer, external_allocation_size,
callback);
+ case Dart_TypedData_kFloat64x2:
+ return NewExternalTypedData(T, kExternalTypedDataFloat64x2ArrayCid, data,
+ length, peer, external_allocation_size,
+ callback);
default:
return Api::NewError(
"%s expects argument 'type' to be of"
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index f5814c4..613614e 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -139,6 +139,10 @@
case Dart_TypedData_kUint64:
case Dart_TypedData_kFloat64:
return 8;
+ case Dart_TypedData_kInt32x4:
+ case Dart_TypedData_kFloat32x4:
+ case Dart_TypedData_kFloat64x2:
+ return 16;
default:
break;
}
@@ -636,7 +640,10 @@
V(Int64, int64_t) \
V(Uint64, uint64_t) \
V(Float32, float) \
- V(Float64, double)
+ V(Float64, double) \
+ V(Int32x4, simd128_value_t) \
+ V(Float32x4, simd128_value_t) \
+ V(Float64x2, simd128_value_t)
#define EMIT_TYPED_DATA_CASES(type, c_type) \
case kTypedData##type##ArrayCid: \
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index aa310f9..f60c17b 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -245,38 +245,31 @@
break;
}
+ cls = instance.clazz();
// Find a call getter, if any, in the class hierarchy.
- for (cls = instance.clazz(); !cls.IsNull(); cls = cls.SuperClass()) {
- function = cls.LookupDynamicFunction(getter_name);
- if (function.IsNull()) {
- continue;
- }
-
- if (!OSThread::Current()->HasStackHeadroom()) {
- const Instance& exception =
- Instance::Handle(zone, isolate->object_store()->stack_overflow());
- return UnhandledException::New(exception, StackTrace::Handle(zone));
- }
-
- const Array& getter_arguments = Array::Handle(zone, Array::New(1));
- getter_arguments.SetAt(0, instance);
- const Object& getter_result = Object::Handle(
- zone, DartEntry::InvokeFunction(function, getter_arguments));
- if (getter_result.IsError()) {
- return getter_result.raw();
- }
- ASSERT(getter_result.IsNull() || getter_result.IsInstance());
-
- // We have a new possibly compatible callable, so set the first argument
- // accordingly so it gets picked up in the main loop.
- arguments.SetAt(receiver_index, getter_result);
+ function = Resolver::ResolveDynamicAnyArgs(zone, cls, getter_name,
+ /*allow_add=*/false);
+ if (function.IsNull()) {
break;
}
-
- // No call getter was found in the hierarchy, so stop the search.
- if (cls.IsNull()) {
- break;
+ if (!OSThread::Current()->HasStackHeadroom()) {
+ const Instance& exception =
+ Instance::Handle(zone, isolate->object_store()->stack_overflow());
+ return UnhandledException::New(exception, StackTrace::Handle(zone));
}
+
+ const Array& getter_arguments = Array::Handle(zone, Array::New(1));
+ getter_arguments.SetAt(0, instance);
+ const Object& getter_result = Object::Handle(
+ zone, DartEntry::InvokeFunction(function, getter_arguments));
+ if (getter_result.IsError()) {
+ return getter_result.raw();
+ }
+ ASSERT(getter_result.IsNull() || getter_result.IsInstance());
+
+ // We have a new possibly compatible callable, so set the first argument
+ // accordingly so it gets picked up in the main loop.
+ arguments.SetAt(receiver_index, getter_result);
}
// No compatible callable was found.
diff --git a/runtime/vm/heap/become.h b/runtime/vm/heap/become.h
index ef76a45..3958c8d 100644
--- a/runtime/vm/heap/become.h
+++ b/runtime/vm/heap/become.h
@@ -86,11 +86,11 @@
// (used for morphic instances during reload).
static void MakeDummyObject(const Instance& instance);
- private:
// Update any references pointing to forwarding objects to point the
// forwarding objects' targets.
static void FollowForwardingPointers(Thread* thread);
+ private:
static void CrashDump(ObjectPtr before_obj, ObjectPtr after_obj);
};
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 83ff8a8..8c89691 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -68,6 +68,7 @@
gc_new_space_in_progress_(false),
gc_old_space_in_progress_(false),
last_gc_was_old_space_(false),
+ assume_scavenge_will_fail_(false),
gc_on_nth_allocation_(kNoForcedGarbageCollection) {
UpdateGlobalMaxUsed();
for (int sel = 0; sel < kNumWeakSelectors; sel++) {
@@ -92,7 +93,7 @@
if (LIKELY(addr != 0)) {
return addr;
}
- if (new_space_.GrowthControlState()) {
+ if (!assume_scavenge_will_fail_ && new_space_.GrowthControlState()) {
// This call to CollectGarbage might end up "reusing" a collection spawned
// from a different thread and will be racing to allocate the requested
// memory with other threads being released after the collection.
@@ -400,6 +401,7 @@
ASSERT(gc_old_space_in_progress_);
gc_old_space_in_progress_ = false;
last_gc_was_old_space_ = true;
+ assume_scavenge_will_fail_ = false;
ml.NotifyAll();
}
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index f780ea1..bb6652e 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -416,6 +416,7 @@
bool gc_new_space_in_progress_;
bool gc_old_space_in_progress_;
bool last_gc_was_old_space_;
+ bool assume_scavenge_will_fail_;
static const intptr_t kNoForcedGarbageCollection = -1;
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 0fb6cb9..cfed7d7 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -15,6 +15,7 @@
#include "vm/heap/weak_table.h"
#include "vm/isolate.h"
#include "vm/lockers.h"
+#include "vm/longjump.h"
#include "vm/object.h"
#include "vm/object_id_ring.h"
#include "vm/object_set.h"
@@ -178,43 +179,69 @@
void ProcessRoots() {
thread_ = Thread::Current();
page_space_->AcquireLock(freelist_);
- scavenger_->IterateRoots(this);
+
+ LongJumpScope jump;
+ if (setjmp(*jump.Set()) == 0) {
+ scavenger_->IterateRoots(this);
+ } else {
+ ASSERT(scavenger_->abort_);
+ thread_->ClearStickyError();
+ }
}
void ProcessSurvivors() {
- // Iterate until all work has been drained.
- do {
- ProcessToSpace();
- ProcessPromotedList();
- } while (HasWork());
+ LongJumpScope jump;
+ if (setjmp(*jump.Set()) == 0) {
+ // Iterate until all work has been drained.
+ do {
+ ProcessToSpace();
+ ProcessPromotedList();
+ } while (HasWork());
+ } else {
+ ASSERT(scavenger_->abort_);
+ thread_->ClearStickyError();
+ }
}
void ProcessAll() {
- do {
- ProcessSurvivors();
- ProcessWeakProperties();
- } while (HasWork());
+ LongJumpScope jump;
+ if (setjmp(*jump.Set()) == 0) {
+ do {
+ do {
+ ProcessToSpace();
+ ProcessPromotedList();
+ } while (HasWork());
+ ProcessWeakProperties();
+ } while (HasWork());
+ } else {
+ ASSERT(scavenger_->abort_);
+ thread_->ClearStickyError();
+ }
}
inline void ProcessWeakProperties();
bool HasWork() {
+ if (scavenger_->abort_) return false;
return (scan_ != tail_) || (scan_ != nullptr && !scan_->IsResolved()) ||
!promoted_list_.IsEmpty();
}
void Finalize() {
- ASSERT(!HasWork());
+ if (scavenger_->abort_) {
+ promoted_list_.AbandonWork();
+ } else {
+ ASSERT(!HasWork());
- for (NewPage* page = head_; page != nullptr; page = page->next()) {
- ASSERT(page->IsResolved());
- page->RecordSurvivors();
+ for (NewPage* page = head_; page != nullptr; page = page->next()) {
+ ASSERT(page->IsResolved());
+ page->RecordSurvivors();
+ }
+
+ promoted_list_.Finalize();
+
+ MournWeakProperties();
}
-
- promoted_list_.Finalize();
-
- MournWeakProperties();
-
page_space_->ReleaseLock(freelist_);
thread_ = nullptr;
}
@@ -278,7 +305,7 @@
// To-space was exhausted by fragmentation and old-space could not
// grow.
if (UNLIKELY(new_addr == 0)) {
- OUT_OF_MEMORY();
+ AbortScavenge();
}
}
}
@@ -375,6 +402,14 @@
DART_NOINLINE inline uword TryAllocateCopySlow(intptr_t size);
+ DART_NOINLINE DART_NORETURN void AbortScavenge() {
+ if (FLAG_verbose_gc) {
+ OS::PrintErr("Aborting scavenge\n");
+ }
+ scavenger_->abort_ = true;
+ thread_->long_jump_base()->Jump(1, Object::out_of_memory_error());
+ }
+
inline void ProcessToSpace();
DART_FORCE_INLINE intptr_t ProcessCopied(ObjectPtr raw_obj);
inline void ProcessPromotedList();
@@ -587,9 +622,7 @@
VirtualMemory::AllocateAligned(size, alignment, is_executable, name);
}
if (memory == nullptr) {
- // TODO(koda): We could try to recover (collect old space, wait for another
- // isolate to finish scavenge, etc.).
- OUT_OF_MEMORY();
+ return nullptr; // Out of memory.
}
#if defined(DEBUG)
@@ -639,6 +672,9 @@
return nullptr; // Full.
}
NewPage* page = NewPage::Allocate();
+ if (page == nullptr) {
+ return nullptr; // Out of memory;
+ }
capacity_in_words_ += kNewPageSizeInWords;
if (link) {
if (head_ == nullptr) {
@@ -705,7 +741,8 @@
scavenge_words_per_micro_(kConservativeInitialScavengeSpeed),
idle_scavenge_threshold_in_words_(0),
external_size_(0),
- failed_to_promote_(false) {
+ failed_to_promote_(false),
+ abort_(false) {
// Verify assumptions about the first word in objects which the scavenger is
// going to use for forwarding pointers.
ASSERT(Object::tags_offset() == 0);
@@ -1137,6 +1174,8 @@
template <bool parallel>
void ScavengerVisitorBase<parallel>::ProcessWeakProperties() {
+ if (scavenger_->abort_) return;
+
// Finished this round of scavenging. Process the pending weak properties
// for which the keys have become reachable. Potentially this adds more
// objects to the to space.
@@ -1285,6 +1324,8 @@
template <bool parallel>
void ScavengerVisitorBase<parallel>::MournWeakProperties() {
+ ASSERT(!scavenger_->abort_);
+
// The queued weak properties at this point do not refer to reachable keys,
// so we clear their key and value fields.
WeakPropertyPtr cur_weak = delayed_weak_properties_;
@@ -1447,6 +1488,7 @@
// Prepare for a scavenge.
failed_to_promote_ = false;
+ abort_ = false;
root_slices_started_ = 0;
intptr_t abandoned_bytes = 0; // TODO(rmacnak): Count fragmentation?
SpaceUsage usage_before = GetCurrentUsage();
@@ -1466,6 +1508,11 @@
} else {
bytes_promoted = ParallelScavenge(from);
}
+ if (abort_) {
+ ReverseScavenge(&from);
+ bytes_promoted = 0;
+ }
+ ASSERT(promotion_stack_.IsEmpty());
MournWeakHandles();
MournWeakTables();
@@ -1544,6 +1591,65 @@
return bytes_promoted;
}
+void Scavenger::ReverseScavenge(SemiSpace** from) {
+ Thread* thread = Thread::Current();
+ TIMELINE_FUNCTION_GC_DURATION(thread, "ReverseScavenge");
+
+ class ReverseFromForwardingVisitor : public ObjectVisitor {
+ uword ReadHeader(ObjectPtr raw_obj) {
+ return reinterpret_cast<std::atomic<uword>*>(
+ ObjectLayout::ToAddr(raw_obj))
+ ->load(std::memory_order_relaxed);
+ }
+ void WriteHeader(ObjectPtr raw_obj, uword header) {
+ reinterpret_cast<std::atomic<uword>*>(ObjectLayout::ToAddr(raw_obj))
+ ->store(header, std::memory_order_relaxed);
+ }
+ void VisitObject(ObjectPtr from_obj) {
+ uword from_header = ReadHeader(from_obj);
+ if (IsForwarding(from_header)) {
+ ObjectPtr to_obj = ForwardedObj(from_header);
+ uword to_header = ReadHeader(to_obj);
+ intptr_t size = to_obj->ptr()->HeapSize();
+
+ // Reset the ages bits in case this was a promotion.
+ uint32_t tags = static_cast<uint32_t>(to_header);
+ tags = ObjectLayout::OldBit::update(false, tags);
+ tags = ObjectLayout::OldAndNotRememberedBit::update(false, tags);
+ tags = ObjectLayout::NewBit::update(true, tags);
+ tags = ObjectLayout::OldAndNotMarkedBit::update(false, tags);
+ uword original_header =
+ (to_header & ~static_cast<uword>(0xFFFFFFFF)) | tags;
+
+ WriteHeader(from_obj, original_header);
+
+ ForwardingCorpse::AsForwarder(ObjectLayout::ToAddr(to_obj), size)
+ ->set_target(from_obj);
+ }
+ }
+ };
+
+ ReverseFromForwardingVisitor visitor;
+ for (NewPage* page = (*from)->head(); page != nullptr; page = page->next()) {
+ page->VisitObjects(&visitor);
+ }
+
+ // Swap from-space and to-space. The abandoned to-space will be deleted in
+ // the epilogue.
+ SemiSpace* temp = to_;
+ to_ = *from;
+ *from = temp;
+
+ promotion_stack_.Reset();
+
+ // This also rebuilds the remembered set.
+ Become::FollowForwardingPointers(thread);
+
+ // Don't scavenge again until the next old-space GC has occurred. Prevents
+ // performing one scavenge per allocation as the heap limit is approached.
+ heap_->assume_scavenge_will_fail_ = true;
+}
+
void Scavenger::WriteProtect(bool read_only) {
ASSERT(!scavenging_);
to_->WriteProtect(read_only);
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index f7874e9..9f84dcd 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -394,6 +394,7 @@
SemiSpace* Prologue();
intptr_t ParallelScavenge(SemiSpace* from);
intptr_t SerialScavenge(SemiSpace* from);
+ void ReverseScavenge(SemiSpace** from);
void IterateIsolateRoots(ObjectPointerVisitor* visitor);
template <bool parallel>
void IterateStoreBuffers(ScavengerVisitorBase<parallel>* visitor);
@@ -441,7 +442,8 @@
// The total size of external data associated with objects in this scavenger.
RelaxedAtomic<intptr_t> external_size_;
- bool failed_to_promote_;
+ RelaxedAtomic<bool> failed_to_promote_;
+ RelaxedAtomic<bool> abort_;
bool growth_control_;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 9616065..e06504c 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1125,6 +1125,9 @@
error_str = String::New("Background Compilation Failed", Heap::kOld);
*background_compilation_error_ =
LanguageError::New(error_str, Report::kBailout, Heap::kOld);
+ error_str = String::New("Out of memory", Heap::kOld);
+ *out_of_memory_error_ =
+ LanguageError::New(error_str, Report::kBailout, Heap::kOld);
// Allocate the parameter arrays for method extractor types and names.
*extractor_parameter_types_ = Array::New(1, Heap::kOld);
@@ -1215,6 +1218,8 @@
ASSERT(speculative_inlining_error_->IsLanguageError());
ASSERT(!background_compilation_error_->IsSmi());
ASSERT(background_compilation_error_->IsLanguageError());
+ ASSERT(!out_of_memory_error_->IsSmi());
+ ASSERT(out_of_memory_error_->IsLanguageError());
ASSERT(!vm_isolate_snapshot_object_table_->IsSmi());
ASSERT(vm_isolate_snapshot_object_table_->IsArray());
ASSERT(!extractor_parameter_types_->IsSmi());
@@ -2645,8 +2650,11 @@
Instance::Handle(thread->isolate()->object_store()->out_of_memory());
Exceptions::Throw(thread, exception);
UNREACHABLE();
+ } else if (thread->long_jump_base() != nullptr) {
+ Report::LongJump(Object::out_of_memory_error());
+ UNREACHABLE();
} else {
- // No Dart to propagate an exception to.
+ // Nowhere to propagate an exception to.
OUT_OF_MEMORY();
}
}
@@ -9867,6 +9875,11 @@
signature_type_name.IsNull() ? "null" : signature_type_name.ToCString());
}
+bool Field::ShouldCloneFields() {
+ return Compiler::IsBackgroundCompilation() ||
+ FLAG_force_clone_compiler_objects;
+}
+
FieldPtr Field::CloneFromOriginal() const {
return this->Clone(*this);
}
@@ -18730,24 +18743,23 @@
bool Instance::IsCallable(Function* function) const {
Class& cls = Class::Handle(clazz());
if (cls.IsClosureClass()) {
- if (function != NULL) {
+ if (function != nullptr) {
*function = Closure::Cast(*this).function();
}
return true;
}
// Try to resolve a "call" method.
- Function& call_function = Function::Handle();
- do {
- call_function = cls.LookupDynamicFunction(Symbols::Call());
- if (!call_function.IsNull()) {
- if (function != NULL) {
- *function = call_function.raw();
- }
- return true;
- }
- cls = cls.SuperClass();
- } while (!cls.IsNull());
- return false;
+ Zone* zone = Thread::Current()->zone();
+ Function& call_function = Function::Handle(
+ zone, Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::Call(),
+ /*allow_add=*/false));
+ if (call_function.IsNull()) {
+ return false;
+ }
+ if (function != nullptr) {
+ *function = call_function.raw();
+ }
+ return true;
}
InstancePtr Instance::New(const Class& cls, Heap::Space space) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index cd5126d..ed97d50 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -449,6 +449,7 @@
V(LanguageError, branch_offset_error) \
V(LanguageError, speculative_inlining_error) \
V(LanguageError, background_compilation_error) \
+ V(LanguageError, out_of_memory_error) \
V(Array, vm_isolate_snapshot_object_table) \
V(Type, dynamic_type) \
V(Type, void_type) \
@@ -3956,6 +3957,10 @@
return !raw_ptr()->owner_->IsField();
}
+ // Returns whether fields must be cloned via [CloneFromOriginal] for the
+ // current compilation thread.
+ static bool ShouldCloneFields();
+
// Returns a field cloned from 'this'. 'this' is set as the
// original field of result.
FieldPtr CloneFromOriginal() const;
@@ -6804,7 +6809,10 @@
static const intptr_t kAwaitJumpVarIndex = 0;
static const intptr_t kAsyncCompleterIndex = 1;
static const intptr_t kControllerIndex = 1;
- static const intptr_t kChainedFutureIndex = 2;
+ // Expected context index of chained futures in recognized async functions.
+ // These are used to unwind async stacks.
+ static const intptr_t kFutureTimeoutFutureIndex = 2;
+ static const intptr_t kFutureWaitFutureIndex = 2;
static intptr_t variable_offset(intptr_t context_index) {
return OFFSET_OF_RETURNED_VALUE(ContextLayout, data) +
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 3231fda..319cff6 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -247,16 +247,30 @@
}
if (id != -1) {
ASSERT(selector != NULL);
- jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "", cls.id(), selector,
- id);
+ if (cls.IsTopLevel()) {
+ const auto& library = Library::Handle(cls.library());
+ const auto& private_key = String::Handle(library.private_key());
+ jsobj.AddFixedServiceId("libraries/%s/%s/%" Pd "",
+ private_key.ToCString(), selector, id);
+ } else {
+ jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "", cls.id(), selector,
+ id);
+ }
return;
}
// Regular functions known to their owner use their name (percent-encoded).
String& name = String::Handle(f.name());
if (cls.LookupFunction(name) == f.raw()) {
const char* encoded_name = String::EncodeIRI(name);
- jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s", cls.id(),
- encoded_name);
+ if (cls.IsTopLevel()) {
+ const auto& library = Library::Handle(cls.library());
+ const auto& private_key = String::Handle(library.private_key());
+ jsobj.AddFixedServiceId("libraries/%s/functions/%s",
+ private_key.ToCString(), encoded_name);
+ } else {
+ jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s", cls.id(),
+ encoded_name);
+ }
return;
}
// Oddball functions (not known to their owner) fall back to use the object
@@ -356,8 +370,15 @@
String& field_name = String::Handle(name());
const char* encoded_field_name = String::EncodeIRI(field_name);
AddCommonObjectProperties(&jsobj, "Field", ref);
- jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", cls.id(),
- encoded_field_name);
+ if (cls.IsTopLevel()) {
+ const auto& library = Library::Handle(cls.library());
+ const auto& private_key = String::Handle(library.private_key());
+ jsobj.AddFixedServiceId("libraries/%s/fields/%s", private_key.ToCString(),
+ encoded_field_name);
+ } else {
+ jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", cls.id(),
+ encoded_field_name);
+ }
const char* user_name = UserVisibleNameCString();
const String& vm_name = String::Handle(name());
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index c8a92c5..4b7e6ad 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -562,17 +562,10 @@
ArgumentsDescriptor args_desc(descriptor);
ASSERT(!receiver.IsClosure()); // Interpreter tests for closure.
Class& cls = Class::Handle(zone, receiver.clazz());
- Function& call_function = Function::Handle(zone);
- do {
- call_function = cls.LookupDynamicFunction(Symbols::Call());
- if (!call_function.IsNull()) {
- if (!call_function.AreValidArguments(args_desc, NULL)) {
- call_function = Function::null();
- }
- break;
- }
- cls = cls.SuperClass();
- } while (!cls.IsNull());
+ Function& call_function = Function::Handle(
+ zone,
+ Resolver::ResolveDynamicForReceiverClass(cls, Symbols::Call(), args_desc,
+ /*allow_add=*/false));
arguments.SetReturn(call_function);
}
@@ -1491,8 +1484,8 @@
cls = table->At(cid);
if (cls.is_abstract()) continue;
if (!cls.is_allocated()) continue;
- other_target =
- Resolver::ResolveDynamicAnyArgs(zone, cls, name, false /* allow_add */);
+ other_target = Resolver::ResolveDynamicAnyArgs(zone, cls, name,
+ /*allow_add=*/false);
if (other_target.raw() != target.raw()) {
return false;
}
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index cff9a82..e8e2ba6 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -249,7 +249,8 @@
if (chained_future != nullptr) {
AllocateContextVariable(chained_future, &context_owner);
*found_captured_variables = true;
- ASSERT(chained_future->index().value() == Context::kChainedFutureIndex);
+ ASSERT(chained_future->index().value() ==
+ chained_future->expected_context_index());
}
while (pos < num_parameters) {
@@ -279,7 +280,7 @@
LocalVariable* variable = VariableAt(pos);
if (variable->owner() == this) {
if (variable->is_captured()) {
- // Skip the two variables already pre-allocated above.
+ // Skip the variables already pre-allocated above.
if (variable != await_jump_var && variable != async_completer &&
variable != controller && variable != chained_future) {
AllocateContextVariable(variable, &context_owner);
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index f31a3a0..a9761d7 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -94,6 +94,7 @@
is_explicit_covariant_parameter_(false),
is_late_(false),
is_chained_future_(false),
+ expected_context_index_(-1),
late_init_offset_(0),
type_check_mode_(kDoTypeCheck),
index_() {
@@ -135,6 +136,11 @@
bool is_chained_future() const { return is_chained_future_; }
void set_is_chained_future() { is_chained_future_ = true; }
+ intptr_t expected_context_index() const { return expected_context_index_; }
+ void set_expected_context_index(int index) {
+ expected_context_index_ = index;
+ }
+
intptr_t late_init_offset() const { return late_init_offset_; }
void set_late_init_offset(intptr_t late_init_offset) {
late_init_offset_ = late_init_offset;
@@ -225,6 +231,7 @@
bool is_explicit_covariant_parameter_;
bool is_late_;
bool is_chained_future_;
+ intptr_t expected_context_index_;
intptr_t late_init_offset_;
TypeCheckMode type_check_mode_;
VariableIndex index_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 9d6b227..3b7af8f 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -1697,6 +1697,84 @@
return ring->GetObjectForId(id, kind);
}
+static ObjectPtr LookupClassMembers(Thread* thread,
+ const Class& klass,
+ char** parts,
+ int num_parts) {
+ auto isolate = thread->isolate();
+ auto zone = thread->zone();
+
+ if (num_parts != 4) {
+ return Object::sentinel().raw();
+ }
+
+ const char* encoded_id = parts[3];
+ auto& id = String::Handle(String::New(encoded_id));
+ id = String::DecodeIRI(id);
+ if (id.IsNull()) {
+ return Object::sentinel().raw();
+ }
+
+ if (strcmp(parts[2], "fields") == 0) {
+ // Field ids look like: "classes/17/fields/name"
+ const auto& field = Field::Handle(klass.LookupField(id));
+ if (field.IsNull()) {
+ return Object::sentinel().raw();
+ }
+ return field.raw();
+ }
+ if (strcmp(parts[2], "functions") == 0) {
+ // Function ids look like: "classes/17/functions/name"
+ const auto& function = Function::Handle(klass.LookupFunction(id));
+ if (function.IsNull()) {
+ return Object::sentinel().raw();
+ }
+ return function.raw();
+ }
+ if (strcmp(parts[2], "implicit_closures") == 0) {
+ // Function ids look like: "classes/17/implicit_closures/11"
+ intptr_t id;
+ if (!GetIntegerId(parts[3], &id)) {
+ return Object::sentinel().raw();
+ }
+ const auto& func =
+ Function::Handle(zone, klass.ImplicitClosureFunctionFromIndex(id));
+ if (func.IsNull()) {
+ return Object::sentinel().raw();
+ }
+ return func.raw();
+ }
+ if (strcmp(parts[2], "dispatchers") == 0) {
+ // Dispatcher Function ids look like: "classes/17/dispatchers/11"
+ intptr_t id;
+ if (!GetIntegerId(parts[3], &id)) {
+ return Object::sentinel().raw();
+ }
+ const auto& func =
+ Function::Handle(zone, klass.InvocationDispatcherFunctionFromIndex(id));
+ if (func.IsNull()) {
+ return Object::sentinel().raw();
+ }
+ return func.raw();
+ }
+ if (strcmp(parts[2], "closures") == 0) {
+ // Closure ids look like: "classes/17/closures/11"
+ intptr_t id;
+ if (!GetIntegerId(parts[3], &id)) {
+ return Object::sentinel().raw();
+ }
+ Function& func = Function::Handle(zone);
+ func = isolate->ClosureFunctionFromIndex(id);
+ if (func.IsNull()) {
+ return Object::sentinel().raw();
+ }
+ return func.raw();
+ }
+
+ UNREACHABLE();
+ return Object::sentinel().raw();
+}
+
static ObjectPtr LookupHeapObjectLibraries(Isolate* isolate,
char** parts,
int num_parts) {
@@ -1724,9 +1802,30 @@
if (!lib_found) {
return Object::sentinel().raw();
}
+
+ const auto& klass = Class::Handle(lib.toplevel_class());
+ ASSERT(!klass.IsNull());
+
if (num_parts == 2) {
return lib.raw();
}
+ if (strcmp(parts[2], "fields") == 0) {
+ // Library field ids look like: "libraries/17/fields/name"
+ return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+ }
+ if (strcmp(parts[2], "functions") == 0) {
+ // Library function ids look like: "libraries/17/functions/name"
+ return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+ }
+ if (strcmp(parts[2], "closures") == 0) {
+ // Library function ids look like: "libraries/17/closures/name"
+ return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+ }
+ if (strcmp(parts[2], "implicit_closures") == 0) {
+ // Library function ids look like: "libraries/17/implicit_closures/name"
+ return LookupClassMembers(Thread::Current(), klass, parts, num_parts);
+ }
+
if (strcmp(parts[2], "scripts") == 0) {
// Script ids look like "libraries/35/scripts/library%2Furl.dart/12345"
if (num_parts != 5) {
@@ -1783,86 +1882,19 @@
}
if (strcmp(parts[2], "closures") == 0) {
// Closure ids look like: "classes/17/closures/11"
- if (num_parts != 4) {
- return Object::sentinel().raw();
- }
- intptr_t id;
- if (!GetIntegerId(parts[3], &id)) {
- return Object::sentinel().raw();
- }
- Function& func = Function::Handle(zone);
- func = isolate->ClosureFunctionFromIndex(id);
- if (func.IsNull()) {
- return Object::sentinel().raw();
- }
- return func.raw();
-
+ return LookupClassMembers(thread, cls, parts, num_parts);
} else if (strcmp(parts[2], "fields") == 0) {
// Field ids look like: "classes/17/fields/name"
- if (num_parts != 4) {
- return Object::sentinel().raw();
- }
- const char* encoded_id = parts[3];
- String& id = String::Handle(zone, String::New(encoded_id));
- id = String::DecodeIRI(id);
- if (id.IsNull()) {
- return Object::sentinel().raw();
- }
- Field& field = Field::Handle(zone, cls.LookupField(id));
- if (field.IsNull()) {
- return Object::sentinel().raw();
- }
- return field.raw();
-
+ return LookupClassMembers(thread, cls, parts, num_parts);
} else if (strcmp(parts[2], "functions") == 0) {
// Function ids look like: "classes/17/functions/name"
- if (num_parts != 4) {
- return Object::sentinel().raw();
- }
- const char* encoded_id = parts[3];
- String& id = String::Handle(zone, String::New(encoded_id));
- id = String::DecodeIRI(id);
- if (id.IsNull()) {
- return Object::sentinel().raw();
- }
- Function& func = Function::Handle(zone, cls.LookupFunction(id));
- if (func.IsNull()) {
- return Object::sentinel().raw();
- }
- return func.raw();
-
+ return LookupClassMembers(thread, cls, parts, num_parts);
} else if (strcmp(parts[2], "implicit_closures") == 0) {
// Function ids look like: "classes/17/implicit_closures/11"
- if (num_parts != 4) {
- return Object::sentinel().raw();
- }
- intptr_t id;
- if (!GetIntegerId(parts[3], &id)) {
- return Object::sentinel().raw();
- }
- Function& func = Function::Handle(zone);
- func = cls.ImplicitClosureFunctionFromIndex(id);
- if (func.IsNull()) {
- return Object::sentinel().raw();
- }
- return func.raw();
-
+ return LookupClassMembers(thread, cls, parts, num_parts);
} else if (strcmp(parts[2], "dispatchers") == 0) {
// Dispatcher Function ids look like: "classes/17/dispatchers/11"
- if (num_parts != 4) {
- return Object::sentinel().raw();
- }
- intptr_t id;
- if (!GetIntegerId(parts[3], &id)) {
- return Object::sentinel().raw();
- }
- Function& func = Function::Handle(zone);
- func = cls.InvocationDispatcherFunctionFromIndex(id);
- if (func.IsNull()) {
- return Object::sentinel().raw();
- }
- return func.raw();
-
+ return LookupClassMembers(thread, cls, parts, num_parts);
} else if (strcmp(parts[2], "types") == 0) {
// Type ids look like: "classes/17/types/11"
if (num_parts != 4) {
@@ -2707,7 +2739,8 @@
cls = instance.clazz();
isStatic = false;
}
- if (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid) {
+ if (!cls.IsTopLevel() &&
+ (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid)) {
js->PrintError(
kInvalidParams,
"Expressions can be evaluated only with regular Dart instances");
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 5668365..ed50a53 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -1703,7 +1703,7 @@
static const char* kScriptChars =
"import 'dart:typed_data';\n"
"getTypedDataList() {\n"
- " var list = List<dynamic>.filled(10, null);\n"
+ " var list = List<dynamic>.filled(13, null);\n"
" var index = 0;\n"
" list[index++] = Int8List(256);\n"
" list[index++] = Uint8List(256);\n"
@@ -1715,10 +1715,13 @@
" list[index++] = Uint64List(256);\n"
" list[index++] = Float32List(256);\n"
" list[index++] = Float64List(256);\n"
+ " list[index++] = Int32x4List(256);\n"
+ " list[index++] = Float32x4List(256);\n"
+ " list[index++] = Float64x2List(256);\n"
" return list;\n"
"}\n"
"getTypedDataViewList() {\n"
- " var list = List<dynamic>.filled(30, null);\n"
+ " var list = List<dynamic>.filled(45, null);\n"
" var index = 0;\n"
" list[index++] = Int8List.view(Int8List(256).buffer);\n"
" list[index++] = Uint8List.view(Uint8List(256).buffer);\n"
@@ -1730,6 +1733,9 @@
" list[index++] = Uint64List.view(new Uint64List(256).buffer);\n"
" list[index++] = Float32List.view(new Float32List(256).buffer);\n"
" list[index++] = Float64List.view(new Float64List(256).buffer);\n"
+ " list[index++] = Int32x4List.view(new Int32x4List(256).buffer);\n"
+ " list[index++] = Float32x4List.view(new Float32x4List(256).buffer);\n"
+ " list[index++] = Float64x2List.view(new Float64x2List(256).buffer);\n"
" list[index++] = Int8List.view(new Int16List(256).buffer);\n"
" list[index++] = Uint8List.view(new Uint16List(256).buffer);\n"
@@ -1741,6 +1747,12 @@
" list[index++] = Uint8List.view(new Float32List(256).buffer);\n"
" list[index++] = Int8List.view(new Float64List(256).buffer);\n"
" list[index++] = Uint8List.view(new Float64List(256).buffer);\n"
+ " list[index++] = Int8List.view(new Int32x4List(256).buffer);\n"
+ " list[index++] = Uint8List.view(new Int32x4List(256).buffer);\n"
+ " list[index++] = Int8List.view(new Float32x4List(256).buffer);\n"
+ " list[index++] = Uint8List.view(new Float32x4List(256).buffer);\n"
+ " list[index++] = Int8List.view(new Float64x2List(256).buffer);\n"
+ " list[index++] = Uint8List.view(new Float64x2List(256).buffer);\n"
" list[index++] = Int16List.view(new Int8List(256).buffer);\n"
" list[index++] = Uint16List.view(new Uint8List(256).buffer);\n"
@@ -1752,10 +1764,16 @@
" list[index++] = Uint16List.view(new Float32List(256).buffer);\n"
" list[index++] = Int16List.view(new Float64List(256).buffer);\n"
" list[index++] = Uint16List.view(new Float64List(256).buffer);\n"
+ " list[index++] = Int16List.view(new Int32x4List(256).buffer);\n"
+ " list[index++] = Uint16List.view(new Int32x4List(256).buffer);\n"
+ " list[index++] = Int16List.view(new Float32x4List(256).buffer);\n"
+ " list[index++] = Uint16List.view(new Float32x4List(256).buffer);\n"
+ " list[index++] = Int16List.view(new Float64x2List(256).buffer);\n"
+ " list[index++] = Uint16List.view(new Float64x2List(256).buffer);\n"
" return list;\n"
"}\n"
"getMultipleTypedDataViewList() {\n"
- " var list = List<dynamic>.filled(10, null);\n"
+ " var list = List<dynamic>.filled(13, null);\n"
" var index = 0;\n"
" var data = Uint8List(256).buffer;\n"
" list[index++] = Int8List.view(data);\n"
@@ -1768,6 +1786,9 @@
" list[index++] = Uint64List.view(data);\n"
" list[index++] = Float32List.view(data);\n"
" list[index++] = Float64List.view(data);\n"
+ " list[index++] = Int32x4List.view(data);\n"
+ " list[index++] = Float32x4List.view(data);\n"
+ " list[index++] = Float64x2List.view(data);\n"
" return list;\n"
"}\n";
@@ -1795,12 +1816,13 @@
Dart_TypedData_Type type;
int size;
} expected[] = {
- {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
- {Dart_TypedData_kInt16, 512}, {Dart_TypedData_kUint16, 512},
- {Dart_TypedData_kInt32, 1024}, {Dart_TypedData_kUint32, 1024},
- {Dart_TypedData_kInt64, 2048}, {Dart_TypedData_kUint64, 2048},
- {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
- {Dart_TypedData_kInvalid, -1}};
+ {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
+ {Dart_TypedData_kInt16, 512}, {Dart_TypedData_kUint16, 512},
+ {Dart_TypedData_kInt32, 1024}, {Dart_TypedData_kUint32, 1024},
+ {Dart_TypedData_kInt64, 2048}, {Dart_TypedData_kUint64, 2048},
+ {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
+ {Dart_TypedData_kInt32x4, 4096}, {Dart_TypedData_kFloat32x4, 4096},
+ {Dart_TypedData_kFloat64x2, 4096}, {Dart_TypedData_kInvalid, -1}};
int i = 0;
while (expected[i].type != Dart_TypedData_kInvalid) {
@@ -1822,23 +1844,31 @@
Dart_TypedData_Type type;
int size;
} expected[] = {
- {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
- {Dart_TypedData_kInt16, 512}, {Dart_TypedData_kUint16, 512},
- {Dart_TypedData_kInt32, 1024}, {Dart_TypedData_kUint32, 1024},
- {Dart_TypedData_kInt64, 2048}, {Dart_TypedData_kUint64, 2048},
- {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
+ {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
+ {Dart_TypedData_kInt16, 512}, {Dart_TypedData_kUint16, 512},
+ {Dart_TypedData_kInt32, 1024}, {Dart_TypedData_kUint32, 1024},
+ {Dart_TypedData_kInt64, 2048}, {Dart_TypedData_kUint64, 2048},
+ {Dart_TypedData_kFloat32, 1024}, {Dart_TypedData_kFloat64, 2048},
+ {Dart_TypedData_kInt32x4, 4096}, {Dart_TypedData_kFloat32x4, 4096},
+ {Dart_TypedData_kFloat64x2, 4096},
- {Dart_TypedData_kInt8, 512}, {Dart_TypedData_kUint8, 512},
- {Dart_TypedData_kInt8, 1024}, {Dart_TypedData_kUint8, 1024},
- {Dart_TypedData_kInt8, 2048}, {Dart_TypedData_kUint8, 2048},
- {Dart_TypedData_kInt8, 1024}, {Dart_TypedData_kUint8, 1024},
- {Dart_TypedData_kInt8, 2048}, {Dart_TypedData_kUint8, 2048},
+ {Dart_TypedData_kInt8, 512}, {Dart_TypedData_kUint8, 512},
+ {Dart_TypedData_kInt8, 1024}, {Dart_TypedData_kUint8, 1024},
+ {Dart_TypedData_kInt8, 2048}, {Dart_TypedData_kUint8, 2048},
+ {Dart_TypedData_kInt8, 1024}, {Dart_TypedData_kUint8, 1024},
+ {Dart_TypedData_kInt8, 2048}, {Dart_TypedData_kUint8, 2048},
+ {Dart_TypedData_kInt8, 4096}, {Dart_TypedData_kUint8, 4096},
+ {Dart_TypedData_kInt8, 4096}, {Dart_TypedData_kUint8, 4096},
+ {Dart_TypedData_kInt8, 4096}, {Dart_TypedData_kUint8, 4096},
- {Dart_TypedData_kInt16, 256}, {Dart_TypedData_kUint16, 256},
- {Dart_TypedData_kInt16, 1024}, {Dart_TypedData_kUint16, 1024},
- {Dart_TypedData_kInt16, 2048}, {Dart_TypedData_kUint16, 2048},
- {Dart_TypedData_kInt16, 1024}, {Dart_TypedData_kUint16, 1024},
- {Dart_TypedData_kInt16, 2048}, {Dart_TypedData_kUint16, 2048},
+ {Dart_TypedData_kInt16, 256}, {Dart_TypedData_kUint16, 256},
+ {Dart_TypedData_kInt16, 1024}, {Dart_TypedData_kUint16, 1024},
+ {Dart_TypedData_kInt16, 2048}, {Dart_TypedData_kUint16, 2048},
+ {Dart_TypedData_kInt16, 1024}, {Dart_TypedData_kUint16, 1024},
+ {Dart_TypedData_kInt16, 2048}, {Dart_TypedData_kUint16, 2048},
+ {Dart_TypedData_kInt16, 4096}, {Dart_TypedData_kUint16, 4096},
+ {Dart_TypedData_kInt16, 4096}, {Dart_TypedData_kUint16, 4096},
+ {Dart_TypedData_kInt16, 4096}, {Dart_TypedData_kUint16, 4096},
{Dart_TypedData_kInvalid, -1}};
@@ -1862,12 +1892,13 @@
Dart_TypedData_Type type;
int size;
} expected[] = {
- {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
- {Dart_TypedData_kInt16, 256}, {Dart_TypedData_kUint16, 256},
- {Dart_TypedData_kInt32, 256}, {Dart_TypedData_kUint32, 256},
- {Dart_TypedData_kInt64, 256}, {Dart_TypedData_kUint64, 256},
- {Dart_TypedData_kFloat32, 256}, {Dart_TypedData_kFloat64, 256},
- {Dart_TypedData_kInvalid, -1}};
+ {Dart_TypedData_kInt8, 256}, {Dart_TypedData_kUint8, 256},
+ {Dart_TypedData_kInt16, 256}, {Dart_TypedData_kUint16, 256},
+ {Dart_TypedData_kInt32, 256}, {Dart_TypedData_kUint32, 256},
+ {Dart_TypedData_kInt64, 256}, {Dart_TypedData_kUint64, 256},
+ {Dart_TypedData_kFloat32, 256}, {Dart_TypedData_kFloat64, 256},
+ {Dart_TypedData_kInt32x4, 256}, {Dart_TypedData_kFloat32x4, 256},
+ {Dart_TypedData_kFloat64x2, 256}, {Dart_TypedData_kInvalid, -1}};
int i = 0;
while (expected[i].type != Dart_TypedData_kInvalid) {
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index c2b7828..468edfc 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -131,8 +131,7 @@
var_data_field(Field::Handle(zone)),
state_field(Field::Handle(zone)),
on_data_field(Field::Handle(zone)),
- state_data_field(Field::Handle(zone)),
- future_timeout_method_(Function::Handle(zone)) {
+ state_data_field(Field::Handle(zone)) {
const auto& async_lib = Library::Handle(zone, Library::AsyncLibrary());
// Look up classes:
// - async:
@@ -197,11 +196,6 @@
state_data_field =
stream_iterator_class.LookupFieldAllowPrivate(Symbols::_stateData());
ASSERT(!state_data_field.IsNull());
-
- // Functions:
- future_timeout_method_ =
- future_impl_class.LookupFunction(Symbols::timeout());
- ASSERT(!future_timeout_method_.IsNull());
}
ClosurePtr GetCallerInFutureImpl(const Object& future_) {
@@ -296,7 +290,14 @@
parent_function_ = receiver_function_.parent_function();
if (parent_function_.recognized_kind() ==
MethodRecognizer::kFutureTimeout) {
- context_entry_ = receiver_context_.At(Context::kChainedFutureIndex);
+ context_entry_ =
+ receiver_context_.At(Context::kFutureTimeoutFutureIndex);
+ return GetCallerInFutureImpl(context_entry_);
+ } else if (parent_function_.recognized_kind() ==
+ MethodRecognizer::kFutureWait) {
+ receiver_context_ = receiver_context_.parent();
+ ASSERT(!receiver_context_.IsNull());
+ context_entry_ = receiver_context_.At(Context::kFutureWaitFutureIndex);
return GetCallerInFutureImpl(context_entry_);
}
}
@@ -363,8 +364,6 @@
Field& state_field;
Field& on_data_field;
Field& state_data_field;
-
- Function& future_timeout_method_;
};
void StackTraceUtils::CollectFramesLazy(
diff --git a/sdk/lib/_http/embedder_config.dart b/sdk/lib/_http/embedder_config.dart
index 730bc2dd..8a12201 100644
--- a/sdk/lib/_http/embedder_config.dart
+++ b/sdk/lib/_http/embedder_config.dart
@@ -7,5 +7,9 @@
/// Embedder-specific `dart:_http` configuration.
/// [HttpClient] will disallow HTTP URLs if this value is set to `false`.
+///
+/// TODO(https://github.com/dart-lang/sdk/issues/41796): This setting will be
+/// removed in favor of explicit domain settings.
+@deprecated
@pragma("vm:entry-point")
bool _embedderAllowsHttp = true;
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 4f51724..bc43046 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -2271,32 +2271,6 @@
});
}
- /// Whether HTTP requests are currently allowed.
- ///
- /// If the [Zone] variable `#dart.library.io.allow_http` is set to a boolean,
- /// it determines whether the HTTP protocol is allowed. If the zone variable
- /// is set to any other non-null value, HTTP is not allowed.
- /// Otherwise, if the `dart.library.io.allow_http` environment flag
- /// is set to `false`, HTTP is not allowed.
- /// Otherwise, [_embedderAllowsHttp] determines the result.
- bool get _isHttpAllowed {
- final zoneOverride = Zone.current[#dart.library.io.allow_http];
- if (zoneOverride != null) return true == zoneOverride;
- bool envOverride =
- bool.fromEnvironment("dart.library.io.allow_http", defaultValue: true);
- return envOverride && _embedderAllowsHttp;
- }
-
- bool _isLoopback(String host) {
- if (host.isEmpty) return false;
- if ("localhost" == host) return true;
- try {
- return InternetAddress(host).isLoopback;
- } on ArgumentError {
- return false;
- }
- }
-
Future<_HttpClientRequest> _openUrl(String method, Uri uri) {
if (_closing) {
throw new StateError("Client is closed");
@@ -2318,11 +2292,6 @@
}
bool isSecure = uri.isScheme("https");
- if (!_isHttpAllowed && !isSecure && !_isLoopback(uri.host)) {
- throw new StateError(
- "Insecure HTTP is not allowed by the current platform: $uri");
- }
-
int port = uri.port;
if (port == 0) {
port =
diff --git a/sdk/lib/_internal/allowed_experiments.json b/sdk/lib/_internal/allowed_experiments.json
index bd6900f..bbe8144 100644
--- a/sdk/lib/_internal/allowed_experiments.json
+++ b/sdk/lib/_internal/allowed_experiments.json
@@ -34,6 +34,15 @@
"collection": {
"experimentSet": "nullSafety"
},
+ "convert": {
+ "experimentSet": "nullSafety"
+ },
+ "crypto": {
+ "experimentSet": "nullSafety"
+ },
+ "csslib": {
+ "experimentSet": "nullSafety"
+ },
"dart_internal": {
"experimentSet": "nullSafety"
},
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 6449304..bb6ed77 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -258,8 +258,9 @@
* Use [Completer] to create a future and complete it later.
*/
@pragma("vm:entry-point")
+ @pragma("vm:prefer-inline")
factory Future.value([FutureOr<T>? value]) {
- return new _Future<T>.immediate(value == null ? value as dynamic : value);
+ return new _Future<T>.immediate(value == null ? value as T : value);
}
/**
@@ -360,9 +361,12 @@
* The call to [cleanUp] should not throw. If it does, the error will be an
* uncaught asynchronous error.
*/
+ @pragma("vm:entry-point")
static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
{bool eagerError = false, void cleanUp(T successValue)?}) {
- final _Future<List<T>> result = new _Future<List<T>>();
+ // This is a VM recognised method, and the _future variable is deliberately
+ // allocated in a specific slot in the closure context for stack unwinding.
+ final _Future<List<T>> _future = _Future<List<T>>();
List<T?>? values; // Collects the values. Set to null on error.
int remaining = 0; // How many futures are we waiting for.
late Object error; // The first error from a future.
@@ -386,13 +390,13 @@
}
values = null;
if (remaining == 0 || eagerError) {
- result._completeError(theError, theStackTrace);
+ _future._completeError(theError, theStackTrace);
} else {
error = theError;
stackTrace = theStackTrace;
}
} else if (remaining == 0 && !eagerError) {
- result._completeError(error, stackTrace);
+ _future._completeError(error, stackTrace);
}
}
@@ -407,7 +411,7 @@
if (valueList != null) {
valueList[pos] = value;
if (remaining == 0) {
- result._completeWithValue(List<T>.from(valueList));
+ _future._completeWithValue(List<T>.from(valueList));
}
} else {
if (cleanUp != null && value != null) {
@@ -419,7 +423,7 @@
if (remaining == 0 && !eagerError) {
// If eagerError is false, and valueList is null, then
// error and stackTrace have been set in handleError above.
- result._completeError(error, stackTrace);
+ _future._completeError(error, stackTrace);
}
}
}, onError: handleError);
@@ -439,7 +443,7 @@
// gracefully.
if (remaining == 0 || eagerError) {
// Throw a new Future.error.
- // Don't just call `result._completeError` since that would propagate
+ // Don't just call `_future._completeError` since that would propagate
// the error too eagerly, not giving the callers time to install
// error handlers.
// Also, don't use `_asyncCompleteError` since that one doesn't give
@@ -453,7 +457,7 @@
stackTrace = st;
}
}
- return result;
+ return _future;
}
/**
diff --git a/sdk/lib/convert/encoding.dart b/sdk/lib/convert/encoding.dart
index b9238a8..5974366 100644
--- a/sdk/lib/convert/encoding.dart
+++ b/sdk/lib/convert/encoding.dart
@@ -65,12 +65,12 @@
"utf-8": utf8
};
- /// Gets an [Encoding] object from the name of the character set
- /// name. The names used are the IANA official names for the
- /// character set (see
- /// http://www.iana.org/assignments/character-sets/character-sets.xml).
+ /// Returns an [Encoding] for a named character set.
///
- /// The [name] passed is case insensitive.
+ /// The names used are the IANA official names for the character set (see
+ /// [IANA character sets][]). The names are case insensitive.
+ ///
+ /// [IANA character sets]: http://www.iana.org/assignments/character-sets/character-sets.xml
///
/// If character set is not supported `null` is returned.
static Encoding? getByName(String? name) {
diff --git a/sdk/lib/io/embedder_config.dart b/sdk/lib/io/embedder_config.dart
index cbc94f7..2042aa5 100644
--- a/sdk/lib/io/embedder_config.dart
+++ b/sdk/lib/io/embedder_config.dart
@@ -32,6 +32,18 @@
@pragma('vm:entry-point')
static bool _maySleep = true;
+ /// The Isolate may establish insecure socket connections to all domains.
+ ///
+ /// This setting can be overridden by per-domain policies.
+ @pragma('vm:entry-point')
+ static bool _mayInsecurelyConnectToAllDomains = true;
+
+ /// Domain network policies set by embedder.
+ @pragma('vm:entry-point')
+ static void _setDomainPolicies(String domainNetworkPolicyJson) {
+ _domainPolicies = _constructDomainPolicies(domainNetworkPolicyJson);
+ }
+
// TODO(zra): Consider adding:
// - an option to disallow modifying SecurityContext.defaultContext
// - an option to disallow closing stdout and stderr.
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index c667cfe..7ffa6e3 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -215,6 +215,7 @@
part 'io_service.dart';
part 'link.dart';
part 'namespace_impl.dart';
+part 'network_policy.dart';
part 'network_profiling.dart';
part 'overrides.dart';
part 'platform.dart';
diff --git a/sdk/lib/io/network_policy.dart b/sdk/lib/io/network_policy.dart
new file mode 100644
index 0000000..9fa586b
--- /dev/null
+++ b/sdk/lib/io/network_policy.dart
@@ -0,0 +1,192 @@
+// 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.
+
+part of dart.io;
+
+/// Whether insecure connections to [host] are allowed.
+///
+/// [host] must be a [String] or [InternetAddress].
+///
+/// If any of the domain policies match [host], the matching policy will make
+/// the decision. If multiple policies apply, the top matching policy makes the
+/// decision. If none of the domain policies match, the embedder default is
+/// used.
+///
+/// Loopback addresses are always allowed.
+bool isInsecureConnectionAllowed(dynamic host) {
+ String hostString;
+ if (host is String) {
+ try {
+ if ("localhost" == host || InternetAddress(host).isLoopback) return true;
+ } on ArgumentError {
+ // Assume not loopback.
+ }
+ hostString = host;
+ } else if (host is InternetAddress) {
+ if (host.isLoopback) return true;
+ hostString = host.host;
+ } else {
+ throw ArgumentError.value(
+ host, "host", "Must be a String or InternetAddress");
+ }
+ final topMatchedPolicy = _findBestDomainNetworkPolicy(hostString);
+ final envOverride = bool.fromEnvironment(
+ "dart.library.io.may_insecurely_connect_to_all_domains",
+ defaultValue: true);
+ return topMatchedPolicy?.allowInsecureConnections ??
+ (envOverride && _EmbedderConfig._mayInsecurelyConnectToAllDomains);
+}
+
+/// Policy for a specific domain.
+///
+/// [_DomainNetworkPolicy] can be used to create exceptions to the global
+/// network policy.
+class _DomainNetworkPolicy {
+ /// https://tools.ietf.org/html/rfc1034#:~:text=Name%20space%20specifications
+ ///
+ /// We specifically do not allow IP addresses.
+ static final _domainMatcher = RegExp(
+ r"^(?:[a-z\d-]{1,63}\.)+[a-z][a-z\d-]{0,62}$",
+ caseSensitive: false);
+
+ /// The domain on which the policy is being set.
+ ///
+ /// This cannot be a numeric IP address.
+ ///
+ /// For example: `example.com`.
+ final String domain;
+
+ /// Whether to allow insecure socket connections for this domain.
+ final bool allowInsecureConnections;
+
+ /// Whether this domain policy covers sub-domains as well.
+ ///
+ /// If this is true, all subdomains inherit the same policy. For instance,
+ /// a policy set on `example.com` would apply to `*.example.com` such as
+ /// `subdomain.example.com` or `www.example.com`.
+ final bool includesSubDomains;
+
+ /// Creates a new domain exception in the network policy.
+ ///
+ /// [domain] is the domain on which the policy is being set.
+ ///
+ /// [includesSubDomains] determines whether the policy applies to
+ /// all sub domains. If this is set to true, all subdomains inherit the
+ /// same policy. For instance, a policy set on `example.com` would apply to
+ /// `*.example.com` such as `subdomain.example.com` or `www.example.com`.
+ ///
+ /// [allowInsecureConnections] determines whether to allow insecure socket
+ /// connections for this [domain].
+ _DomainNetworkPolicy(this.domain,
+ {this.includesSubDomains = false,
+ this.allowInsecureConnections = false}) {
+ if (domain.length > 255 || !_domainMatcher.hasMatch(domain)) {
+ throw ArgumentError.value(domain, "domain", "Invalid domain name");
+ }
+ }
+
+ /// Calculates how well the policy matches to a given host string.
+ ///
+ /// A host matches a [policy] if it ends with its [domain].
+ ///
+ /// A score is given to such a match depending on the specificity of the
+ /// [domain]:
+ ///
+ /// * A longer domain receives a higher score.
+ /// * A domain that does not allow sub domains receives a higher score.
+ ///
+ /// Returns -1 if the policy does not match.
+ int matchScore(String host) {
+ final domainLength = domain.length;
+ final hostLength = host.length;
+ final lengthDelta = hostLength - domainLength;
+ if (host.endsWith(domain) &&
+ (lengthDelta == 0 ||
+ includesSubDomains && host.codeUnitAt(lengthDelta - 1) == 0x2e)) {
+ return domainLength * 2 + (includesSubDomains ? 0 : 1);
+ }
+ return -1;
+ }
+
+ /// Checks whether the [policy] to be added conflicts with existing policies.
+ ///
+ /// Returns [true] if policy is safe to add to existing policy set and [false]
+ /// if policy can safely be ignored.
+ ///
+ /// Throws [ArgumentError] if a conflict is detected.
+ bool checkConflict(List<_DomainNetworkPolicy> existingPolicies) {
+ for (final existingPolicy in existingPolicies) {
+ if (includesSubDomains == existingPolicy.includesSubDomains &&
+ domain == existingPolicy.domain) {
+ if (allowInsecureConnections ==
+ existingPolicy.allowInsecureConnections) {
+ // This is a duplicate policy
+ return false;
+ }
+ throw StateError("Contradiction in the domain security policies: "
+ "'$this' contradicts '$existingPolicy'");
+ }
+ }
+ return true;
+ }
+
+ /// This is used for encoding information about the policy in user visible
+ /// errors.
+ @override
+ String toString() {
+ final subDomainPrefix = includesSubDomains ? '*.' : '';
+ final insecureConnectionPermission =
+ allowInsecureConnections ? 'Allows' : 'Disallows';
+ return "$subDomainPrefix$domain: "
+ "$insecureConnectionPermission insecure connections";
+ }
+}
+
+/// Finds the top [DomainNetworkPolicy] instance that match given a single
+/// [domain].
+///
+/// We order the policies according to how specific they are. The final policy
+/// for a given [domain] is determined by the top matching
+/// [DomainNetworkPolicy].
+///
+/// Returns null if there's no matching policy.
+_DomainNetworkPolicy? _findBestDomainNetworkPolicy(String domain) {
+ var topScore = 0;
+ _DomainNetworkPolicy? topPolicy;
+ for (final _DomainNetworkPolicy policy in _domainPolicies) {
+ final score = policy.matchScore(domain);
+ if (score > topScore) {
+ topScore = score;
+ topPolicy = policy;
+ }
+ }
+ return topPolicy;
+}
+
+/// Domain level policies that dart:io is enforcing.
+late List<_DomainNetworkPolicy> _domainPolicies =
+ _constructDomainPolicies(null);
+
+List<_DomainNetworkPolicy> _constructDomainPolicies(
+ String? domainPoliciesString) {
+ final domainPolicies = <_DomainNetworkPolicy>[];
+ domainPoliciesString ??= String.fromEnvironment(
+ "dart.library.io.domain_network_policies",
+ defaultValue: "");
+ if (domainPoliciesString.isNotEmpty) {
+ final List<dynamic> policiesJson = json.decode(domainPoliciesString);
+ for (final List<dynamic> policyJson in policiesJson) {
+ assert(policyJson.length == 3);
+ final policy = _DomainNetworkPolicy(
+ policyJson[0],
+ includesSubDomains: policyJson[1],
+ allowInsecureConnections: policyJson[2],
+ );
+ if (policy.checkConflict(domainPolicies)) {
+ domainPolicies.add(policy);
+ }
+ }
+ }
+ return domainPolicies;
+}
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b5e814f..4cdd14f 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -801,6 +801,10 @@
{sourceAddress, Duration? timeout}) {
final IOOverrides? overrides = IOOverrides.current;
if (overrides == null) {
+ if (!isInsecureConnectionAllowed(host)) {
+ throw new SocketException(
+ "Insecure socket connections are disallowed by platform: $host");
+ }
return Socket._connect(host, port,
sourceAddress: sourceAddress, timeout: timeout);
}
@@ -815,6 +819,10 @@
{sourceAddress}) {
final IOOverrides? overrides = IOOverrides.current;
if (overrides == null) {
+ if (!isInsecureConnectionAllowed(host)) {
+ throw new SocketException(
+ "Insecure socket connections are disallowed by platform: $host");
+ }
return Socket._startConnect(host, port, sourceAddress: sourceAddress);
}
return overrides.socketStartConnect(host, port,
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index cb09dc7..607fb63 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -50,18 +50,6 @@
LanguageFeatures/Triple-Shift/*: Skip # Not migrated to NNBD
LanguageFeatures/int-to-double/*: Skip # Not migrated to NNBD
LanguageFeatures/regression/*: Skip # Not migrated to NNBD
-LibTest/async/Completer/*: Skip # Not migrated to NNBD
-LibTest/async/DeferredLibrary/*: Skip # Not migrated to NNBD
-LibTest/async/EventSink/*: Skip # Not migrated to NNBD
-LibTest/async/Future/*: Skip # Not migrated to NNBD
-LibTest/async/Stream/*: Skip # Not migrated to NNBD
-LibTest/async/StreamConsumer/*: Skip # Not migrated to NNBD
-LibTest/async/StreamController/*: Skip # Not migrated to NNBD
-LibTest/async/StreamIterator/*: Skip # Not migrated to NNBD
-LibTest/async/StreamSink/*: Skip # Not migrated to NNBD
-LibTest/async/StreamTransformer/*: Skip # Not migrated to NNBD
-LibTest/async/Timer/*: Skip # Not migrated to NNBD
-LibTest/async/Zone/*: Skip # Not migrated to NNBD
LibTest/collection/DoubleLinkedQueue/*: Skip # Not migrated to NNBD
LibTest/collection/DoubleLinkedQueueEntry/*: Skip # Not migrated to NNBD
LibTest/collection/HasNextIterator/*: Skip # Not migrated to NNBD
diff --git a/tests/corelib/cast_errors_test.dart b/tests/corelib/cast_errors_test.dart
index 9e2b8eb2..b9aa936 100644
--- a/tests/corelib/cast_errors_test.dart
+++ b/tests/corelib/cast_errors_test.dart
@@ -31,6 +31,6 @@
// [cfe] A value of type 'C' can't be assigned to a variable of type 'D?'.
dMap[d] = c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'C' can't be assigned to a variable of type 'D?'.
}
diff --git a/tests/language/assert/initializer_const_function_test.dart b/tests/language/assert/initializer_const_function_test.dart
index 27b99bd..b581c1d 100644
--- a/tests/language/assert/initializer_const_function_test.dart
+++ b/tests/language/assert/initializer_const_function_test.dart
@@ -11,7 +11,7 @@
const C.bc01(this.x, y)
: assert(staticTrue)
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'bool Function()' can't be assigned to a variable of type 'bool'.
;
}
diff --git a/tests/language/assign/static_type_test.dart b/tests/language/assign/static_type_test.dart
index d184bf4..8fba36d 100644
--- a/tests/language/assign/static_type_test.dart
+++ b/tests/language/assign/static_type_test.dart
@@ -7,7 +7,7 @@
int a = "String";
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
class A {
@@ -16,19 +16,19 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
final int d = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
int e = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
A() {
int f = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
}
method(
@@ -36,7 +36,7 @@
int
g = "String"]) {
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
return g;
}
diff --git a/tests/language/async/congruence_local_test.dart b/tests/language/async/congruence_local_test.dart
index 6ea20da..15e27a2 100644
--- a/tests/language/async/congruence_local_test.dart
+++ b/tests/language/async/congruence_local_test.dart
@@ -100,7 +100,7 @@
Future<Object> v1 = f_inferred_futureObject();
Future<int> v2 = f_inferred_futureObject();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'Future<int>'.
@@ -110,7 +110,7 @@
Future<A> v3 = f_inferred_A();
Future<B> v4 = f_inferred_A();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
}
diff --git a/tests/language/async/congruence_method_test.dart b/tests/language/async/congruence_method_test.dart
index 5732013..663fdf4 100644
--- a/tests/language/async/congruence_method_test.dart
+++ b/tests/language/async/congruence_method_test.dart
@@ -78,7 +78,7 @@
Future<A> v1 = c.f_inferred_A();
Future<B> v2 = c.f_inferred_A();
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
}
diff --git a/tests/language/async/congruence_unnamed_test.dart b/tests/language/async/congruence_unnamed_test.dart
index 274588b..0aef8ad 100644
--- a/tests/language/async/congruence_unnamed_test.dart
+++ b/tests/language/async/congruence_unnamed_test.dart
@@ -120,7 +120,7 @@
Future<Object> v1 = f_inferred_futureObject();
Future<int> v2 = f_inferred_futureObject();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'Future<int>'.
@@ -130,7 +130,7 @@
Future<A> v3 = f_inferred_A();
Future<B> v4 = f_inferred_A();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<B>'.
}
diff --git a/tests/language/async/or_generator_return_type_stacktrace_test.dart b/tests/language/async/or_generator_return_type_stacktrace_test.dart
index 1e331db..317b537 100644
--- a/tests/language/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language/async/or_generator_return_type_stacktrace_test.dart
@@ -6,7 +6,7 @@
int badReturnTypeAsync() async => 0;
// [error line 7, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
// ^
// [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
int badReturnTypeAsyncStar() async* {}
diff --git a/tests/language/async/return_types_test.dart b/tests/language/async/return_types_test.dart
index 20a3c22..f378549 100644
--- a/tests/language/async/return_types_test.dart
+++ b/tests/language/async/return_types_test.dart
@@ -18,13 +18,13 @@
foo3() async {
return "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'String' can't be assigned to a variable of type 'FutureOr<int>'.
}
Future<int, String>
// [error line 25, column 1, length 19]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
foo4() async {
return "String";
@@ -32,7 +32,7 @@
int
// [error line 33, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
foo5() async {
// [error line 36, column 1, length 3]
// [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
diff --git a/tests/language/call/method_implicit_tear_off_assignable_test.dart b/tests/language/call/method_implicit_tear_off_assignable_test.dart
index 791b083..c1e6f25 100644
--- a/tests/language/call/method_implicit_tear_off_assignable_test.dart
+++ b/tests/language/call/method_implicit_tear_off_assignable_test.dart
@@ -17,6 +17,6 @@
// this is a static error.
void Function([int]) f = i;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] unspecified
}
diff --git a/tests/language/call/non_method_field_test.dart b/tests/language/call/non_method_field_test.dart
index 6d30f27..bb5b843 100644
--- a/tests/language/call/non_method_field_test.dart
+++ b/tests/language/call/non_method_field_test.dart
@@ -14,14 +14,14 @@
Fisk x1 = new Fisk();
x1.i();
//^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
Hest x2 = new Hest();
x2.i();
//^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
}
diff --git a/tests/language/call/object_has_no_call_method_test.dart b/tests/language/call/object_has_no_call_method_test.dart
index dcb2a5c..d02b290 100644
--- a/tests/language/call/object_has_no_call_method_test.dart
+++ b/tests/language/call/object_has_no_call_method_test.dart
@@ -6,20 +6,20 @@
d();
o();
//^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Object'.
f();
d.call;
o.call;
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'call' isn't defined for the class 'Object'.
f.call;
d.call();
o.call();
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'call' isn't defined for the class 'Object'.
f.call();
}
diff --git a/tests/language/call/through_getter_test.dart b/tests/language/call/through_getter_test.dart
index 2169e8c6..06e5af3 100644
--- a/tests/language/call/through_getter_test.dart
+++ b/tests/language/call/through_getter_test.dart
@@ -31,12 +31,12 @@
TOP_LEVEL_CONST();
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
(TOP_LEVEL_CONST)();
// ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
diff --git a/tests/language/cascade/cascade_test.dart b/tests/language/cascade/cascade_test.dart
index 274b23bf..7e674f5 100644
--- a/tests/language/cascade/cascade_test.dart
+++ b/tests/language/cascade/cascade_test.dart
@@ -93,11 +93,11 @@
// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
// [cfe] Expected an identifier, but got '37'.
// [error line 91, column 8, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
a.."foo";
// ^^^^^
// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
// [cfe] Expected an identifier, but got '"foo"'.
// [error line 97, column 11, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
}
diff --git a/tests/language/closure/internals_test.dart b/tests/language/closure/internals_test.dart
index 78f04ab..9efdda3 100644
--- a/tests/language/closure/internals_test.dart
+++ b/tests/language/closure/internals_test.dart
@@ -12,14 +12,14 @@
var f = new C().foo;
var target = f.target;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'target' isn't defined for the class 'dynamic Function()'.
var self = f.self;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'self' isn't defined for the class 'dynamic Function()'.
var receiver = f.receiver;
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'receiver' isn't defined for the class 'dynamic Function()'.
}
diff --git a/tests/language/compile_time_constant/static2_test.dart b/tests/language/compile_time_constant/static2_test.dart
index 5de087a..2f6abe6 100644
--- a/tests/language/compile_time_constant/static2_test.dart
+++ b/tests/language/compile_time_constant/static2_test.dart
@@ -13,7 +13,7 @@
const A.a2(this.x);
const A.a3([this.x = 'foo']);
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const A.a4(String this.x);
// ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
const a2 = const A.a2('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
const a3 = const A.a3();
// ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
const a4 = const A.a4('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
const a5 = const A.a5('foo');
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/compile_time_constant/static3_test.dart b/tests/language/compile_time_constant/static3_test.dart
index d6c508b..f9205fd 100644
--- a/tests/language/compile_time_constant/static3_test.dart
+++ b/tests/language/compile_time_constant/static3_test.dart
@@ -13,7 +13,7 @@
const A.a2(this.x);
const A.a3([this.x = 'foo']);
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const A.a4(String this.x);
// ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
var a2 = const A.a2('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
var a3 = const A.a3();
// ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
var a4 = const A.a4('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
var a5 = const A.a5('foo');
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/compile_time_constant/static_test.dart b/tests/language/compile_time_constant/static_test.dart
index 288ffef..a7fb0a8 100644
--- a/tests/language/compile_time_constant/static_test.dart
+++ b/tests/language/compile_time_constant/static_test.dart
@@ -4,17 +4,17 @@
final int x = 'foo';
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const int y = 'foo';
// ^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
int z = 'foo';
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
main() {
diff --git a/tests/language/const/conditional_test.dart b/tests/language/const/conditional_test.dart
index 33aec86..4943748 100644
--- a/tests/language/const/conditional_test.dart
+++ b/tests/language/const/conditional_test.dart
@@ -73,13 +73,13 @@
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
const cond4a = zeroConst ? nonConst : const1;
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] Not a constant expression.
const cond4b = zeroConst ? const0 : nonConst;
@@ -87,7 +87,7 @@
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] Not a constant expression.
diff --git a/tests/language/const/constructor3_test.dart b/tests/language/const/constructor3_test.dart
index aa8aa0ff..8ec85e0 100644
--- a/tests/language/const/constructor3_test.dart
+++ b/tests/language/const/constructor3_test.dart
@@ -15,7 +15,7 @@
const c = const C(0.0);
const d = const C(intValue);
// ^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'int' can't be assigned to the parameter type 'double'.
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language/const/init2_test.dart b/tests/language/const/init2_test.dart
index 7f5e1a3..40b7a8b 100644
--- a/tests/language/const/init2_test.dart
+++ b/tests/language/const/init2_test.dart
@@ -9,7 +9,7 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'int' can't be assigned to a variable of type 'double'.
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
main() {
print(c);
diff --git a/tests/language/constructor/named_constructor_test.dart b/tests/language/constructor/named_constructor_test.dart
index d802b9a..3b8af32 100644
--- a/tests/language/constructor/named_constructor_test.dart
+++ b/tests/language/constructor/named_constructor_test.dart
@@ -24,12 +24,12 @@
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// 'Class<int>.named<int>' doesn't fit the grammar syntax T.id:
new Class<int>.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
new prefix.Class().value;
@@ -45,7 +45,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
new prefix.Class.named().value;
@@ -64,7 +64,7 @@
// 'prefix.Class.named<int>' doesn't fit the grammar syntax T.id:
new prefix.Class.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// 'prefix<int>.Class<int>' doesn't fit the grammar syntax T.id:
@@ -73,7 +73,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -90,7 +90,7 @@
// 'prefix.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
new prefix.Class<int>.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// 'prefix<int>.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
@@ -99,6 +99,6 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
}
diff --git a/tests/language/constructor/reference_test.dart b/tests/language/constructor/reference_test.dart
index c1ec04c..9246d2b 100644
--- a/tests/language/constructor/reference_test.dart
+++ b/tests/language/constructor/reference_test.dart
@@ -23,13 +23,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
new Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
new Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -41,7 +41,7 @@
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^
// [cfe] Method not found: 'Foo.bar.baz'.
@@ -60,13 +60,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
const Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
const Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -78,7 +78,7 @@
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^
// [cfe] Method not found: 'Foo.bar.baz'.
@@ -87,7 +87,7 @@
Foo.bar();
Foo.bar.baz();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'bar'.
Foo<int>();
Foo<int>.bar();
@@ -96,13 +96,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -112,6 +112,6 @@
// [cfe] Method not found: 'Foo.bar.baz'.
Foo.bar.baz<int>();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'bar'.
}
diff --git a/tests/language/control_flow_collections/await_for_downcast_test.dart b/tests/language/control_flow_collections/await_for_downcast_test.dart
index 613ebf4..5c6d3ff 100644
--- a/tests/language/control_flow_collections/await_for_downcast_test.dart
+++ b/tests/language/control_flow_collections/await_for_downcast_test.dart
@@ -17,7 +17,7 @@
Object obj = stream([1, 2, 3, 4]);
var a = <int>[await for (var n in obj) n];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
// Downcast variable.
@@ -26,7 +26,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
];
// Downcast element.
@@ -43,7 +43,7 @@
Object obj = stream([1, 2, 3, 4]);
var a = <int, int>{await for (var n in obj) n: n};
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
// Downcast variable.
@@ -52,7 +52,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
};
// Downcast element.
@@ -72,7 +72,7 @@
Object obj = stream([1, 2, 3, 4]);
var a = <int>{await for (var n in obj) n};
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Stream<dynamic>'.
// Downcast variable.
@@ -81,7 +81,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
};
// Downcast element.
diff --git a/tests/language/control_flow_collections/for_downcast_test.dart b/tests/language/control_flow_collections/for_downcast_test.dart
index d88e3f6..a9eda1d 100644
--- a/tests/language/control_flow_collections/for_downcast_test.dart
+++ b/tests/language/control_flow_collections/for_downcast_test.dart
@@ -15,7 +15,7 @@
Object obj = <int>[1, 2, 3, 4];
var a = <int>[for (var n in obj) n];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// Downcast variable.
@@ -24,7 +24,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
];
// Downcast element.
@@ -38,7 +38,7 @@
// Downcast condition.
var d = <int>[for (var i = 1; (i < 2) as Object; i++) i];
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
@@ -48,7 +48,7 @@
Object obj = <int>[1, 2, 3, 4];
var a = <int, int>{for (var n in obj) n: n};
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// Downcast variable.
@@ -57,7 +57,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
};
// Downcast element.
@@ -74,7 +74,7 @@
// Downcast condition.
var d = <int, int>{for (var i = 1; (i < 2) as Object; i++) i: i};
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
@@ -84,7 +84,7 @@
Object obj = <int>[1, 2, 3, 4];
var a = <int>{for (var n in obj) n};
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
// Downcast variable.
@@ -93,7 +93,7 @@
// ^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
};
// Downcast element.
@@ -107,7 +107,7 @@
// Downcast condition.
var d = <int>{for (var i = 1; (i < 2) as Object; i++) i};
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/control_flow_collections/if_downcast_test.dart b/tests/language/control_flow_collections/if_downcast_test.dart
index 4150456..0acfbde 100644
--- a/tests/language/control_flow_collections/if_downcast_test.dart
+++ b/tests/language/control_flow_collections/if_downcast_test.dart
@@ -5,19 +5,19 @@
void main() {
var a = <int>[if (true as Object) 1];
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
var b = <int, int>{if (true as Object) 1: 1};
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
var c = <int>{if (true as Object) 1};
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/covariant/return_type_test.dart b/tests/language/covariant/return_type_test.dart
index 43c6c9e..ae6ebae 100644
--- a/tests/language/covariant/return_type_test.dart
+++ b/tests/language/covariant/return_type_test.dart
@@ -7,7 +7,7 @@
void main() {
List<int> l = [1, 2, 3].where((x) => x.isEven).map((x) => x + 1);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Iterable<int>' can't be assigned to a variable of type 'List<int>'.
@@ -21,7 +21,7 @@
C<Object> c = C<Object>(1);
List<bool Function(Object)> myList = c.f();
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Iterable<bool Function(Object)>' can't be assigned to a variable of type 'List<bool Function(Object)>'.
}
@@ -30,7 +30,7 @@
C<Object> c = C<int>(1);
List<bool Function(Object)> myList = c.f();
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Iterable<bool Function(Object)>' can't be assigned to a variable of type 'List<bool Function(Object)>'.
}
@@ -50,7 +50,7 @@
C<Iterable<Object>> c = D<Object>([1]);
List<bool Function(Iterable<Object>)> myList = c.f();
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Iterable<bool Function(Iterable<Object>)>' can't be assigned to a variable of type 'List<bool Function(Iterable<Object>)>'.
}
diff --git a/tests/language/deferred/super_dependency_test.dart b/tests/language/deferred/super_dependency_test.dart
index f49380c..5879e56 100644
--- a/tests/language/deferred/super_dependency_test.dart
+++ b/tests/language/deferred/super_dependency_test.dart
@@ -8,7 +8,7 @@
import "package:expect/expect.dart";
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'foo'.
import "super_dependency_lib.dart" deferred as lib;
diff --git a/tests/language/enum/private_test.dart b/tests/language/enum/private_test.dart
index bd99d84..a24fec3 100644
--- a/tests/language/enum/private_test.dart
+++ b/tests/language/enum/private_test.dart
@@ -20,6 +20,6 @@
Expect.equals('Enum2._A,Enum2._B', Enum2.values.join(','));
Expect.throwsNoSuchMethodError(() => Enum2._A);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_ENUM_CONSTANT
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_ENUM_CONSTANT
// [cfe] Getter not found: '_A'.
}
diff --git a/tests/language/extension_methods/static_extension_bounds_error_test.dart b/tests/language/extension_methods/static_extension_bounds_error_test.dart
index 5424a7e..60ae8b7 100644
--- a/tests/language/extension_methods/static_extension_bounds_error_test.dart
+++ b/tests/language/extension_methods/static_extension_bounds_error_test.dart
@@ -32,7 +32,7 @@
// Inferred type of String does not satisfy the bound.
s.e1;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e1' isn't defined for the class 'String'.
E1(s).e1;
//^^
@@ -55,7 +55,7 @@
// Inferred type of String does not satisfy the bound.
s.e2;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e2' isn't defined for the class 'String'.
E2(s).e2;
//^^
@@ -121,7 +121,7 @@
// Inferred super-bounded type is invalid as type argument
superRec.e4;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e4' isn't defined for the class 'Rec<dynamic>'.
E4(superRec).e4;
//^^
diff --git a/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart b/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
index 59920e7..8dc19f1 100644
--- a/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
+++ b/tests/language/extension_methods/static_extension_deferred_import_resolution_error_test.dart
@@ -10,10 +10,10 @@
Object o = 1;
OnObject(o).onObject;
//^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: 'OnObject'.
o.onObject;
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onObject' isn't defined for the class 'Object'.
}
diff --git a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
index bce34aa..42c9c65 100644
--- a/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -44,15 +44,15 @@
c0.m2 = 0;
c0.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
c0.m2 += 0;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
c0.m2++;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
E0(c0).m2;
@@ -60,7 +60,7 @@
c0[0];
c0[0] = 0;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0];
// ^^^
@@ -70,11 +70,11 @@
c0[0] += 0;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
c0[0]++;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0] += 0;
@@ -114,24 +114,24 @@
c1a.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C1<int>'.
c1a.m2 = 0;
c1a[0] = 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0] += 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0]++;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0];
@@ -200,7 +200,7 @@
c1c.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C1<Object>'.
}
@@ -230,23 +230,23 @@
this.m2 = 0;
this.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C2'.
this[0] = 0;
this[0];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0] += 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0]++;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
// Check that `this.mc` refers to `C2.mc`.
diff --git a/tests/language/extension_methods/static_extension_import_hide_error_test.dart b/tests/language/extension_methods/static_extension_import_hide_error_test.dart
index 9a93aa0..25b0461 100644
--- a/tests/language/extension_methods/static_extension_import_hide_error_test.dart
+++ b/tests/language/extension_methods/static_extension_import_hide_error_test.dart
@@ -12,7 +12,7 @@
Object o = i;
i.onInt;
//^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onInt' isn't defined for the class 'int'.
i.onObject;
o.onObject;
diff --git a/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart b/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
index 3c485e8..a146f12 100644
--- a/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
+++ b/tests/language/extension_methods/static_extension_import_prefixed_hide_error_test.dart
@@ -12,7 +12,7 @@
Object o = i;
i.onInt;
//^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onInt' isn't defined for the class 'int'.
i.onObject;
o.onObject;
diff --git a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index f1a9254..86941be 100644
--- a/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -51,7 +51,7 @@
// The instance getter shadows the global method
topLevelMethod(4);
// ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -143,7 +143,7 @@
// The static getter shadows the global method
topLevelMethod(4);
// ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -225,7 +225,7 @@
// The instance getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -256,7 +256,7 @@
// The instance getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
}
@@ -371,7 +371,7 @@
// The static getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -417,7 +417,7 @@
// The static getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
diff --git a/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart b/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
index 38191b8..dd18be3 100644
--- a/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
+++ b/tests/language/extension_methods/static_extension_internal_resolution_6_error_test.dart
@@ -29,7 +29,7 @@
void shadowTypeParam<T>(T x) {
T y = self;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type '#T' can't be assigned to a variable of type 'T'.
}
diff --git a/tests/language/extension_methods/static_extension_resolution_failures_test.dart b/tests/language/extension_methods/static_extension_resolution_failures_test.dart
index 2856a18..ce822ac 100644
--- a/tests/language/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language/extension_methods/static_extension_resolution_failures_test.dart
@@ -39,7 +39,7 @@
// No `i_num` extension declared.
i_num.i_num;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'i_num' isn't defined for the class 'Iterable<num>'.
Expect.equals("Iterable<int>.i_num", ii.i_num);
diff --git a/tests/language/factory/factory_test.dart b/tests/language/factory/factory_test.dart
index b42c213..7b0c2a8 100644
--- a/tests/language/factory/factory_test.dart
+++ b/tests/language/factory/factory_test.dart
@@ -36,7 +36,7 @@
abstract class Link<T> {
factory Link.create() = LinkFactory<T>.create;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
diff --git a/tests/language/factory/return_type_checked_test.dart b/tests/language/factory/return_type_checked_test.dart
index 0cff112..0913da5 100644
--- a/tests/language/factory/return_type_checked_test.dart
+++ b/tests/language/factory/return_type_checked_test.dart
@@ -7,7 +7,7 @@
class A {
factory A() => 42;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'int' can't be returned from a function with return type 'A'.
}
diff --git a/tests/language/field/type_check_test.dart b/tests/language/field/type_check_test.dart
index 09b5507..34315c1 100644
--- a/tests/language/field/type_check_test.dart
+++ b/tests/language/field/type_check_test.dart
@@ -9,6 +9,6 @@
void main() {
new A().e = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
}
diff --git a/tests/language/function/malformed_result_type_test.dart b/tests/language/function/malformed_result_type_test.dart
index 182258b..9f2223c 100644
--- a/tests/language/function/malformed_result_type_test.dart
+++ b/tests/language/function/malformed_result_type_test.dart
@@ -11,6 +11,6 @@
main() {
C<int> f() => throw "uncalled";
//^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
}
diff --git a/tests/language/function/type_call_getter2_test.dart b/tests/language/function/type_call_getter2_test.dart
index c52cb9e..789f22e 100644
--- a/tests/language/function/type_call_getter2_test.dart
+++ b/tests/language/function/type_call_getter2_test.dart
@@ -27,42 +27,42 @@
Function
a2 = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'Function'.
final
F
a3 = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'int Function(String)'.
final
Function
b2 = b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'B' can't be assigned to a variable of type 'Function'.
final
F
b3 = b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'B' can't be assigned to a variable of type 'int Function(String)'.
final
Function
c2 = c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'C' can't be assigned to a variable of type 'Function'.
final
F
c3 = c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'C' can't be assigned to a variable of type 'int Function(String)'.
Expect.throwsTypeError(() {
diff --git a/tests/language/generic/field_mixin6_test.dart b/tests/language/generic/field_mixin6_test.dart
index 47a3678..303df88 100644
--- a/tests/language/generic/field_mixin6_test.dart
+++ b/tests/language/generic/field_mixin6_test.dart
@@ -9,7 +9,7 @@
class M<T> {
T field1 = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'int' can't be assigned to a variable of type 'T'.
T field2 = 0 as dynamic;
}
diff --git a/tests/language/generic/function_subtype_parametrized_typedef_test.dart b/tests/language/generic/function_subtype_parametrized_typedef_test.dart
index a1dd791..10775ef 100644
--- a/tests/language/generic/function_subtype_parametrized_typedef_test.dart
+++ b/tests/language/generic/function_subtype_parametrized_typedef_test.dart
@@ -17,30 +17,30 @@
H<A> haa = ha;
H<A> hab = hb;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
H<A> hac = hc;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
H<B> hba = ha;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
H<B> hbb = hb;
H<B> hbc = hc;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
H<C> hca = ha;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
H<C> hcb = hb;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
H<C> hcc = hc;
}
diff --git a/tests/language/generic/function_subtype_test.dart b/tests/language/generic/function_subtype_test.dart
index 28cb90a..d392f6d 100644
--- a/tests/language/generic/function_subtype_test.dart
+++ b/tests/language/generic/function_subtype_test.dart
@@ -14,12 +14,12 @@
F1 f11 = f1;
F1 f12 = f2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y2 extends String>()' can't be assigned to a variable of type 'void Function<X1 extends num>()'.
F2 f21 = f1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y1 extends num>()' can't be assigned to a variable of type 'void Function<X2 extends String>()'.
F2 f22 = f2;
}
diff --git a/tests/language/generic/function_typedef2_test.dart b/tests/language/generic/function_typedef2_test.dart
index 6532988..0ad79c5 100644
--- a/tests/language/generic/function_typedef2_test.dart
+++ b/tests/language/generic/function_typedef2_test.dart
@@ -27,7 +27,7 @@
// [cfe] Can't create typedef from non-function type.
typedef K = Function(Function<A>(A<int>));
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Can't use type arguments with type variable 'A'.
typedef L = Function({x});
// ^
diff --git a/tests/language/generic/wrong_number_type_arguments_test.dart b/tests/language/generic/wrong_number_type_arguments_test.dart
index dcc0d9a..160e331 100644
--- a/tests/language/generic/wrong_number_type_arguments_test.dart
+++ b/tests/language/generic/wrong_number_type_arguments_test.dart
@@ -5,18 +5,18 @@
// Map takes 2 type arguments.
Map<String> foo = {};
// [error line 6, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
Map<String> baz = {};
// [error line 10, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
main() {
foo = {};
var bar = new Map<String>();
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
baz = new Map();
}
diff --git a/tests/language/getter/no_setter2_test.dart b/tests/language/getter/no_setter2_test.dart
index 83d92c4..22ad07e 100644
--- a/tests/language/getter/no_setter2_test.dart
+++ b/tests/language/getter/no_setter2_test.dart
@@ -18,7 +18,7 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
// [cfe] The getter 'nextVar' isn't defined for the class 'Example'.
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
}
static test() {
@@ -31,7 +31,7 @@
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
// [cfe] Expected identifier, but got 'this'.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
}
diff --git a/tests/language/getter/no_setter_test.dart b/tests/language/getter/no_setter_test.dart
index c403d32..260b5fc 100644
--- a/tests/language/getter/no_setter_test.dart
+++ b/tests/language/getter/no_setter_test.dart
@@ -15,7 +15,7 @@
// [cfe] Setter not found: 'nextVar'.
this.nextVar = 1;
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -30,7 +30,7 @@
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
// [cfe] Expected identifier, but got 'this'.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
}
diff --git a/tests/language/getter/setter2_test.dart b/tests/language/getter/setter2_test.dart
index a26bd49..0985ebe 100644
--- a/tests/language/getter/setter2_test.dart
+++ b/tests/language/getter/setter2_test.dart
@@ -57,7 +57,7 @@
void set field(A arg) {
getterField = arg;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
}
@@ -72,7 +72,7 @@
Expect.throwsTypeError(() => instance1.field = new A() as dynamic);
B resultB = instance1.field;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
@@ -83,7 +83,7 @@
// Type 'A' has no method named 'b'
instance1.field.b();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'b' isn't defined for the class 'A'.
instance3.field = new B();
diff --git a/tests/language/identifier/known_prefix_error_test.dart b/tests/language/identifier/known_prefix_error_test.dart
index fe1ea19..06ec097 100644
--- a/tests/language/identifier/known_prefix_error_test.dart
+++ b/tests/language/identifier/known_prefix_error_test.dart
@@ -72,82 +72,82 @@
async.B<async> _B_async = new async.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'async' isn't a type.
await.B<await> _B_await = new await.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'await' isn't a type.
hide.B<hide> _B_hide = new hide.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'hide' isn't a type.
of.B<of> _B_of = new of.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'of' isn't a type.
on.B<on> _B_on = new on.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'on' isn't a type.
show.B<show> _B_show = new show.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'show' isn't a type.
sync.B<sync> _B_sync = new sync.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'sync' isn't a type.
yield.B<yield> _B_yield = new yield.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'yield' isn't a type.
async.B<async<dynamic>> _B2_async = new async.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'async' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
await.B<await<dynamic>> _B2_await = new await.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'await' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
hide.B<hide<dynamic>> _B2_hide = new hide.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'hide' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
of.B<of<dynamic>> _B2_of = new of.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'of' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
on.B<on<dynamic>> _B2_on = new on.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'on' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
show.B<show<dynamic>> _B2_show = new show.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'show' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
sync.B<sync<dynamic>> _B2_sync = new sync.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'sync' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
yield.B<yield<dynamic>> _B2_yield = new yield.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'yield' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
diff --git a/tests/language/if_null/assignment_behavior_test.dart b/tests/language/if_null/assignment_behavior_test.dart
index 12da870..d83be71 100644
--- a/tests/language/if_null/assignment_behavior_test.dart
+++ b/tests/language/if_null/assignment_behavior_test.dart
@@ -125,7 +125,7 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL
// [cfe] The setter 'finalOne' isn't defined for the class 'C'.
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^^^
// [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
yGetValue = 1;
@@ -172,7 +172,7 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_LOCAL
// [cfe] Can't assign to the final variable 'l'.
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^^^
// [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
C ??= null;
@@ -180,7 +180,7 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
// [cfe] Can't assign to a type literal.
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^^^
// [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
h ??= null;
@@ -228,11 +228,11 @@
check(1, () => C?.x ??= bad(), ['C.x']);
h.C.xgetValue = 1;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] Setter not found: 'xgetValue'.
check(1, () => h.c?.x ??= bad(), ['h.C.x']);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: 'c'.
yGetValue = 1;
check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']);
diff --git a/tests/language/if_null/precedence_test.dart b/tests/language/if_null/precedence_test.dart
index 2b11622..eeb9570 100644
--- a/tests/language/if_null/precedence_test.dart
+++ b/tests/language/if_null/precedence_test.dart
@@ -34,7 +34,7 @@
// "(a ?? b) || c" would allow b to have any type provided that a is bool.
falsity ?? 1 || true;
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// "a || b ?? c" should parse as "(a || b) ?? c", therefore it is a static
@@ -42,7 +42,7 @@
// "a || (b ?? c)" would allow b to have any type provided that c is bool.
falsity || 1 ?? true;
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^
// [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
@@ -51,7 +51,7 @@
// error.
Expect.throwsAssertionError(() => false || null ?? true);
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
// ^^^^
// [analyzer] STATIC_WARNING.DEAD_NULL_AWARE_EXPRESSION
diff --git a/tests/language/implicit_downcast_during/assert_initializer_test.dart b/tests/language/implicit_downcast_during/assert_initializer_test.dart
index dd8c975..ca323ad 100644
--- a/tests/language/implicit_downcast_during/assert_initializer_test.dart
+++ b/tests/language/implicit_downcast_during/assert_initializer_test.dart
@@ -5,11 +5,11 @@
class C {
C.oneArg(Object x) : assert(x);
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
C.twoArgs(Object x, Object y) : assert(x, y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/assert_statement_test.dart b/tests/language/implicit_downcast_during/assert_statement_test.dart
index 9f0aa75..d32382e 100644
--- a/tests/language/implicit_downcast_during/assert_statement_test.dart
+++ b/tests/language/implicit_downcast_during/assert_statement_test.dart
@@ -6,11 +6,11 @@
Object b = true;
assert(b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
assert(b, 'should not fail');
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
assert(false, b);
// OK, the message can have any type.
diff --git a/tests/language/implicit_downcast_during/assignment_test.dart b/tests/language/implicit_downcast_during/assignment_test.dart
index fe9f1e4..fe35a5c 100644
--- a/tests/language/implicit_downcast_during/assignment_test.dart
+++ b/tests/language/implicit_downcast_during/assignment_test.dart
@@ -11,6 +11,6 @@
A a = new B();
b = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/compound_assignment_test.dart b/tests/language/implicit_downcast_during/compound_assignment_test.dart
index a927b55..3d092c4 100644
--- a/tests/language/implicit_downcast_during/compound_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/compound_assignment_test.dart
@@ -15,16 +15,16 @@
//^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
++b;
//^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
b++;
//^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/conditional_expression_test.dart b/tests/language/implicit_downcast_during/conditional_expression_test.dart
index 565f124..ce234c2 100644
--- a/tests/language/implicit_downcast_during/conditional_expression_test.dart
+++ b/tests/language/implicit_downcast_during/conditional_expression_test.dart
@@ -6,6 +6,6 @@
Object b = true;
b ? 1 : 2;
//^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/do_test.dart b/tests/language/implicit_downcast_during/do_test.dart
index f4bebde..24aff94 100644
--- a/tests/language/implicit_downcast_during/do_test.dart
+++ b/tests/language/implicit_downcast_during/do_test.dart
@@ -6,6 +6,6 @@
Object b = false;
do {} while (b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/field_declaration_test.dart b/tests/language/implicit_downcast_during/field_declaration_test.dart
index 4f819a2..abcac19 100644
--- a/tests/language/implicit_downcast_during/field_declaration_test.dart
+++ b/tests/language/implicit_downcast_during/field_declaration_test.dart
@@ -9,18 +9,18 @@
A a1 = new B();
B b1 = a1;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
class C {
static B b3 = a1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
B b5 = a1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/for_condition_test.dart b/tests/language/implicit_downcast_during/for_condition_test.dart
index 645b943..a860b6a 100644
--- a/tests/language/implicit_downcast_during/for_condition_test.dart
+++ b/tests/language/implicit_downcast_during/for_condition_test.dart
@@ -6,6 +6,6 @@
Object b = false;
for (int i = 0; b; i++) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/for_in_element_test.dart b/tests/language/implicit_downcast_during/for_in_element_test.dart
index 30273be..67be51e 100644
--- a/tests/language/implicit_downcast_during/for_in_element_test.dart
+++ b/tests/language/implicit_downcast_during/for_in_element_test.dart
@@ -11,21 +11,21 @@
Object o = listOfA;
for (B x in o) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
for (B x in listOfA) {}
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
B y;
for (y in o) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
for (y in listOfA) {}
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_ELEMENT_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_ELEMENT_TYPE
}
diff --git a/tests/language/implicit_downcast_during/for_in_iterable_test.dart b/tests/language/implicit_downcast_during/for_in_iterable_test.dart
index 09fd2cf..91ca2ca 100644
--- a/tests/language/implicit_downcast_during/for_in_iterable_test.dart
+++ b/tests/language/implicit_downcast_during/for_in_iterable_test.dart
@@ -10,15 +10,15 @@
Object o = <A>[];
for (var x in o) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
for (B x in o) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
B y;
for (y in o) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.FOR_IN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.FOR_IN_OF_INVALID_TYPE
// [cfe] The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
}
diff --git a/tests/language/implicit_downcast_during/for_initializer_expression_test.dart b/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
index 8c14537..98d8daf 100644
--- a/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
+++ b/tests/language/implicit_downcast_during/for_initializer_expression_test.dart
@@ -7,6 +7,6 @@
int i;
for (i = b; i < 1; i++) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'int'.
}
diff --git a/tests/language/implicit_downcast_during/for_initializer_var_test.dart b/tests/language/implicit_downcast_during/for_initializer_var_test.dart
index 958c111..4b79c20 100644
--- a/tests/language/implicit_downcast_during/for_initializer_var_test.dart
+++ b/tests/language/implicit_downcast_during/for_initializer_var_test.dart
@@ -6,6 +6,6 @@
Object b = 0;
for (int i = b; i < 1; i++) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'int'.
}
diff --git a/tests/language/implicit_downcast_during/function_literal_arrow_test.dart b/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
index 409ae5b..26f0836 100644
--- a/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
+++ b/tests/language/implicit_downcast_during/function_literal_arrow_test.dart
@@ -10,6 +10,6 @@
A a = new B();
B Function(A) f = (A a) => a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
// [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/function_literal_return_test.dart b/tests/language/implicit_downcast_during/function_literal_return_test.dart
index 1c7a056..7c9acba 100644
--- a/tests/language/implicit_downcast_during/function_literal_return_test.dart
+++ b/tests/language/implicit_downcast_during/function_literal_return_test.dart
@@ -11,7 +11,7 @@
B Function(A) f = (A a) {
return a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE_FROM_CLOSURE
// [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
};
}
diff --git a/tests/language/implicit_downcast_during/if_null_assignment_test.dart b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
index 09f1e97..7c91b32 100644
--- a/tests/language/implicit_downcast_during/if_null_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/if_null_assignment_test.dart
@@ -11,6 +11,6 @@
A? a = new B();
b ??= a;
// ^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A?' can't be assigned to a variable of type 'B?'.
}
diff --git a/tests/language/implicit_downcast_during/if_statement_test.dart b/tests/language/implicit_downcast_during/if_statement_test.dart
index fb46a9b..4389417 100644
--- a/tests/language/implicit_downcast_during/if_statement_test.dart
+++ b/tests/language/implicit_downcast_during/if_statement_test.dart
@@ -6,6 +6,6 @@
Object b = true;
if (b) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/indexed_assignment_test.dart b/tests/language/implicit_downcast_during/indexed_assignment_test.dart
index 65ae6a4..1f6493c 100644
--- a/tests/language/implicit_downcast_during/indexed_assignment_test.dart
+++ b/tests/language/implicit_downcast_during/indexed_assignment_test.dart
@@ -18,6 +18,6 @@
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/logical_expression_test.dart b/tests/language/implicit_downcast_during/logical_expression_test.dart
index 8e73fa1..123fe62 100644
--- a/tests/language/implicit_downcast_during/logical_expression_test.dart
+++ b/tests/language/implicit_downcast_during/logical_expression_test.dart
@@ -6,17 +6,17 @@
Object o = new Object();
o || o;
//^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
o && o;
//^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/not_test.dart b/tests/language/implicit_downcast_during/not_test.dart
index de8a43a..697e32b 100644
--- a/tests/language/implicit_downcast_during/not_test.dart
+++ b/tests/language/implicit_downcast_during/not_test.dart
@@ -6,6 +6,6 @@
Object b = true;
!b;
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/return_async_test.dart b/tests/language/implicit_downcast_during/return_async_test.dart
index 34d041e..b056db4 100644
--- a/tests/language/implicit_downcast_during/return_async_test.dart
+++ b/tests/language/implicit_downcast_during/return_async_test.dart
@@ -11,14 +11,14 @@
Future<B> f1(A a) async {
return a as FutureOr<A>;
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// ^
// [cfe] A value of type 'FutureOr<A>' can't be returned from an async function with return type 'Future<B>'.
}
Future<B> f2(A a) async => a as FutureOr<A>;
// ^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// ^
// [cfe] A value of type 'FutureOr<A>' can't be returned from an async function with return type 'Future<B>'.
diff --git a/tests/language/implicit_downcast_during/return_test.dart b/tests/language/implicit_downcast_during/return_test.dart
index e858dc4..4a56921 100644
--- a/tests/language/implicit_downcast_during/return_test.dart
+++ b/tests/language/implicit_downcast_during/return_test.dart
@@ -9,13 +9,13 @@
B f1(A a) {
return a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
}
B f2(A a) => a;
// ^
-// [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+// [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'A' can't be returned from a function with return type 'B'.
void main() {
diff --git a/tests/language/implicit_downcast_during/variable_declaration_test.dart b/tests/language/implicit_downcast_during/variable_declaration_test.dart
index a44f239..216250c 100644
--- a/tests/language/implicit_downcast_during/variable_declaration_test.dart
+++ b/tests/language/implicit_downcast_during/variable_declaration_test.dart
@@ -10,6 +10,6 @@
A a = new B();
B b = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/implicit_downcast_during/while_statement_test.dart b/tests/language/implicit_downcast_during/while_statement_test.dart
index 3aa386b..6e4bdc9 100644
--- a/tests/language/implicit_downcast_during/while_statement_test.dart
+++ b/tests/language/implicit_downcast_during/while_statement_test.dart
@@ -6,6 +6,6 @@
Object b = false;
while (b) {}
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
diff --git a/tests/language/implicit_downcast_during/yield_star_test.dart b/tests/language/implicit_downcast_during/yield_star_test.dart
index 990ec66..800b1c7 100644
--- a/tests/language/implicit_downcast_during/yield_star_test.dart
+++ b/tests/language/implicit_downcast_during/yield_star_test.dart
@@ -9,7 +9,7 @@
Iterable<B> f(Iterable<A> a) sync* {
yield* a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
// [cfe] A value of type 'Iterable<A>' can't be assigned to a variable of type 'Iterable<B>'.
}
diff --git a/tests/language/implicit_downcast_during/yield_test.dart b/tests/language/implicit_downcast_during/yield_test.dart
index 8f98bd2..874ad7f 100644
--- a/tests/language/implicit_downcast_during/yield_test.dart
+++ b/tests/language/implicit_downcast_during/yield_test.dart
@@ -9,7 +9,7 @@
Iterable<B> f(A a) sync* {
yield a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
// [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
}
diff --git a/tests/language/import/self_test.dart b/tests/language/import/self_test.dart
index 1feeb88..f724a60 100644
--- a/tests/language/import/self_test.dart
+++ b/tests/language/import/self_test.dart
@@ -18,6 +18,6 @@
main() {
p._x;
//^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: '_x'.
}
diff --git a/tests/language/inference/accessor_ref_test.dart b/tests/language/inference/accessor_ref_test.dart
index 9d12c5c..f443785 100644
--- a/tests/language/inference/accessor_ref_test.dart
+++ b/tests/language/inference/accessor_ref_test.dart
@@ -35,14 +35,14 @@
x = new E();
x = new B();
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C?'.
y = new C();
y = new E();
y = new B();
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
}
diff --git a/tests/language/inference/inconsistent_inheritance_test.dart b/tests/language/inference/inconsistent_inheritance_test.dart
index 79ba0fc..8ff26eb 100644
--- a/tests/language/inference/inconsistent_inheritance_test.dart
+++ b/tests/language/inference/inconsistent_inheritance_test.dart
@@ -16,7 +16,7 @@
Object y = x;
String z = x;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'String'.
}
}
diff --git a/tests/language/initializing_formal/type_test.dart b/tests/language/initializing_formal/type_test.dart
index 41a9f2a..b1f739d 100644
--- a/tests/language/initializing_formal/type_test.dart
+++ b/tests/language/initializing_formal/type_test.dart
@@ -10,7 +10,7 @@
A(int this.x) : y = x { // OK.
int z = x;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
}
}
diff --git a/tests/language/invalid_returns/async_invalid_return_26_test.dart b/tests/language/invalid_returns/async_invalid_return_26_test.dart
index 729e3dc..1fbc602 100644
--- a/tests/language/invalid_returns/async_invalid_return_26_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_26_test.dart
@@ -17,7 +17,7 @@
Future<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'void' can't be returned from an async function with return type 'Future<int>'.
}
diff --git a/tests/language/invalid_returns/async_invalid_return_27_test.dart b/tests/language/invalid_returns/async_invalid_return_27_test.dart
index 4650891..f3fb9f0 100644
--- a/tests/language/invalid_returns/async_invalid_return_27_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_27_test.dart
@@ -16,7 +16,7 @@
Future<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'Future<void>' can't be returned from an async function with return type 'Future<int>'.
}
diff --git a/tests/language/invalid_returns/async_invalid_return_28_test.dart b/tests/language/invalid_returns/async_invalid_return_28_test.dart
index dd02198..d6c195d 100644
--- a/tests/language/invalid_returns/async_invalid_return_28_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_28_test.dart
@@ -16,7 +16,7 @@
Future<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'FutureOr<void>' can't be returned from an async function with return type 'Future<int>'.
}
diff --git a/tests/language/invalid_returns/async_invalid_return_29_test.dart b/tests/language/invalid_returns/async_invalid_return_29_test.dart
index b2c96c0..9c92415 100644
--- a/tests/language/invalid_returns/async_invalid_return_29_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_29_test.dart
@@ -17,7 +17,7 @@
FutureOr<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'void' can't be returned from an async function with return type 'FutureOr<int>'.
}
diff --git a/tests/language/invalid_returns/async_invalid_return_30_test.dart b/tests/language/invalid_returns/async_invalid_return_30_test.dart
index b8e09b5..c97fd4f 100644
--- a/tests/language/invalid_returns/async_invalid_return_30_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_30_test.dart
@@ -16,7 +16,7 @@
FutureOr<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'Future<void>' can't be returned from an async function with return type 'FutureOr<int>'.
}
diff --git a/tests/language/invalid_returns/async_invalid_return_31_test.dart b/tests/language/invalid_returns/async_invalid_return_31_test.dart
index f35985b..2470925 100644
--- a/tests/language/invalid_returns/async_invalid_return_31_test.dart
+++ b/tests/language/invalid_returns/async_invalid_return_31_test.dart
@@ -16,7 +16,7 @@
FutureOr<int> test() async {
return v;
// ^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'FutureOr<void>' can't be returned from an async function with return type 'FutureOr<int>'.
}
diff --git a/tests/language/least_upper_bound/expansive_test.dart b/tests/language/least_upper_bound/expansive_test.dart
index 21663df..78276e5 100644
--- a/tests/language/least_upper_bound/expansive_test.dart
+++ b/tests/language/least_upper_bound/expansive_test.dart
@@ -42,37 +42,37 @@
// Is least upper bound dynamic?
(z ? a : b).z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'z' isn't defined for the class 'Object'.
// Is least upper bound N<...> ?
(z ? a : b).n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound C1<...> ?
(z ? a : b).c1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c1' isn't defined for the class 'Object'.
// Is least upper bound N<dynamic> ?
(z ? a : b).n.z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<N<...>> ?
(z ? a : b).n.n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<C1<...>> ?
(z ? a : b).n.c1;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
}
}
@@ -106,37 +106,37 @@
// Is least upper bound dynamic?
(z ? a : b).z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'z' isn't defined for the class 'Object'.
// Is least upper bound N<...> ?
(z ? a : b).n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound C2<...> ?
(z ? a : b).c2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c2' isn't defined for the class 'Object'.
// Is least upper bound N<dynamic> ?
(z ? a : b).n.z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<N<...>> ?
(z ? a : b).n.n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<C2<...>> ?
(z ? a : b).n.c2;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
}
}
diff --git a/tests/language/least_upper_bound/least_upper_bound_test.dart b/tests/language/least_upper_bound/least_upper_bound_test.dart
index eaf0697..562aca3 100644
--- a/tests/language/least_upper_bound/least_upper_bound_test.dart
+++ b/tests/language/least_upper_bound/least_upper_bound_test.dart
@@ -45,21 +45,21 @@
void testAB(A a, B b) {
A r1 = true ? a : b;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'A'.
B r2 = false ? a : b;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'B'.
(true ? a : b).a = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'a' isn't defined for the class 'Object'.
(false ? a : b).b = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'b' isn't defined for the class 'Object'.
var c = new C();
(true ? a as dynamic : c).a = 0;
@@ -70,13 +70,13 @@
B r1 = true ? b : c;
C r2 = false ? b : c;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
(true ? b : c).b = 0;
(false ? b : c).c = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'c' isn't defined for the class 'B'.
var a = null;
(true ? b : a).b = 0;
@@ -88,23 +88,23 @@
void testCD(C c, D d) {
C r1 = true ? c : d;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
D r2 = false ? c : d;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'D'.
(true ? c : d).b = 0;
(false ? c : d).b = 0;
(true ? c : d).c = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'c' isn't defined for the class 'B'.
(false ? c : d).d = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'd' isn't defined for the class 'B'.
}
@@ -113,17 +113,17 @@
E<B> r1 = true ? e : f;
F<C> r2 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'F<C>'.
A r3 = true ? e : f;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
B r4 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
(true ? e : f).e = C();
@@ -135,23 +135,23 @@
E<B> r1 = true ? e : f;
F<C> r2 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'F<C>'.
A r3 = true ? e : f;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
B r4 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
var r5;
r5 = (true ? e : f).e;
r5 = (false ? e : f).f;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'f' isn't defined for the class 'E<B>'.
}
diff --git a/tests/language/malformed/inheritance_test.dart b/tests/language/malformed/inheritance_test.dart
index 55154d7..8eed858 100644
--- a/tests/language/malformed/inheritance_test.dart
+++ b/tests/language/malformed/inheritance_test.dart
@@ -18,7 +18,7 @@
class C1
extends A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -36,7 +36,7 @@
class C3
extends Object with A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -52,7 +52,7 @@
class C5
implements A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -63,7 +63,7 @@
// [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -73,9 +73,9 @@
// [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -88,7 +88,7 @@
// [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -100,9 +100,9 @@
// [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -113,7 +113,7 @@
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -123,9 +123,9 @@
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
diff --git a/tests/language/malformed/malformed_test.dart b/tests/language/malformed/malformed_test.dart
index b8345e5..e4b59a9 100644
--- a/tests/language/malformed/malformed_test.dart
+++ b/tests/language/malformed/malformed_test.dart
@@ -29,25 +29,25 @@
checkIsListUnresolved(var v) {
v is List<Unresolved>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v is List<Unresolved<int>>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v is List<prefix.Unresolved>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v is List<prefix.Unresolved<int>>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v is List<int, String>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
@@ -75,25 +75,25 @@
checkAsListUnresolved(var v) {
v as List<Unresolved>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v as List<Unresolved<int>>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v as List<prefix.Unresolved>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v as List<prefix.Unresolved<int>>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v as List<int, String>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
diff --git a/tests/language/map/literal13_test.dart b/tests/language/map/literal13_test.dart
index ec5e0be..08f06e4 100644
--- a/tests/language/map/literal13_test.dart
+++ b/tests/language/map/literal13_test.dart
@@ -7,7 +7,7 @@
main() {
var map = new Map<int>{ "a": 1, "b": 2, "c": 3 };
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
// ^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/mixin/illegal_static_access_test.dart b/tests/language/mixin/illegal_static_access_test.dart
index 21e2348..8cd792d 100644
--- a/tests/language/mixin/illegal_static_access_test.dart
+++ b/tests/language/mixin/illegal_static_access_test.dart
@@ -20,10 +20,10 @@
Expect.throwsNoSuchMethodError(() => C.foo());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.foo'.
Expect.throwsNoSuchMethodError(() => C.bar());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.bar'.
}
diff --git a/tests/language/mixin/illegal_super_use_test.dart b/tests/language/mixin/illegal_super_use_test.dart
index 89c3a76..ca47645 100644
--- a/tests/language/mixin/illegal_super_use_test.dart
+++ b/tests/language/mixin/illegal_super_use_test.dart
@@ -11,22 +11,22 @@
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
void inner() {
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
}
inner();
@@ -35,11 +35,11 @@
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
})();
diff --git a/tests/language/mixin/type_parameters_errors_test.dart b/tests/language/mixin/type_parameters_errors_test.dart
index 2988b2f..25e99b6 100644
--- a/tests/language/mixin/type_parameters_errors_test.dart
+++ b/tests/language/mixin/type_parameters_errors_test.dart
@@ -11,11 +11,11 @@
// ^
// [cfe] The type 'M<U, V>' can't be mixed in.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
class C<A, B> extends S<A, int> with M { }
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
class F<X> = S<X> with M<X>;
@@ -23,7 +23,7 @@
// ^
// [cfe] The type 'M<double, double>' can't be mixed in.
// ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
main() {
@@ -32,11 +32,11 @@
a = new A<int>();
a = new A<String, String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
a = new F<int>();
a = new F<int, String>();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
diff --git a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
index 695dfa3..a0bdcf7 100644
--- a/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
+++ b/tests/language/nnbd/boolean_conversion/boolean_conversion_error_test.dart
@@ -56,141 +56,141 @@
// Check that values of type `Null` are not usable as booleans.
if (nil) {}
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
[if (nil) 3];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
nil ? 3 : 4;
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
while (nil) {}
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
do {} while (nil);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
nil || true;
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
nil && true;
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
true || nil;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
true && nil;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
for (int i = 0; nil; i++) {}
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
[for (int i = 0; nil; i++) 3];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'bool'.
}
{
// Check that values of type `Object` are not usable as booleans.
if (object) {}
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
[if (object) 3];
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
object ? 3 : 4;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
while (object) {}
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
do {} while (object);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
object || true;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
object && true;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
true || object;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
true && object;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
for (int i = 0; object; i++) {}
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
[for (int i = 0; object; i++) 3];
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object' can't be assigned to a variable of type 'bool'.
}
{
// Check that values of type `Object?` are not usable as booleans.
if (objectOrNull) {}
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
[if (objectOrNull) 3];
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
objectOrNull ? 3 : 4;
// ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
while (objectOrNull) {}
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
do {} while (objectOrNull);
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
objectOrNull || true;
// ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
objectOrNull && true;
// ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
true || objectOrNull;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
true && objectOrNull;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
for (int i = 0; objectOrNull; i++) {}
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
[for (int i = 0; objectOrNull; i++) 3];
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// [cfe] A value of type 'Object?' can't be assigned to a variable of type 'bool'.
}
}
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart
new file mode 100644
index 0000000..2efea2d
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_in_order_error_test.dart
@@ -0,0 +1,332 @@
+// 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.
+
+// Requirements=nnbd-weak
+
+// @dart = 2.8
+
+// Test that upper bound computations which rely on the computations of the
+// cardinality of the superinterface sets define those sets using
+// `LEGACY_ERASURE` when called from an opted out library.
+
+import 'superinterfaces_null_safe_lib.dart';
+import 'superinterfaces_legacy_lib.dart';
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Legacy()` and `NonNullable()` should
+/// be computed as `Generic<int*>`.
+void testLegacyNonNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? Legacy() : NonNullable();
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? Legacy() : NonNullable())..genericMethod();
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? Legacy() : NonNullable())..legacyMethod();
+ // ^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? Legacy() : NonNullable())..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? Legacy() : NonNullable();
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? legacy : nonNullable;
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? legacy : nonNullable)..genericMethod();
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? legacy : nonNullable)..legacyMethod();
+ // ^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? legacy : nonNullable)..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? legacy : nonNullable;
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+}
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Legacy()` and `Nullable()` should
+/// be computed as `Generic<int*>`.
+void testLegacyNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? Legacy() : Nullable();
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? Legacy() : Nullable())..genericMethod();
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? Legacy() : Nullable())..legacyMethod();
+ // ^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as Nullable, nor dynamic
+ Generic<int> x3 = (b ? Legacy() : Nullable())..nullableMethod();
+ // ^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? Legacy() : Nullable();
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? legacy : nullable;
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? legacy : nullable)..genericMethod();
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? legacy : nullable)..legacyMethod();
+ // ^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as Nullable, nor dynamic
+ Generic<int> x3 = (b ? legacy : nullable)..nullableMethod();
+ // ^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? legacy : nullable;
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+}
+
+/// Test that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int*>}, {Root} (due to LEGACY_ERASURE)
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Generic<int*>}.
+/// As a result, the upper bound of `Nullable()` and `NonNullable()` should
+/// be computed as `Generic<int*>`.
+void testNullableNonNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? Nullable() : NonNullable();
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? Nullable() : NonNullable())..genericMethod();
+
+ // The type of the conditional not inferred as Nullable, nor dynamic
+ Generic<int> x2 = (b ? Nullable() : NonNullable())..nullableMethod();
+ // ^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? Nullable() : NonNullable())..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? Nullable() : NonNullable();
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ Generic<int> x0 = b ? nullable : nonNullable;
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? nullable : nonNullable)..genericMethod();
+
+ // The type of the conditional not inferred as Nullable, nor dynamic
+ Generic<int> x2 = (b ? nullable : nonNullable)..nullableMethod();
+ // ^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? nullable : nonNullable)..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+
+ // Test without a context
+ {
+ var x = b ? nullable : nonNullable;
+
+ // x is inferred to be Generic<int>
+ x.genericMethod().isEven;
+
+ // x is not inferred to be Generic<dynamic>
+ x.genericMethod().isVeryOdd;
+ // ^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] unspecified
+ // [cfe] unspecified
+ }
+}
+
+void main() {
+ testLegacyNonNullable(true);
+ testLegacyNullable(true);
+ testNullableNonNullable(true);
+}
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart
new file mode 100644
index 0000000..7372893
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_legacy_lib.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// @dart = 2.8
+
+// This library creates a legacy class which extends the generic class hierarchy
+// defined in the imported library. This is used to test how upper bounds
+// behave when some super-interfaces come from opted in libraries and some from
+// legacy libraries.
+
+import 'superinterfaces_null_safe_lib.dart';
+
+class Legacy extends Generic<int> {
+ int legacyMethod() => 3;
+}
+
+var legacy = Legacy();
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
new file mode 100644
index 0000000..93e4ad2
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_null_safe_lib.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// @dart = 2.10
+
+// This library establishes an opted in class hierarchy which has a single
+// non-generic top element, with a generic element below it, and a null safety
+// specific instantantiation of the generic below that. This is used to test
+// how upper bounds behave when some super-interfaces come from opted in
+// libraries and some from legacy libraries.
+
+class Root {
+ Object? rootMethod() => 3;
+}
+
+class Generic<T> extends Root {
+ T genericMethod() => throw "Unreachable";
+}
+
+class NonNullable extends Generic<int> {
+ int nonNullableMethod() => 3;
+}
+
+class Nullable extends Generic<int?> {
+ int nullableMethod() => 3;
+}
+
+var nonNullable = NonNullable();
+var nullable = Nullable();
diff --git a/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
new file mode 100644
index 0000000..50e53c2
--- /dev/null
+++ b/tests/language/nnbd/extreme_bounds/superinterfaces_out_of_order_error_test.dart
@@ -0,0 +1,455 @@
+// 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.
+
+// Requirements=nnbd-weak
+
+// @dart = 2.10
+
+// Test that upper bound computations which rely on the computations of the
+// cardinality of the superinterface sets define those sets without erasing or
+// modifying the superinterfaces.
+
+import 'superinterfaces_legacy_lib.dart';
+import 'superinterfaces_null_safe_lib.dart';
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Legacy()` and `NonNullable()` should
+/// be computed as `Root`.
+void testLegacyNonNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? Legacy() : NonNullable();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is not inferred as Generic
+ Generic<int> x1 = (b ? Legacy() : NonNullable())..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? Legacy() : NonNullable())..legacyMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? Legacy() : NonNullable())..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test without a context
+ {
+ var x = b ? Legacy() : NonNullable();
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? legacy : nonNullable;
+ // ^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is not inferred as Generic
+ Generic<int> x1 = (b ? legacy : nonNullable)..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? legacy : nonNullable)..legacyMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? legacy : nonNullable)..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+ }
+
+ // Test without a context
+ {
+ var x = b ? legacy : nonNullable;
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+ }
+}
+
+/// Test that `Legacy()` has the super-interface sets:
+/// {Legacy}, {Generic<int*>}, {Root}
+/// and that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int?>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Legacy()` and `Nullable()` should
+/// be computed as `Root`.
+void testLegacyNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? Legacy() : Nullable();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is not inferred as Generic
+ Generic<int> x1 = (b ? Legacy() : Nullable())..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? Legacy() : Nullable())..legacyMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as Nullable, nor dynamic
+ Generic<int> x3 = (b ? Legacy() : Nullable())..nullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test without a context
+ {
+ var x = b ? Legacy() : Nullable();
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? legacy : nullable;
+ // ^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is not inferred as Generic
+ Generic<int> x1 = (b ? legacy : nullable)..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Legacy, nor dynamic
+ Generic<int> x2 = (b ? legacy : nullable)..legacyMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as Nullable, nor dynamic
+ Generic<int> x3 = (b ? legacy : nullable)..nullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test without a context
+ {
+ var x = b ? legacy : nullable;
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Legacy, nor dynamic
+ x.legacyMethod();
+ //^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'legacyMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+ }
+}
+
+/// Test that `Nullable()` has the super-interface sets:
+/// {Nullable}, {Generic<int?>}, {Root}
+/// and that `NonNullable()` has the super-interface sets:
+/// {NonNullable}, {Generic<int>}, {Root}
+/// And hence that the highest shared super-interface set of cardinality one
+/// is {Root}.
+/// As a result, the upper bound of `Nullable()` and `NonNullable()` should
+/// be computed as `Root`.
+void testNullableNonNullable(bool b) {
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? Nullable() : NonNullable();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? Nullable() : NonNullable())..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Nullable, nor dynamic
+ Generic<int> x2 = (b ? Nullable() : NonNullable())..nullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? Nullable() : NonNullable())..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+ }
+
+ // Test without a context
+ {
+ var x = b ? Nullable() : NonNullable();
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic, nor dynamic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+ }
+
+ // Test using instances
+
+ // Test in the presence of a downward context
+ {
+ // The type of the conditional is not Generic
+ Generic<int> x0 = b ? nullable : nonNullable;
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+
+ // The type of the conditional is Generic<int>
+ Generic<int> x1 = (b ? nullable : nonNullable)..genericMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional not inferred as Nullable, nor dynamic
+ Generic<int> x2 = (b ? nullable : nonNullable)..nullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+ // The type of the conditional is not inferred as NonNullable, nor dynamic
+ Generic<int> x3 = (b ? nullable : nonNullable)..nonNullableMethod();
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
+ // ^
+ // [cfe] A value of type 'Root' can't be assigned to a variable of type 'Generic<int>'.
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+
+ }
+
+ // Test without a context
+ {
+ var x = b ? nullable : nonNullable;
+
+ // x is inferred to be Root
+ x.rootMethod();
+
+ // x is not inferred to be Generic, nor dynamic
+ x.genericMethod();
+ //^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'genericMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as Nullable, nor dynamic
+ x.nullableMethod();
+ //^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nullableMethod' isn't defined for the class 'Root'.
+
+ // x is not inferred as NonNullable, nor dynamic
+ x.nonNullableMethod();
+ //^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
+ // [cfe] The method 'nonNullableMethod' isn't defined for the class 'Root'.
+ }
+}
+
+void main() {
+ testLegacyNonNullable(true);
+ testLegacyNullable(true);
+ testNullableNonNullable(true);
+}
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
index fe6c7db..c7aaf26 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_getter_get_error_test.dart
@@ -21,7 +21,7 @@
// to `int`.
x.isEven;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] unspecified
}
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
index e5b9c32..8cd5ce7 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_invocation_error_test.dart
@@ -21,7 +21,7 @@
// promoted to `int`.
x.isEven;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] unspecified
}
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
index b76136c..4687597 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_promotion_error_test.dart
@@ -18,7 +18,7 @@
// Since the `y is Never?` branch was reachable, `x` is not promoted to `int`.
x.isEven;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] unspecified
}
diff --git a/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart b/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
index 2f7e690..aa97c73 100644
--- a/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/unreachable_via_variable_get_error_test.dart
@@ -19,7 +19,7 @@
// Since the read of `y` was reachable, `x` is not promoted to `int`.
x.isEven;
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] unspecified
}
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
index bd76d00..7fd85a5 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_closure_error_test.dart
@@ -15,7 +15,7 @@
// an int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
};
@@ -31,7 +31,7 @@
// an int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
}
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
index 646649d..9df5cad 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_loop_error_test.dart
@@ -14,7 +14,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
}
}
@@ -29,7 +29,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
}
}
@@ -44,7 +44,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
}
@@ -60,7 +60,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
}
@@ -76,7 +76,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
}
}
@@ -91,7 +91,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
}
@@ -107,7 +107,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
} while ((x = 0) == 0);
}
@@ -122,7 +122,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
} while (true);
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
index 9d96b15..ee60537 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_switch_error_test.dart
@@ -19,7 +19,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
break;
@@ -40,7 +40,7 @@
// int at the time de-promotion occurs.
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
x = 0;
break;
diff --git a/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart b/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
index 8f89bdf..6368e1d 100644
--- a/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
+++ b/tests/language/nnbd/flow_analysis/write_promoted_value_in_try_error_test.dart
@@ -18,7 +18,7 @@
// account for RHS types)
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
}
}
@@ -36,7 +36,7 @@
// account for RHS types)
print(x.isEven);
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'isEven' isn't defined for the class 'Object'.
}
}
diff --git a/tests/language/nnbd/is_type_test/null_is_test.dart b/tests/language/nnbd/is_type_test/null_is_test.dart
new file mode 100644
index 0000000..d3a9f22
--- /dev/null
+++ b/tests/language/nnbd/is_type_test/null_is_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+// Type tests (is checks) located in a null safe library.
+main() {
+ Expect.isFalse(null is Never);
+ Expect.isTrue(null is Never?);
+ Expect.isTrue(null is Null);
+ Expect.isFalse(null is Object);
+ Expect.isTrue(null is Object?);
+ Expect.isTrue(null is dynamic);
+
+ // Testing all built in types because of a regression that caused them to be
+ // handled differently https://github.com/dart-lang/sdk/issues/42851.
+ Expect.isFalse(null is bool);
+ Expect.isTrue(null is bool?);
+ Expect.isFalse(null is num);
+ Expect.isTrue(null is num?);
+ Expect.isFalse(null is int);
+ Expect.isTrue(null is int?);
+ Expect.isFalse(null is double);
+ Expect.isTrue(null is double?);
+ Expect.isFalse(null is String);
+ Expect.isTrue(null is String?);
+ Expect.isFalse(null is List);
+ Expect.isTrue(null is List?);
+ Expect.isFalse(null is Set);
+ Expect.isTrue(null is Set?);
+ Expect.isFalse(null is Map);
+ Expect.isTrue(null is Map?);
+ Expect.isFalse(null is Symbol);
+ Expect.isTrue(null is Symbol?);
+}
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
index ddf79bd..9a92566 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_legacy_lib_test.dart
@@ -18,13 +18,48 @@
// `null is Never?`
Expect.isTrue(legacyIsNullable<Never>(null));
Expect.isTrue(null is Null);
- // `null is int*`
- Expect.isFalse(null is int);
- // `null is int?`
- Expect.isTrue(legacyIsNullable<int>(null));
// `null is Object*`
Expect.isTrue(null is Object);
// `null is Object?`
Expect.isTrue(legacyIsNullable<Object>(null));
Expect.isTrue(null is dynamic);
+
+ // Testing all built in types because of a regression that caused them to be
+ // handled differently https://github.com/dart-lang/sdk/issues/42851.
+ // `null is bool*`
+ Expect.isFalse(null is bool);
+ // `null is bool?`
+ Expect.isTrue(legacyIsNullable<bool>(null));
+ // `null is num*`
+ Expect.isFalse(null is num);
+ // `null is num?`
+ Expect.isTrue(legacyIsNullable<num>(null));
+ // `null is int*`
+ Expect.isFalse(null is int);
+ // `null is int?`
+ Expect.isTrue(legacyIsNullable<int>(null));
+ // `null is double*`
+ Expect.isFalse(null is double);
+ // `null is double?`
+ Expect.isTrue(legacyIsNullable<double>(null));
+ // `null is String*`
+ Expect.isFalse(null is String);
+ // `null is String?`
+ Expect.isTrue(legacyIsNullable<String>(null));
+ // `null is List*`
+ Expect.isFalse(null is List);
+ // `null is List?
+ Expect.isTrue(legacyIsNullable<List>(null));
+ // `null is Set*`
+ Expect.isFalse(null is Set);
+ // `null is Set?
+ Expect.isTrue(legacyIsNullable<Set>(null));
+ // `null is Map*`
+ Expect.isFalse(null is Map);
+ // `null is Map?
+ Expect.isTrue(legacyIsNullable<Map>(null));
+ // `null is Symbol*`
+ Expect.isFalse(null is Symbol);
+ // `null is Symbol?
+ Expect.isTrue(legacyIsNullable<Symbol>(null));
}
diff --git a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
index 3721c69..a126342 100644
--- a/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
+++ b/tests/language/nnbd/is_type_test/null_is_type_in_null_safe_lib_test.dart
@@ -15,13 +15,48 @@
Expect.isTrue(nullSafeIsLegacy<Never>(null));
Expect.isTrue(null is Never?);
Expect.isTrue(null is Null);
- Expect.isFalse(null is int);
- // `null is int*`
- Expect.isFalse(nullSafeIsLegacy<int>(null));
- Expect.isTrue(null is int?);
Expect.isFalse(null is Object);
// `null is Object*`
Expect.isTrue(nullSafeIsLegacy<Object>(null));
Expect.isTrue(null is Object?);
Expect.isTrue(null is dynamic);
+
+ // Testing all built in types because of a regression that caused them to be
+ // handled differently https://github.com/dart-lang/sdk/issues/42851.
+ Expect.isFalse(null is bool);
+ // `null is bool*`
+ Expect.isFalse(nullSafeIsLegacy<bool>(null));
+ Expect.isTrue(null is bool?);
+ Expect.isFalse(null is num);
+ // `null is num*`
+ Expect.isFalse(nullSafeIsLegacy<num>(null));
+ Expect.isTrue(null is num?);
+ Expect.isFalse(null is int);
+ // `null is int*`
+ Expect.isFalse(nullSafeIsLegacy<int>(null));
+ Expect.isTrue(null is int?);
+ Expect.isFalse(null is double);
+ // `null is double*`
+ Expect.isFalse(nullSafeIsLegacy<double>(null));
+ Expect.isTrue(null is double?);
+ Expect.isFalse(null is String);
+ // `null is String*`
+ Expect.isFalse(nullSafeIsLegacy<String>(null));
+ Expect.isTrue(null is String?);
+ Expect.isFalse(null is List);
+ // `null is List*`
+ Expect.isFalse(nullSafeIsLegacy<List>(null));
+ Expect.isTrue(null is List?);
+ Expect.isFalse(null is Set);
+ // `null is Set*`
+ Expect.isFalse(nullSafeIsLegacy<Set>(null));
+ Expect.isTrue(null is Set?);
+ Expect.isFalse(null is Map);
+ // `null is Map*`
+ Expect.isFalse(nullSafeIsLegacy<Map>(null));
+ Expect.isTrue(null is Map?);
+ Expect.isFalse(null is Symbol);
+ // `null is Symbol*`
+ Expect.isFalse(nullSafeIsLegacy<Symbol>(null));
+ Expect.isTrue(null is Symbol?);
}
diff --git a/tests/language/nnbd/static_errors/local_function_inference.dart b/tests/language/nnbd/static_errors/local_function_inference.dart
index 9cb6a37..af81145 100644
--- a/tests/language/nnbd/static_errors/local_function_inference.dart
+++ b/tests/language/nnbd/static_errors/local_function_inference.dart
@@ -12,7 +12,7 @@
f().arglebargle;
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
f().isEven; // Inferred type is int
diff --git a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
index 2229199..d06b113 100644
--- a/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
+++ b/tests/language/nnbd/syntax/class_member_declarations_error_test.dart
@@ -31,7 +31,7 @@
// [analyzer] SYNTACTIC_ERROR.MODIFIER_OUT_OF_ORDER
// [cfe] The modifier 'late' should be before the modifier 'final'.
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
covariant late x15;
// ^^^^
diff --git a/tests/language/nnbd/try_catch/default_catch_type_error_test.dart b/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
index 73b3b94..03017a6 100644
--- a/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
+++ b/tests/language/nnbd/try_catch/default_catch_type_error_test.dart
@@ -6,7 +6,7 @@
try {} catch (error) {
error.notAMethodOnObject();
// ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'notAMethodOnObject' isn't defined for the class 'Object'.
_takesObject(error);
}
diff --git a/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart b/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
index d54b522..0906219 100644
--- a/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
+++ b/tests/language/nnbd/type_promotion/downwards_inference_error_test.dart
@@ -40,18 +40,18 @@
// x still has type C<String>
x.dMethod1("hello");
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
x.dMethod2(3);
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
var t0 = x.cMethod("hello");
t0.length;
t0.arglebargle; // t0 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
// y has type D<String, int>
@@ -59,13 +59,13 @@
t1.length;
t1.arglebargle; // t1 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
var t2 = y.dMethod2(3);
t2.isEven;
t2.arglebargle; // t2 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
}
@@ -83,13 +83,13 @@
t0.length;
t0.arglebargle; // t0 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
var t1 = x.dMethod2(3);
t1.isEven;
t1.arglebargle; // t1 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
// y has type D<String, int>
@@ -97,13 +97,13 @@
t2.length;
t2.arglebargle; // t2 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
var t3 = y.dMethod2(3);
t3.isEven;
t3.arglebargle; // t3 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'int'.
}
@@ -118,34 +118,34 @@
// x has type C<String>, and not D<String, int>
x.dMethod1("hello");
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
x.dMethod2(3);
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
var t0 = x.cMethod("hello");
t0.length;
t0.arglebargle; // t0 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
// C<String>, and not D<String, int>
y.dMethod1("hello");
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod1' isn't defined for the class 'C<String>'.
y.dMethod2(3);
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'dMethod2' isn't defined for the class 'C<String>'.
var t1 = y.cMethod("hello");
t1.length;
t1.arglebargle; // t0 is not dynamic
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'arglebargle' isn't defined for the class 'String'.
}
}
diff --git a/tests/language/nnbd/typedef/typedef_error_test.dart b/tests/language/nnbd/typedef/typedef_error_test.dart
index f1bed37..17488a5 100644
--- a/tests/language/nnbd/typedef/typedef_error_test.dart
+++ b/tests/language/nnbd/typedef/typedef_error_test.dart
@@ -13,7 +13,7 @@
void main() {
F f = null; // typedefs from opted out libraries are treated as non-nullable
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Null' can't be assigned to a variable of type 'int Function(int)'.
f = takesNonNullable; // F is int* Function(int*)
diff --git a/tests/language/null/checked_null_test.dart b/tests/language/null/checked_null_test.dart
index b4fa1f2..9d57242 100644
--- a/tests/language/null/checked_null_test.dart
+++ b/tests/language/null/checked_null_test.dart
@@ -25,6 +25,6 @@
// crash.
new A().a?.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'foo' isn't defined for the class 'Map<dynamic, dynamic>'.
}
diff --git a/tests/language/null_aware/access_test.dart b/tests/language/null_aware/access_test.dart
index deaa991..4ee967e 100644
--- a/tests/language/null_aware/access_test.dart
+++ b/tests/language/null_aware/access_test.dart
@@ -39,7 +39,7 @@
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
{ String? s = new C(null)?.v; Expect.equals(null, s); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
// ^^
@@ -48,12 +48,12 @@
{ h.C.staticInt = 1; int? i = h.C?.staticInt; Expect.equals(1, i); }
{ C.staticInt = null; String? s = C?.staticInt; Expect.equals(null, s); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
{ h.C.staticNullable = null; String? s = h.C?.staticNullable; Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
@@ -62,11 +62,11 @@
// generated in the case of e1?.id.
Expect.equals(null, nullC()?.bad);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'bad' isn't defined for the class 'C'.
{ B? b = new C(1); Expect.equals(1, b?.v); }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'v' isn't defined for the class 'B'.
// '?.' cannot be used to access toplevel properties in libraries imported via
@@ -79,10 +79,10 @@
// Nor can it be used to access the hashCode getter on the class Type.
Expect.throwsNoSuchMethodError(() => C?.hashCode);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'hashCode'.
Expect.throwsNoSuchMethodError(() => h.C?.hashCode);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'hashCode'.
}
diff --git a/tests/language/null_aware/assignment_test.dart b/tests/language/null_aware/assignment_test.dart
index 3627427..79f566c 100644
--- a/tests/language/null_aware/assignment_test.dart
+++ b/tests/language/null_aware/assignment_test.dart
@@ -59,20 +59,20 @@
// The static type of e1?.v = e2 is the static type of e2.
{ D? d = new D(new E()); G g = new G(); F? f = (d?.v = g); Expect.identical(f, g); }
{ D? d = new D(new E()); E e = new G(); F? f = (d?.v = e); }
- // ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ D.staticE = new E(); G g = new G(); F? f = (D?.staticE = g); Expect.identical(f, g); }
{ h.D.staticE = new h.E(); h.G g = new h.G(); h.F? f = (h.D?.staticE = g); Expect.identical(f, g); }
{ D.staticE = new E(); E e = new G(); F? f = (D?.staticE = e); }
- // ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
{ h.D.staticE = new h.E(); h.E e = new h.G(); h.F f = (h.D?.staticE = e); }
- // ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
@@ -80,13 +80,13 @@
// also generated in the case of e1?.v = e2.
Expect.equals(null, nullC()?.bad = bad());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'bad' isn't defined for the class 'C'.
{ B b = new C(1); Expect.equals(2, b?.v = 2); }
// ^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'v' isn't defined for the class 'B'.
// e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
@@ -110,16 +110,16 @@
// also generated in the case of e1?.v op= e2.
nullC()?.bad = bad();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'bad' isn't defined for the class 'C'.
{ B b = new C(1); b?.v += 2; }
// ^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'v' isn't defined for the class 'B'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'v' isn't defined for the class 'B'.
{ D d = new D(new E()); F? f = (d?.v += nullC()); }
// ^^
@@ -128,8 +128,8 @@
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
{ D d = new D(new E()); H? h = (d?.v += 1); }
- // ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
// ^^
@@ -143,13 +143,13 @@
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'C?' can't be assigned to a variable of type 'int'.
{ D.staticE = new E(); H? h = (D?.staticE += 1); }
- // ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
{ h.D.staticE = new h.E(); h.H? hh = (h.D?.staticE += 1); }
- // ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
diff --git a/tests/language/null_aware/increment_decrement_test.dart b/tests/language/null_aware/increment_decrement_test.dart
index 1a5ea4e..0b620fc 100644
--- a/tests/language/null_aware/increment_decrement_test.dart
+++ b/tests/language/null_aware/increment_decrement_test.dart
@@ -52,18 +52,18 @@
{ E e1 = new E(); D? d = new D(e1); E? e2 = d?.v++; Expect.identical(e1, e2); }
{ G g = new G(); D? d = new D(g); F? f = d?.v++; Expect.identical(f, g); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE++; Expect.identical(e1, e2); }
{ h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE++; Expect.identical(e1, e2); }
{ G g = new G(); D.staticE = g; F? f = D?.staticE++; Expect.identical(f, g); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
{ h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE++; Expect.identical(f, g); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
@@ -79,18 +79,18 @@
{ E e1 = new E(); D? d = new D(e1); E? e2 = d?.v--; Expect.identical(e1, e2); }
{ G g = new G(); D? d = new D(g); F? f = d?.v--; Expect.identical(f, g); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E?' can't be assigned to a variable of type 'F?'.
{ E e1 = new E(); D.staticE = e1; E? e2 = D?.staticE--; Expect.identical(e1, e2); }
{ h.E e1 = new h.E(); h.D.staticE = e1; h.E? e2 = h.D?.staticE--; Expect.identical(e1, e2); }
{ G g = new G(); D.staticE = g; F? f = D?.staticE--; Expect.identical(f, g); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
{ h.G g = new h.G(); h.D.staticE = g; h.F? f = h.D?.staticE--; Expect.identical(f, g); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F?'.
@@ -106,19 +106,19 @@
{ D? d = new D(new E()); F? f = ++d?.v; Expect.identical(d!.v, f); }
{ D? d = new D(new E()); H? h = ++d?.v; Expect.identical(d!.v, h); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
{ D.staticE = new E(); F? f = ++D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F? f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
{ D.staticE = new E(); H? h = ++D?.staticE; Expect.identical(D.staticE, h); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
{ h.D.staticE = new h.E(); h.H? hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
@@ -134,19 +134,19 @@
{ D? d = new D(new E()); F? f = --d?.v; Expect.identical(d!.v, f); }
{ D? d = new D(new E()); H? h = --d?.v; Expect.identical(d!.v, h); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G?' can't be assigned to a variable of type 'H?'.
{ D.staticE = new E(); F? f = --D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F? f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
{ D.staticE = new E(); H? h = --D?.staticE; Expect.identical(D.staticE, h); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
{ h.D.staticE = new h.E(); h.H? hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H?'.
}
diff --git a/tests/language/null_aware/invocation_test.dart b/tests/language/null_aware/invocation_test.dart
index 58f788b..a1515fa 100644
--- a/tests/language/null_aware/invocation_test.dart
+++ b/tests/language/null_aware/invocation_test.dart
@@ -43,23 +43,23 @@
{ int? i = c?.g(() => 1); Expect.equals(1, i); }
{ String? s = nullC()?.g(bad()); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
{ String? s = c?.g(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
{ int? i = C?.staticG(() => 1); Expect.equals(1, i); }
{ int? i = h.C?.staticG(() => 1); Expect.equals(1, i); }
{ String? s = C?.staticG(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
{ String? s = h.C?.staticG(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int?' can't be assigned to a variable of type 'String?'.
@@ -68,7 +68,7 @@
// generated in the case of o?.m(...).
{ B? b = new C(); Expect.equals(1, b?.f(() => 1)); }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'f' isn't defined for the class 'B'.
{ int? i = 1; Expect.equals(null, nullC()?.f(i)); }
// ^
@@ -85,10 +85,10 @@
// Nor can it be used to access the toString method on the class Type.
Expect.throwsNoSuchMethodError(() => C?.toString());
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.toString'.
Expect.throwsNoSuchMethodError(() => h.C?.toString());
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.toString'.
}
diff --git a/tests/language/number/identifier_test.dart b/tests/language/number/identifier_test.dart
index 7b575c5..d66bf6b 100644
--- a/tests/language/number/identifier_test.dart
+++ b/tests/language/number/identifier_test.dart
@@ -68,7 +68,7 @@
Expect.equals(1e+2, 1e+2 as double);
Expect.throwsNoSuchMethodError(() => 1.e+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e' isn't defined for the class 'int'.
1d;
//^
@@ -86,11 +86,11 @@
// [cfe] Getter not found: 'D'.
Expect.throwsNoSuchMethodError(() => 1.d+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'int'.
Expect.throwsNoSuchMethodError(() => 1.D+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'D' isn't defined for the class 'int'.
1.1d;
//^^^
diff --git a/tests/language/operator/number_operator_error_test.dart b/tests/language/operator/number_operator_error_test.dart
index fd2ea6e..90e4cf0 100644
--- a/tests/language/operator/number_operator_error_test.dart
+++ b/tests/language/operator/number_operator_error_test.dart
@@ -35,115 +35,115 @@
i += d;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
//^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'int'.
i += n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
//^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
i += never;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
//^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
i += dyn; // type of `i + dyn` is `num`, not assignable to `int`.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
//^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'int'.
ti += i; // Type of expression is `int`, not `I`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'I'.
ti += d; // Type of expression is `num`, not `I`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'I'.
ti += n; // Type of expression is `num`, not `I`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
ti += never; // Type of expression is `num`, not `I`.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
ti += dyn; // type of `i + dyn` is `num`, not assignable to `int`.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'I'.
td += i; // Type of expression is `double`, not `D`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
td += d; // Type of expression is `double`, not `D`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
td += n; // Type of expression is `double`, not `D`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
td += dyn; // Type of expression is `double`, not `D`.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
td += never; // Type of expression is `double`, not `D`.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'D'.
tn += i; // Type of expression is `num`, not `N`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
tn += d; // Type of expression is `num`, not `N`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
tn += n; // Type of expression is `num`, not `N`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
tn += dyn; // Type of expression is `num`, not `N`.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
tn += never; // Type of expression is `num`, not `N`.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
@@ -153,7 +153,7 @@
oi1 + d; // Valid
oi1 += d;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'double' can't be assigned to a variable of type 'O'.
}
@@ -164,7 +164,7 @@
oi2 + n; // Valid
oi2 += n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
}
@@ -175,7 +175,7 @@
oi3 + dyn; // Valid
oi3 += dyn;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
}
@@ -186,7 +186,7 @@
oi4 + never; // Valid.
oi4 += never;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
}
@@ -211,13 +211,13 @@
tn += n; // Type of expression is `num`, not `N`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
tn += dyn;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'N'.
@@ -226,7 +226,7 @@
// Promote on1 to O&num.
on1 += n; // Type of expression is `num`, not `N` or `O`.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
}
@@ -236,7 +236,7 @@
// Promote on2 to O&num.
on2 += dyn; // Type of expression is `num`, not `N` or `O`.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^
// [cfe] A value of type 'num' can't be assigned to a variable of type 'O'.
}
diff --git a/tests/language/override/method_with_field_test.dart b/tests/language/override/method_with_field_test.dart
index edd17fd..7d31ba2 100644
--- a/tests/language/override/method_with_field_test.dart
+++ b/tests/language/override/method_with_field_test.dart
@@ -31,7 +31,7 @@
Expect.equals(42, s.superInstanceMethod());
Expect.equals(42, sup.superInstanceMethod());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'superInstanceMethod' isn't defined for the class 'Super'.
Expect.equals(42, sub.superInstanceMethod());
}
diff --git a/tests/language/prefix/shadow_test.dart b/tests/language/prefix/shadow_test.dart
index 1680b1e..1af4c58 100644
--- a/tests/language/prefix/shadow_test.dart
+++ b/tests/language/prefix/shadow_test.dart
@@ -27,7 +27,7 @@
var result = 0;
result = lib10.Library10.static_fld;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'Library10' isn't defined for the class 'int'.
Expect.equals(4, result);
}
diff --git a/tests/language/prefix/transitive_import_test.dart b/tests/language/prefix/transitive_import_test.dart
index 582b3e2..ef53584 100644
--- a/tests/language/prefix/transitive_import_test.dart
+++ b/tests/language/prefix/transitive_import_test.dart
@@ -16,6 +16,6 @@
// Variable should not be visible.
lib12.top_level11;
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: 'top_level11'.
}
diff --git a/tests/language/private/access_test.dart b/tests/language/private/access_test.dart
index cbfef18..6e10558 100644
--- a/tests/language/private/access_test.dart
+++ b/tests/language/private/access_test.dart
@@ -10,13 +10,13 @@
main() {
_function();
//^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: '_function'.
private._function();
//^
// [cfe] Method not found: '_function'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
new _Class();
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
@@ -25,7 +25,7 @@
//^
// [cfe] Method not found: '_Class'.
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
new Class._constructor();
// ^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
diff --git a/tests/language/private/member3_test.dart b/tests/language/private/member3_test.dart
index eba3211..557a9e6 100644
--- a/tests/language/private/member3_test.dart
+++ b/tests/language/private/member3_test.dart
@@ -10,7 +10,7 @@
test() {
_fun();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method '_fun' isn't defined for the class 'Test'.
}
}
diff --git a/tests/language/regress/regress11724_test.dart b/tests/language/regress/regress11724_test.dart
index ddf3925..a408da1 100644
--- a/tests/language/regress/regress11724_test.dart
+++ b/tests/language/regress/regress11724_test.dart
@@ -7,6 +7,6 @@
void main() {
method(<int>[]);
//^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: 'method'.
}
diff --git a/tests/language/regress/regress1363_test.dart b/tests/language/regress/regress1363_test.dart
index a6cab7b..812e571 100644
--- a/tests/language/regress/regress1363_test.dart
+++ b/tests/language/regress/regress1363_test.dart
@@ -24,7 +24,7 @@
C contents = myCup.getContents(); // expect no warning or error
contents = libCup.getContents();
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C/*1*/' can't be assigned to a variable of type 'C/*2*/'.
}
diff --git a/tests/language/regress/regress18628_1_test.dart b/tests/language/regress/regress18628_1_test.dart
index 3f2bef3..214f9aa 100644
--- a/tests/language/regress/regress18628_1_test.dart
+++ b/tests/language/regress/regress18628_1_test.dart
@@ -13,7 +13,7 @@
// line just doesn't make sense without this line.
T t = int;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Type' can't be assigned to a variable of type 'T'.
}
diff --git a/tests/language/regress/regress21912_test.dart b/tests/language/regress/regress21912_test.dart
index 6ba343ca5..7d261d3 100644
--- a/tests/language/regress/regress21912_test.dart
+++ b/tests/language/regress/regress21912_test.dart
@@ -19,11 +19,11 @@
Function2<Function2<int, double>, Function2<int, double>> left) {
left = t1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
left = t2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
}
}
diff --git a/tests/language/regress/regress22976_test.dart b/tests/language/regress/regress22976_test.dart
index 63180f8..de83e9b 100644
--- a/tests/language/regress/regress22976_test.dart
+++ b/tests/language/regress/regress22976_test.dart
@@ -20,7 +20,7 @@
A<int> a0 = c1;
A<int> a1 = c2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C<String, int>' can't be assigned to a variable of type 'A<int>'.
}
diff --git a/tests/language/regress/regress33479_test.dart b/tests/language/regress/regress33479_test.dart
index 0ede9fb..f1e8336 100644
--- a/tests/language/regress/regress33479_test.dart
+++ b/tests/language/regress/regress33479_test.dart
@@ -19,7 +19,7 @@
// ^
// [cfe] A generic function type can't be used as a type argument.
// ^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^^^^
// [analyzer] COMPILE_TIME_ERROR.COULD_NOT_INFER
// [cfe] Generic function type 'void Function<TypeY>()' inferred as a type argument.
diff --git a/tests/language/regress/regress34489_test.dart b/tests/language/regress/regress34489_test.dart
index a29cab8..7fba3cb 100644
--- a/tests/language/regress/regress34489_test.dart
+++ b/tests/language/regress/regress34489_test.dart
@@ -9,6 +9,6 @@
main() {
new C().field = 'bad';
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'Type'.
}
diff --git a/tests/language/regress/regress34495_test.dart b/tests/language/regress/regress34495_test.dart
index 41e58bf..2e69b38 100644
--- a/tests/language/regress/regress34495_test.dart
+++ b/tests/language/regress/regress34495_test.dart
@@ -7,7 +7,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'A'.
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'B' isn't a type.
main() {}
diff --git a/tests/language/regress/regress35043_test.dart b/tests/language/regress/regress35043_test.dart
index 884f707..d8c1b75 100644
--- a/tests/language/regress/regress35043_test.dart
+++ b/tests/language/regress/regress35043_test.dart
@@ -4,7 +4,7 @@
final foo = Map<int>();
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
main() {}
diff --git a/tests/language/rewrite/implicit_this_test.dart b/tests/language/rewrite/implicit_this_test.dart
index 078dcd2..28adbcf 100644
--- a/tests/language/rewrite/implicit_this_test.dart
+++ b/tests/language/rewrite/implicit_this_test.dart
@@ -20,7 +20,7 @@
shadow_y_parameter(y) {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -28,7 +28,7 @@
var y = z;
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -37,7 +37,7 @@
foo() {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
return foo();
@@ -47,7 +47,7 @@
foo(y) {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
return foo(z);
@@ -58,7 +58,7 @@
var y = z;
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -117,10 +117,10 @@
shadow_x_toplevel() {
return x + this.y + toplevel + this.toplevel;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'toplevel' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language/setter/no_getter_call_test.dart b/tests/language/setter/no_getter_call_test.dart
index 77b06dc..a49d8e4 100644
--- a/tests/language/setter/no_getter_call_test.dart
+++ b/tests/language/setter/no_getter_call_test.dart
@@ -23,7 +23,7 @@
x = topLevel(3);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Getter not found: 'topLevel'.
Expect.equals(6, x);
}
diff --git a/tests/language/setter/no_getter_test.dart b/tests/language/setter/no_getter_test.dart
index f2ea3e3..53c8b58 100644
--- a/tests/language/setter/no_getter_test.dart
+++ b/tests/language/setter/no_getter_test.dart
@@ -17,6 +17,6 @@
Example ex = new Example();
print(ex.foo++);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'foo' isn't defined for the class 'Example'.
}
diff --git a/tests/language/static/field1_test.dart b/tests/language/static/field1_test.dart
index e4e1472..7c3c338 100644
--- a/tests/language/static/field1_test.dart
+++ b/tests/language/static/field1_test.dart
@@ -14,7 +14,7 @@
var foo = new Foo();
var x = foo.x;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The getter 'x' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language/static/field1a_test.dart b/tests/language/static/field1a_test.dart
index 9d7f2f2..27a336d 100644
--- a/tests/language/static/field1a_test.dart
+++ b/tests/language/static/field1a_test.dart
@@ -14,7 +14,7 @@
var foo = new Foo();
var m = foo.m;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The getter 'm' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language/static/field3_test.dart b/tests/language/static/field3_test.dart
index 0498f48..f794e68 100644
--- a/tests/language/static/field3_test.dart
+++ b/tests/language/static/field3_test.dart
@@ -21,7 +21,7 @@
// [cfe] Getter not found: 'm'.
Foo.m = 1;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] Setter not found: 'm'.
Foo.x = 1;
// ^
diff --git a/tests/language/string/interpolation_test.dart b/tests/language/string/interpolation_test.dart
index 50968b0..2b0f4e5 100644
--- a/tests/language/string/interpolation_test.dart
+++ b/tests/language/string/interpolation_test.dart
@@ -60,7 +60,7 @@
if (alwaysFalse) {
"${i.toHorse()}";
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'toHorse' isn't defined for the class 'int'.
}
diff --git a/tests/language/string/no_operator_test.dart b/tests/language/string/no_operator_test.dart
index d5d013c..a7eabf7 100644
--- a/tests/language/string/no_operator_test.dart
+++ b/tests/language/string/no_operator_test.dart
@@ -9,23 +9,23 @@
var y = "y";
Expect.throws(() => x < y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<' isn't defined for the class 'String'.
Expect.throws(() => x <= y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<=' isn't defined for the class 'String'.
Expect.throws(() => x > y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>' isn't defined for the class 'String'.
Expect.throws(() => x >= y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>=' isn't defined for the class 'String'.
Expect.throws(() => x - y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '-' isn't defined for the class 'String'.
Expect.throws(() => x * y);
// ^
@@ -33,42 +33,42 @@
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
Expect.throws(() => x / y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '/' isn't defined for the class 'String'.
Expect.throws(() => x ~/ y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '~/' isn't defined for the class 'String'.
Expect.throws(() => x % y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '%' isn't defined for the class 'String'.
Expect.throws(() => x >> y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>>' isn't defined for the class 'String'.
Expect.throws(() => x << y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<<' isn't defined for the class 'String'.
Expect.throws(() => x & y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '&' isn't defined for the class 'String'.
Expect.throws(() => x | y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '|' isn't defined for the class 'String'.
Expect.throws(() => x ^ y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '^' isn't defined for the class 'String'.
Expect.throws(() => -x);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator 'unary-' isn't defined for the class 'String'.
Expect.throws(() => ~x);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '~' isn't defined for the class 'String'.
}
diff --git a/tests/language/string/string_test.dart b/tests/language/string/string_test.dart
index 1ab3f92..dfe4447 100644
--- a/tests/language/string/string_test.dart
+++ b/tests/language/string/string_test.dart
@@ -31,7 +31,7 @@
String a = "Hello";
a[1] = 12;
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'String'.
}
diff --git a/tests/language/super/assign_test.dart b/tests/language/super/assign_test.dart
index bfb2c38..9c09982 100644
--- a/tests/language/super/assign_test.dart
+++ b/tests/language/super/assign_test.dart
@@ -17,6 +17,6 @@
a.x = 37;
a.setX(42);
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'setX' isn't defined for the class 'A'.
}
diff --git a/tests/language/super/conditional_operator_test.dart b/tests/language/super/conditional_operator_test.dart
index c15182d..1c47348 100644
--- a/tests/language/super/conditional_operator_test.dart
+++ b/tests/language/super/conditional_operator_test.dart
@@ -70,7 +70,7 @@
// [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
!super?.field;
// ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
// ^^
// [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
// [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
diff --git a/tests/language/symbol/literal_test.dart b/tests/language/symbol/literal_test.dart
index 268b610..976158f 100644
--- a/tests/language/symbol/literal_test.dart
+++ b/tests/language/symbol/literal_test.dart
@@ -46,7 +46,7 @@
// Tries to call the symbol literal #a.toString
Expect.throwsNoSuchMethodError(() => #a.toString());
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Symbol'.
}
diff --git a/tests/language/sync_star/generator1_test.dart b/tests/language/sync_star/generator1_test.dart
index 79b294d..ef6bd9b 100644
--- a/tests/language/sync_star/generator1_test.dart
+++ b/tests/language/sync_star/generator1_test.dart
@@ -48,7 +48,7 @@
// Throws type error: yielded object is not an iterable.
yield* 3;
// ^
- // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
// [cfe] A value of type 'int' can't be assigned to a variable of type 'Iterable<dynamic>'.
}
diff --git a/tests/language/this/conditional_operator_runtime_test.dart b/tests/language/this/conditional_operator_runtime_test.dart
index eb56244..cf48394 100644
--- a/tests/language/this/conditional_operator_runtime_test.dart
+++ b/tests/language/this/conditional_operator_runtime_test.dart
@@ -20,9 +20,17 @@
test() {
this?.field = 1;
+ // ^^
+ // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
this?.field += 1;
+ // ^^
+ // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
this?.field;
+ // ^^
+ // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
this?.method();
+ // ^^
+ // [analyzer] STATIC_WARNING.INVALID_NULL_AWARE_OPERATOR
}
}
diff --git a/tests/language/this/conditional_operator_test.dart b/tests/language/this/conditional_operator_test.dart
index 85060a5..5254ea2 100644
--- a/tests/language/this/conditional_operator_test.dart
+++ b/tests/language/this/conditional_operator_test.dart
@@ -21,7 +21,7 @@
//^^^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
// [error line 15, column 11, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Expected '.' before this.
// ^^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/type_object/first_class_types_literals_test.dart b/tests/language/type_object/first_class_types_literals_test.dart
index e8fdca5..663e516 100644
--- a/tests/language/type_object/first_class_types_literals_test.dart
+++ b/tests/language/type_object/first_class_types_literals_test.dart
@@ -54,46 +54,46 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
// [cfe] Can't assign to a type literal.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.throwsNoSuchMethodError(() => C++);
// ^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
// [cfe] Can't assign to a type literal.
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
Expect.throwsNoSuchMethodError(() => C + 1);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2]);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic = 1);
// ^
// [cfe] Can't assign to a type literal.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.throwsNoSuchMethodError(() => dynamic++);
// ^
// [cfe] Can't assign to a type literal.
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
Expect.throwsNoSuchMethodError(() => dynamic + 1);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2]);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.equals((dynamic).toString(), 'dynamic');
diff --git a/tests/language/type_promotion/assign_test.dart b/tests/language/type_promotion/assign_test.dart
index 737a750..74c1322 100644
--- a/tests/language/type_promotion/assign_test.dart
+++ b/tests/language/type_promotion/assign_test.dart
@@ -39,7 +39,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
if (a is B) {
@@ -51,7 +51,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
diff --git a/tests/language/type_promotion/closure_test.dart b/tests/language/type_promotion/closure_test.dart
index 17246dc..7606728 100644
--- a/tests/language/type_promotion/closure_test.dart
+++ b/tests/language/type_promotion/closure_test.dart
@@ -70,7 +70,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -85,7 +85,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
void foo() {
a = new D();
@@ -94,7 +94,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -109,7 +109,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
void foo() {
a = new D();
@@ -118,7 +118,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -137,7 +137,7 @@
if (a is B) {
func(() => a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.a);
}
@@ -178,7 +178,7 @@
if (a is B
&& func(() => a.b)
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
) {
print(a.a);
@@ -190,7 +190,7 @@
A a = new E();
var b = a is B ? func(() => a.b) : false;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
a = A();
}
@@ -220,7 +220,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = A();
diff --git a/tests/language/type_promotion/functions_test.dart b/tests/language/type_promotion/functions_test.dart
index 94aee2f..4aecc3b 100644
--- a/tests/language/type_promotion/functions_test.dart
+++ b/tests/language/type_promotion/functions_test.dart
@@ -87,7 +87,7 @@
b = funcDynToDyn(new B()) as B;
c = funcDynToDyn(new C());
// ^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -124,7 +124,7 @@
b = funcDynToVoid(new B()) as B;
c = funcDynToVoid(new C());
// ^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -136,7 +136,7 @@
b = funcDynToA(new B()) as B;
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
@@ -146,7 +146,7 @@
b = funcDynToA(new B()) as B;
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -157,7 +157,7 @@
b = funcDynToA(new B()) as B;
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
diff --git a/tests/language/type_promotion/local_test.dart b/tests/language/type_promotion/local_test.dart
index c0fe87d..85b0386 100644
--- a/tests/language/type_promotion/local_test.dart
+++ b/tests/language/type_promotion/local_test.dart
@@ -32,15 +32,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is B) {
@@ -48,11 +48,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
if (a is C) {
@@ -61,7 +61,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -69,11 +69,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is C) {
@@ -82,7 +82,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a is B) {
@@ -91,7 +91,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D) {
@@ -100,7 +100,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -109,33 +109,33 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is D) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -143,15 +143,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
var o1 = a is B
@@ -159,24 +159,24 @@
'${a.b}'
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -186,20 +186,20 @@
'${a.c}'
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -207,25 +207,25 @@
? '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
'${a.d}'
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -234,11 +234,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is B && a is C) {
@@ -247,7 +247,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is B) {
@@ -256,7 +256,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is D) {
@@ -265,18 +265,18 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D && a is C) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
diff --git a/tests/language/type_promotion/more_specific_test.dart b/tests/language/type_promotion/more_specific_test.dart
index 21392a3..cf95b4a 100644
--- a/tests/language/type_promotion/more_specific_test.dart
+++ b/tests/language/type_promotion/more_specific_test.dart
@@ -48,7 +48,7 @@
// No promotion C !<< A.
x = a.c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
}
B b = new B();
@@ -60,7 +60,7 @@
// Promotion A << dynamic.
y = x.b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -78,12 +78,12 @@
// Promotion: E<A> << D.
int a = d1.d;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'int'.
String b = d1.d;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'String'.
x = d1.e;
@@ -94,7 +94,7 @@
// No promotion: E !<< D<A>
x = d2.e;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e' isn't defined for the class 'D<A>'.
}
diff --git a/tests/language/type_promotion/multiple_test.dart b/tests/language/type_promotion/multiple_test.dart
index 8410597..21a2f7d 100644
--- a/tests/language/type_promotion/multiple_test.dart
+++ b/tests/language/type_promotion/multiple_test.dart
@@ -36,29 +36,29 @@
print(a1.a);
print(a1.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a1.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
print(a2.a);
print(a2.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a2.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a1 is B && a2 is C) {
@@ -66,11 +66,11 @@
print(a1.b);
print(a1.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
print(a2.a);
@@ -78,7 +78,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a1 is C && a2 is D) {
@@ -87,7 +87,7 @@
print(a1.c);
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
print(a2.a);
@@ -95,7 +95,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
@@ -105,44 +105,44 @@
'${a1.b}'
'${a1.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a1.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
'${a2.a}'
'${a2.b}'
'${a2.c}'
'${a2.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a1.a}'
'${a1.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a1.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a1.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
'${a2.a}'
'${a2.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a2.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a2.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -152,7 +152,7 @@
print(a1.c);
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
print(a2.a);
@@ -160,7 +160,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
diff --git a/tests/language/type_promotion/parameter_test.dart b/tests/language/type_promotion/parameter_test.dart
index b93d764..7ce7119 100644
--- a/tests/language/type_promotion/parameter_test.dart
+++ b/tests/language/type_promotion/parameter_test.dart
@@ -35,15 +35,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is B) {
@@ -51,11 +51,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
if (a is C) {
@@ -64,7 +64,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -72,11 +72,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is C) {
@@ -85,7 +85,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a is B) {
@@ -94,7 +94,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D) {
@@ -103,7 +103,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -112,33 +112,33 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is D) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -146,15 +146,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
var o1 = a is B
@@ -162,24 +162,24 @@
'${a.b}'
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -189,20 +189,20 @@
'${a.c}'
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -210,25 +210,25 @@
? '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
'${a.d}'
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -237,11 +237,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is B && a is C) {
@@ -250,7 +250,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is B) {
@@ -259,7 +259,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is D) {
@@ -268,18 +268,18 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D && a is C) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -287,37 +287,37 @@
a.a == ""
&& a.b == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
&&
a.d == "") {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
if (a.a == ""
&& a.b == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
&&
a is B &&
@@ -325,11 +325,11 @@
a.b == ""
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
&&
a is C &&
@@ -338,7 +338,7 @@
a.c == ""
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
) {
print(a.a);
@@ -346,7 +346,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if ((a is B)) {
@@ -354,11 +354,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if ((a is B && (a) is C) && a is B) {
@@ -367,7 +367,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
diff --git a/tests/language/type_variable/bound_access_test.dart b/tests/language/type_variable/bound_access_test.dart
index 77f8594..39d52ea 100644
--- a/tests/language/type_variable/bound_access_test.dart
+++ b/tests/language/type_variable/bound_access_test.dart
@@ -21,7 +21,7 @@
num method2() => field1 + field2.length;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'length' isn't defined for the class 'num'.
}
diff --git a/tests/language/type_variable/conflict2_test.dart b/tests/language/type_variable/conflict2_test.dart
index 8b8439d..f43e609 100644
--- a/tests/language/type_variable/conflict2_test.dart
+++ b/tests/language/type_variable/conflict2_test.dart
@@ -14,13 +14,13 @@
// This is equivalent to (T).call(). See issue 19725
foo() => T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
// [cfe] Method not found: 'T'.
// T is in scope, even in static context. Compile-time error to call this.T().
static bar() => T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
// [cfe] Method not found: 'T'.
// ^
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
@@ -28,26 +28,26 @@
// X is not in scope. NoSuchMethodError.
static baz() => X();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'X'.
// Class 'C' has no static method 'T': NoSuchMethodError.
static qux() => C.T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.T'.
// Class '_Type' has no instance method 'call': NoSuchMethodError.
quux() => (T)();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
static corge() => (T)();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
@@ -57,7 +57,7 @@
// Class '_Type' has no [] operator: NoSuchMethodError.
grault() => T[0];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
@@ -66,13 +66,13 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
// Class '_Type' has no member m: NoSuchMethodError.
waldo() => T.m;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
@@ -81,7 +81,7 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm' isn't defined for the class 'Type'.
}
diff --git a/tests/language/type_variable/scope_test.dart b/tests/language/type_variable/scope_test.dart
index 86361f2..3be94a3 100644
--- a/tests/language/type_variable/scope_test.dart
+++ b/tests/language/type_variable/scope_test.dart
@@ -24,10 +24,10 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
return new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
}
// T is in scope for a factory method.
@@ -53,7 +53,7 @@
// [cfe] Can only use type variables in instance methods.
return new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
}
static void set f(
@@ -77,7 +77,7 @@
new I(new Foo<String>());
Foo.f1 = new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Foo<String>' can't be assigned to a variable of type 'Foo<T>'.
var x = Foo.f;
diff --git a/tests/language/unsorted/callable_test.dart b/tests/language/unsorted/callable_test.dart
index 75ff4c2..16dde13 100644
--- a/tests/language/unsorted/callable_test.dart
+++ b/tests/language/unsorted/callable_test.dart
@@ -42,12 +42,12 @@
//^
// [cfe] A value of type 'dynamic Function()' can't be assigned to a variable of type 'dynamic Function(int)'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
G g0 = y;
//^
// [cfe] A value of type 'dynamic Function(int)' can't be assigned to a variable of type 'dynamic Function(String)'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.equals(f(), 42);
Expect.equals(g(100), 187);
diff --git a/tests/language/unsorted/external_test.dart b/tests/language/unsorted/external_test.dart
index cd9c0e1..b18381f 100644
--- a/tests/language/unsorted/external_test.dart
+++ b/tests/language/unsorted/external_test.dart
@@ -70,13 +70,13 @@
}
external int t06(int i) { return 1; }
-// [error line 78, column 1, length 8]
+// [error line 72, column 1, length 8]
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
// [cfe] An external or native method can't have a body.
// ^
// [cfe] An external or native method can't have a body.
external int t07(int i) => i + 1;
-// [error line 84, column 1, length 8]
+// [error line 78, column 1, length 8]
// [analyzer] SYNTACTIC_ERROR.EXTERNAL_METHOD_WITH_BODY
// [cfe] An external or native method can't have a body.
// ^
diff --git a/tests/language/unsorted/invalid_cast_test.dart b/tests/language/unsorted/invalid_cast_test.dart
index c3b7747..86666e7 100644
--- a/tests/language/unsorted/invalid_cast_test.dart
+++ b/tests/language/unsorted/invalid_cast_test.dart
@@ -19,47 +19,47 @@
void localFunction(int i) {}
List<int> a = <Object>[];
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'List<Object>' can't be assigned to a variable of type 'List<int>'.
Map<int, String> b = <Object, String>{};
// ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Map<Object, String>' can't be assigned to a variable of type 'Map<int, String>'.
Map<int, String> c = <int, Object>{};
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Map<int, Object>' can't be assigned to a variable of type 'Map<int, String>'.
int Function(Object) d = (int i) => i;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'int Function(int)' can't be assigned to a variable of type 'int Function(Object)'.
D e = new C.fact() as D;
D f = new C.fact2() as D;
D g = new C.nonFact();
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C' can't be assigned to a variable of type 'D'.
D h = new C.nonFact2();
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C' can't be assigned to a variable of type 'D'.
void Function(Object) i = C.staticFunction;
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
void Function(Object) j = topLevelFunction;
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
void Function(Object) k = localFunction;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function(int)' can't be assigned to a variable of type 'void Function(Object)'.
}
diff --git a/tests/language/unsorted/invalid_type_argument_count_test.dart b/tests/language/unsorted/invalid_type_argument_count_test.dart
index 3a93da2..cf9619d 100644
--- a/tests/language/unsorted/invalid_type_argument_count_test.dart
+++ b/tests/language/unsorted/invalid_type_argument_count_test.dart
@@ -5,14 +5,14 @@
// Test top level field.
dynamic<int> x1 = 42;
// [error line 6, column 1, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
class Foo {
// Test class member.
dynamic<int> x2 = 42;
// [error line 13, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
Foo() {
@@ -28,7 +28,7 @@
// Test local variable.
dynamic<int> x3 = 42;
// [error line 29, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
print(x3);
@@ -38,7 +38,7 @@
// Test parameter.
void foo(dynamic<int> x4) {
// [error line 39, column 10, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
print(x4);
}
diff --git a/tests/language/variable/illegal_initializer_test.dart b/tests/language/variable/illegal_initializer_test.dart
index 1b99406..6924b69 100644
--- a/tests/language/variable/illegal_initializer_test.dart
+++ b/tests/language/variable/illegal_initializer_test.dart
@@ -24,7 +24,7 @@
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
B.c3() : super;
// ^
@@ -45,7 +45,7 @@
// ^^^^
// [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
// [error line 39, column 16, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Expected '.' before this.
// ^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language/variable/ref_before_declaration_test.dart b/tests/language/variable/ref_before_declaration_test.dart
index 53f42bc..ee9ebc2 100644
--- a/tests/language/variable/ref_before_declaration_test.dart
+++ b/tests/language/variable/ref_before_declaration_test.dart
@@ -76,7 +76,7 @@
// ^
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
}
test() {
diff --git a/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 71e14caa..e3e51d3 100644
--- a/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -17,7 +17,7 @@
// [cfe] Expected ')' before this.
List<out String> bar;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<' isn't defined for the class 'Type'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
@@ -26,7 +26,7 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Getter not found: 'out'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>' isn't defined for the class 'Type'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
diff --git a/tests/language/variance/variance_in_inference_error_test.dart b/tests/language/variance/variance_in_inference_error_test.dart
index 1d50ff2..d73f8b0 100644
--- a/tests/language/variance/variance_in_inference_error_test.dart
+++ b/tests/language/variance/variance_in_inference_error_test.dart
@@ -32,7 +32,7 @@
var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
upper = inferredMiddle;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Upper>'.
// T <: Upper and T <: Lower.
@@ -40,7 +40,7 @@
var inferredLower = inferContraContra(Contravariant<Upper>(), Contravariant<Lower>());
upper = inferredLower;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
// int <: T <: String is not a valid constraint.
@@ -88,7 +88,7 @@
var inferredContraUpper = inferContraBound(ContraBound(Lower(), (Upper x) {}));
lower = inferredContraUpper;
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Inference for Contrabound(...) produces Lower <: T <: Middle.
@@ -96,6 +96,6 @@
var inferredContraMiddle = inferContraBound(ContraBound(Lower(), (Middle x) {}));
lower = inferredContraMiddle;
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
}
diff --git a/tests/language/variance/variance_in_subtyping_error_test.dart b/tests/language/variance/variance_in_subtyping_error_test.dart
index 9779d33..4271fd0 100644
--- a/tests/language/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language/variance/variance_in_subtyping_error_test.dart
@@ -70,7 +70,7 @@
List<Contravariant<Lower>> listLower = [new Contravariant<Lower>()];
iterableMiddle = listLower;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Contravariant<Lower>>' can't be assigned to a variable of type 'Iterable<Contravariant<Middle>>'.
testCall(listLower);
diff --git a/tests/language/variance/variance_inout_subtyping_error_test.dart b/tests/language/variance/variance_inout_subtyping_error_test.dart
index 3bcec37..d994e6c 100644
--- a/tests/language/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language/variance/variance_inout_subtyping_error_test.dart
@@ -108,14 +108,14 @@
List<Invariant<Middle>> listMiddle = [new Invariant<Middle>()];
iterableLower = listMiddle;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Invariant<Middle>>' can't be assigned to a variable of type 'Iterable<Invariant<Lower>>'.
Iterable<Invariant<Middle>> iterableMiddle = [new Invariant<Middle>()];
List<Invariant<Lower>> listLower = [new Invariant<Lower>()];
iterableMiddle = listLower;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Invariant<Lower>>' can't be assigned to a variable of type 'Iterable<Invariant<Middle>>'.
testCall<Lower>(listMiddle);
diff --git a/tests/language/variance/variance_out_inference_error_test.dart b/tests/language/variance/variance_out_inference_error_test.dart
index 809cdfb..ccce0d1 100644
--- a/tests/language/variance/variance_out_inference_error_test.dart
+++ b/tests/language/variance/variance_out_inference_error_test.dart
@@ -31,7 +31,7 @@
var inferredMiddle = inferCovCov(Covariant<Lower>(), Covariant<Middle>());
lower = inferredMiddle;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Lower <: T <: Upper.
@@ -39,7 +39,7 @@
var inferredUpper = inferCovCov(Covariant<Lower>(), Covariant<Upper>());
lower = inferredUpper;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Inference for Covbound(...) produces Lower <: T <: Upper.
@@ -47,7 +47,7 @@
var inferredCovLower = inferCovBound(CovBound(Lower(), (Upper x) {}));
upper = inferredCovLower;
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
// Inference for Covbound(...) produces Lower <: T <: Middle.
@@ -55,6 +55,6 @@
var inferredCovLower2 = inferCovBound(CovBound(Lower(), (Middle x) {}));
middle = inferredCovLower2;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Middle>'.
}
diff --git a/tests/language/variance/variance_out_subtyping_error_test.dart b/tests/language/variance/variance_out_subtyping_error_test.dart
index dd925e2..2ddcd3e 100644
--- a/tests/language/variance/variance_out_subtyping_error_test.dart
+++ b/tests/language/variance/variance_out_subtyping_error_test.dart
@@ -70,7 +70,7 @@
List<Covariant<Middle>> listMiddle = [new Covariant<Middle>()];
iterableLower = listMiddle;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Covariant<Middle>>' can't be assigned to a variable of type 'Iterable<Covariant<Lower>>'.
testCall(listMiddle);
diff --git a/tests/language/variance/variance_upper_lower_bounds_error_test.dart b/tests/language/variance/variance_upper_lower_bounds_error_test.dart
index 2c69097..a8e1f25 100644
--- a/tests/language/variance/variance_upper_lower_bounds_error_test.dart
+++ b/tests/language/variance/variance_upper_lower_bounds_error_test.dart
@@ -28,39 +28,39 @@
exactly(condition ? Contravariant<Upper>() : Contravariant<Lower>());
Exactly<Contravariant<Upper>> contraUpperExpected = contraLowerActual;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Contravariant<Lower>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
var contraMiddleActual =
exactly(condition ? Contravariant<Upper>() : Contravariant<Middle>());
contraUpperExpected = contraMiddleActual;
// ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Contravariant<Middle>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
var covMiddleActual =
exactly(condition ? Covariant<Middle>() : Covariant<Lower>());
Exactly<Covariant<Lower>> covLowerExpected = covMiddleActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Covariant<Middle>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
var covUpperActual =
exactly(condition ? Covariant<Upper>() : Covariant<Lower>());
covLowerExpected = covUpperActual;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Covariant<Upper>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
var invObjectActual =
exactly(condition ? Invariant<Upper>() : Invariant<Middle>());
Exactly<Invariant<Middle>> invMiddleExpected = invObjectActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Middle>>'.
Exactly<Invariant<Upper>> invUpperExpected = invObjectActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Upper>>'.
var legacyCovMiddleActual =
@@ -68,14 +68,14 @@
Exactly<LegacyCovariant<Lower>> legacyCovLowerExpected =
legacyCovMiddleActual;
// ^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<LegacyCovariant<Middle>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
var legacyCovUpperActual =
exactly(condition ? LegacyCovariant<Upper>() : LegacyCovariant<Lower>());
legacyCovLowerExpected = legacyCovUpperActual;
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<LegacyCovariant<Upper>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
var multiActual = exactly(condition
@@ -83,20 +83,20 @@
: Multi<Lower, Middle, Lower>());
Exactly<Multi<Lower, Middle, Lower>> multiExpected = multiActual;
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Multi<Middle, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Multi<Lower, Middle, Lower>>'.
var multiActual2 = exactly(
condition ? Multi<Middle, int, Middle>() : Multi<Lower, Middle, Lower>());
Exactly<Multi<Middle, Object, Lower>> multiObjectExpected = multiActual2;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Multi<Middle, Object, Lower>>'.
var multiActual3 = exactly(
condition ? Multi<int, Middle, Middle>() : Multi<Lower, Middle, Lower>());
Exactly<Object> multiObjectExpected2 = multiActual3;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Multi<Object, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Object>'.
}
diff --git a/tests/language_2/assert/initializer_const_function_test.dart b/tests/language_2/assert/initializer_const_function_test.dart
index 27b99bd..b581c1d 100644
--- a/tests/language_2/assert/initializer_const_function_test.dart
+++ b/tests/language_2/assert/initializer_const_function_test.dart
@@ -11,7 +11,7 @@
const C.bc01(this.x, y)
: assert(staticTrue)
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_EXPRESSION
// [cfe] A value of type 'bool Function()' can't be assigned to a variable of type 'bool'.
;
}
diff --git a/tests/language_2/assign/static_type_test.dart b/tests/language_2/assign/static_type_test.dart
index d184bf4..8fba36d 100644
--- a/tests/language_2/assign/static_type_test.dart
+++ b/tests/language_2/assign/static_type_test.dart
@@ -7,7 +7,7 @@
int a = "String";
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
class A {
@@ -16,19 +16,19 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
final int d = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
int e = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
A() {
int f = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
}
method(
@@ -36,7 +36,7 @@
int
g = "String"]) {
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
return g;
}
diff --git a/tests/language_2/async/congruence_local_test.dart b/tests/language_2/async/congruence_local_test.dart
index 8d8a03d..de5fbaa 100644
--- a/tests/language_2/async/congruence_local_test.dart
+++ b/tests/language_2/async/congruence_local_test.dart
@@ -102,7 +102,7 @@
Future<int> v1 = f_inferred_futureObject();
int v2 = f_inferred_futureObject();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'int'.
@@ -112,7 +112,7 @@
Future<B2> v3 = f_inferred_A();
Future<int> v4 = f_inferred_A();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
}
diff --git a/tests/language_2/async/congruence_method_test.dart b/tests/language_2/async/congruence_method_test.dart
index 69f63d7..e951103 100644
--- a/tests/language_2/async/congruence_method_test.dart
+++ b/tests/language_2/async/congruence_method_test.dart
@@ -80,7 +80,7 @@
Future<B2> v1 = c.f_inferred_A();
Future<int> v2 = c.f_inferred_A();
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
}
diff --git a/tests/language_2/async/congruence_unnamed_test.dart b/tests/language_2/async/congruence_unnamed_test.dart
index 5e5ccd2..ecc2964 100644
--- a/tests/language_2/async/congruence_unnamed_test.dart
+++ b/tests/language_2/async/congruence_unnamed_test.dart
@@ -122,7 +122,7 @@
Future<int> v1 = f_inferred_futureObject();
int v2 = f_inferred_futureObject();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<Object>' can't be assigned to a variable of type 'int'.
@@ -132,7 +132,7 @@
Future<B2> v3 = f_inferred_A();
Future<int> v4 = f_inferred_A();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Future<A>' can't be assigned to a variable of type 'Future<int>'.
}
diff --git a/tests/language_2/async/or_generator_return_type_stacktrace_test.dart b/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
index 1de0f9c..a6de936 100644
--- a/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language_2/async/or_generator_return_type_stacktrace_test.dart
@@ -6,7 +6,7 @@
int badReturnTypeAsync() async {}
// [error line 7, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
// ^
// [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
int badReturnTypeAsyncStar() async* {}
diff --git a/tests/language_2/async/return_types_test.dart b/tests/language_2/async/return_types_test.dart
index 4ecd5b4..66853a7 100644
--- a/tests/language_2/async/return_types_test.dart
+++ b/tests/language_2/async/return_types_test.dart
@@ -18,13 +18,13 @@
foo3() async {
return "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'Future<String>' can't be assigned to a variable of type 'FutureOr<int>'.
}
Future<int, String>
// [error line 25, column 1, length 19]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
foo4() async {
return "String";
@@ -32,7 +32,7 @@
int
// [error line 33, column 1, length 3]
-// [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
+// [analyzer] COMPILE_TIME_ERROR.ILLEGAL_ASYNC_RETURN_TYPE
foo5() async {
// [error line 36, column 1]
// [cfe] Functions marked 'async' must have a return type assignable to 'Future'.
@@ -48,7 +48,7 @@
foo7() async {
return new Future<int>.value(3);
// ^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
}
Iterable<int> foo8() sync* {
diff --git a/tests/language_2/call/non_method_field_test.dart b/tests/language_2/call/non_method_field_test.dart
index 8fbd2a9..8656cbf 100644
--- a/tests/language_2/call/non_method_field_test.dart
+++ b/tests/language_2/call/non_method_field_test.dart
@@ -14,14 +14,14 @@
Fisk x1 = new Fisk();
x1.i();
//^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
Hest x2 = new Hest();
x2.i();
//^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'i' isn't a function or method and can't be invoked.
}
diff --git a/tests/language_2/call/object_has_no_call_method_test.dart b/tests/language_2/call/object_has_no_call_method_test.dart
index dcb2a5c..d02b290 100644
--- a/tests/language_2/call/object_has_no_call_method_test.dart
+++ b/tests/language_2/call/object_has_no_call_method_test.dart
@@ -6,20 +6,20 @@
d();
o();
//^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Object'.
f();
d.call;
o.call;
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'call' isn't defined for the class 'Object'.
f.call;
d.call();
o.call();
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'call' isn't defined for the class 'Object'.
f.call();
}
diff --git a/tests/language_2/call/through_getter_test.dart b/tests/language_2/call/through_getter_test.dart
index 2169e8c6..06e5af3 100644
--- a/tests/language_2/call/through_getter_test.dart
+++ b/tests/language_2/call/through_getter_test.dart
@@ -31,12 +31,12 @@
TOP_LEVEL_CONST();
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
(TOP_LEVEL_CONST)();
// ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
diff --git a/tests/language_2/cascade/cascade_test.dart b/tests/language_2/cascade/cascade_test.dart
index 274b23bf..7e674f5 100644
--- a/tests/language_2/cascade/cascade_test.dart
+++ b/tests/language_2/cascade/cascade_test.dart
@@ -93,11 +93,11 @@
// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
// [cfe] Expected an identifier, but got '37'.
// [error line 91, column 8, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
a.."foo";
// ^^^^^
// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
// [cfe] Expected an identifier, but got '"foo"'.
// [error line 97, column 11, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
}
diff --git a/tests/language_2/closure/internals_test.dart b/tests/language_2/closure/internals_test.dart
index 78f04ab..9efdda3 100644
--- a/tests/language_2/closure/internals_test.dart
+++ b/tests/language_2/closure/internals_test.dart
@@ -12,14 +12,14 @@
var f = new C().foo;
var target = f.target;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'target' isn't defined for the class 'dynamic Function()'.
var self = f.self;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'self' isn't defined for the class 'dynamic Function()'.
var receiver = f.receiver;
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'receiver' isn't defined for the class 'dynamic Function()'.
}
diff --git a/tests/language_2/compile_time_constant/static2_test.dart b/tests/language_2/compile_time_constant/static2_test.dart
index 5de087a..2f6abe6 100644
--- a/tests/language_2/compile_time_constant/static2_test.dart
+++ b/tests/language_2/compile_time_constant/static2_test.dart
@@ -13,7 +13,7 @@
const A.a2(this.x);
const A.a3([this.x = 'foo']);
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const A.a4(String this.x);
// ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
const a2 = const A.a2('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
const a3 = const A.a3();
// ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
const a4 = const A.a4('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
const a5 = const A.a5('foo');
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/compile_time_constant/static3_test.dart b/tests/language_2/compile_time_constant/static3_test.dart
index d6c508b..f9205fd 100644
--- a/tests/language_2/compile_time_constant/static3_test.dart
+++ b/tests/language_2/compile_time_constant/static3_test.dart
@@ -13,7 +13,7 @@
const A.a2(this.x);
const A.a3([this.x = 'foo']);
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const A.a4(String this.x);
// ^^^^^^^^^^^^^
@@ -34,16 +34,16 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
var a2 = const A.a2('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
var a3 = const A.a3();
// ^^^^^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
var a4 = const A.a4('foo');
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
var a5 = const A.a5('foo');
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
@@ -51,7 +51,7 @@
// ^^^^^^^^^^^^^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH
// ^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'String' can't be assigned to the parameter type 'int'.
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/compile_time_constant/static_test.dart b/tests/language_2/compile_time_constant/static_test.dart
index 288ffef..a7fb0a8 100644
--- a/tests/language_2/compile_time_constant/static_test.dart
+++ b/tests/language_2/compile_time_constant/static_test.dart
@@ -4,17 +4,17 @@
final int x = 'foo';
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
const int y = 'foo';
// ^^^^^
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
int z = 'foo';
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
main() {
diff --git a/tests/language_2/const/conditional_test.dart b/tests/language_2/const/conditional_test.dart
index 33aec86..4943748 100644
--- a/tests/language_2/const/conditional_test.dart
+++ b/tests/language_2/const/conditional_test.dart
@@ -73,13 +73,13 @@
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
const cond4a = zeroConst ? nonConst : const1;
// ^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] Not a constant expression.
const cond4b = zeroConst ? const0 : nonConst;
@@ -87,7 +87,7 @@
// [analyzer] COMPILE_TIME_ERROR.CONST_EVAL_TYPE_BOOL
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_CONDITION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_CONDITION
// ^
// [cfe] Not a constant expression.
diff --git a/tests/language_2/const/constructor3_test.dart b/tests/language_2/const/constructor3_test.dart
index aa8aa0ff..8ec85e0 100644
--- a/tests/language_2/const/constructor3_test.dart
+++ b/tests/language_2/const/constructor3_test.dart
@@ -15,7 +15,7 @@
const c = const C(0.0);
const d = const C(intValue);
// ^^^^^^^^
-// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
+// [analyzer] COMPILE_TIME_ERROR.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH
// [cfe] The argument type 'int' can't be assigned to the parameter type 'double'.
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
diff --git a/tests/language_2/const/init2_test.dart b/tests/language_2/const/init2_test.dart
index 7f5e1a3..40b7a8b 100644
--- a/tests/language_2/const/init2_test.dart
+++ b/tests/language_2/const/init2_test.dart
@@ -9,7 +9,7 @@
// [analyzer] CHECKED_MODE_COMPILE_TIME_ERROR.VARIABLE_TYPE_MISMATCH
// [cfe] A value of type 'int' can't be assigned to a variable of type 'double'.
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+// [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
main() {
print(c);
diff --git a/tests/language_2/constructor/named_constructor_test.dart b/tests/language_2/constructor/named_constructor_test.dart
index d802b9a..3b8af32 100644
--- a/tests/language_2/constructor/named_constructor_test.dart
+++ b/tests/language_2/constructor/named_constructor_test.dart
@@ -24,12 +24,12 @@
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// 'Class<int>.named<int>' doesn't fit the grammar syntax T.id:
new Class<int>.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
new prefix.Class().value;
@@ -45,7 +45,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
new prefix.Class.named().value;
@@ -64,7 +64,7 @@
// 'prefix.Class.named<int>' doesn't fit the grammar syntax T.id:
new prefix.Class.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// 'prefix<int>.Class<int>' doesn't fit the grammar syntax T.id:
@@ -73,7 +73,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -90,7 +90,7 @@
// 'prefix.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
new prefix.Class<int>.named<int>().value;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// 'prefix<int>.Class<int>.named<int>' doesn't fit the grammar syntax T.id:
@@ -99,6 +99,6 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'prefix.Class'.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
}
diff --git a/tests/language_2/constructor/reference_test.dart b/tests/language_2/constructor/reference_test.dart
index c1ec04c..9246d2b 100644
--- a/tests/language_2/constructor/reference_test.dart
+++ b/tests/language_2/constructor/reference_test.dart
@@ -23,13 +23,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
new Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
new Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -41,7 +41,7 @@
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^
// [cfe] Method not found: 'Foo.bar.baz'.
@@ -60,13 +60,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
const Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
const Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -78,7 +78,7 @@
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^
// [cfe] Method not found: 'Foo.bar.baz'.
@@ -87,7 +87,7 @@
Foo.bar();
Foo.bar.baz();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'bar'.
Foo<int>();
Foo<int>.bar();
@@ -96,13 +96,13 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Expected '(' after this.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
Foo.bar<int>();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
Foo.bar<int>.baz();
// ^
// [cfe] A constructor invocation can't have type arguments on the constructor name.
@@ -112,6 +112,6 @@
// [cfe] Method not found: 'Foo.bar.baz'.
Foo.bar.baz<int>();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'bar'.
}
diff --git a/tests/language_2/deferred/super_dependency_test.dart b/tests/language_2/deferred/super_dependency_test.dart
index f49380c..5879e56 100644
--- a/tests/language_2/deferred/super_dependency_test.dart
+++ b/tests/language_2/deferred/super_dependency_test.dart
@@ -8,7 +8,7 @@
import "package:expect/expect.dart";
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'foo'.
import "super_dependency_lib.dart" deferred as lib;
diff --git a/tests/language_2/enum/private_test.dart b/tests/language_2/enum/private_test.dart
index bd99d84..a24fec3 100644
--- a/tests/language_2/enum/private_test.dart
+++ b/tests/language_2/enum/private_test.dart
@@ -20,6 +20,6 @@
Expect.equals('Enum2._A,Enum2._B', Enum2.values.join(','));
Expect.throwsNoSuchMethodError(() => Enum2._A);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_ENUM_CONSTANT
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_ENUM_CONSTANT
// [cfe] Getter not found: '_A'.
}
diff --git a/tests/language_2/extension_methods/static_extension_bounds_error_test.dart b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
index 5e8ae34..2dc6ba0 100644
--- a/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
@@ -32,7 +32,7 @@
// Inferred type of String does not satisfy the bound.
s.e1;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e1' isn't defined for the class 'String'.
E1(s).e1;
//^^
@@ -56,7 +56,7 @@
// Inferred type of String does not satisfy the bound.
s.e2;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e2' isn't defined for the class 'String'.
E2(s).e2;
//^^
@@ -123,7 +123,7 @@
// Inferred super-bounded type is invalid as type argument
superRec.e4;
// ^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e4' isn't defined for the class 'Rec<dynamic>'.
E4(superRec).e4;
//^^
diff --git a/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
index 59920e7..8dc19f1 100644
--- a/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_deferred_import_resolution_error_test.dart
@@ -10,10 +10,10 @@
Object o = 1;
OnObject(o).onObject;
//^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: 'OnObject'.
o.onObject;
//^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onObject' isn't defined for the class 'Object'.
}
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
index 8493792..4986f45 100644
--- a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -44,15 +44,15 @@
c0.m2 = 0;
c0.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
c0.m2 += 0;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
c0.m2++;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C0'.
E0(c0).m2;
@@ -60,7 +60,7 @@
c0[0];
c0[0] = 0;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0];
// ^^^
@@ -70,11 +70,11 @@
c0[0] += 0;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
c0[0]++;
//^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C0'.
E0(c0)[0] += 0;
@@ -114,24 +114,24 @@
c1a.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C1<int>'.
c1a.m2 = 0;
c1a[0] = 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0] += 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0]++;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
c1a[0];
@@ -218,23 +218,23 @@
this.m2 = 0;
this.m2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm2' isn't defined for the class 'C2'.
this[0] = 0;
this[0];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0] += 0;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
this[0]++;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'C2'.
// Check that `this.mc` refers to `C2.mc`.
diff --git a/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
index 9a93aa0..25b0461 100644
--- a/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_import_hide_error_test.dart
@@ -12,7 +12,7 @@
Object o = i;
i.onInt;
//^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onInt' isn't defined for the class 'int'.
i.onObject;
o.onObject;
diff --git a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
index 3c485e8..a146f12 100644
--- a/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_import_prefixed_hide_error_test.dart
@@ -12,7 +12,7 @@
Object o = i;
i.onInt;
//^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'onInt' isn't defined for the class 'int'.
i.onObject;
o.onObject;
diff --git a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index f1a9254..86941be 100644
--- a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -51,7 +51,7 @@
// The instance getter shadows the global method
topLevelMethod(4);
// ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -143,7 +143,7 @@
// The static getter shadows the global method
topLevelMethod(4);
// ^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -225,7 +225,7 @@
// The instance getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -256,7 +256,7 @@
// The instance getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
}
@@ -371,7 +371,7 @@
// The static getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
@@ -417,7 +417,7 @@
// The static getter shadows the other extensions method
extensionMethod(4);
// ^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'int'.
}
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
index 38191b8..dd18be3 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
@@ -29,7 +29,7 @@
void shadowTypeParam<T>(T x) {
T y = self;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type '#T' can't be assigned to a variable of type 'T'.
}
diff --git a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
index 2856a18..ce822ac 100644
--- a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
@@ -39,7 +39,7 @@
// No `i_num` extension declared.
i_num.i_num;
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'i_num' isn't defined for the class 'Iterable<num>'.
Expect.equals("Iterable<int>.i_num", ii.i_num);
diff --git a/tests/language_2/factory/factory_test.dart b/tests/language_2/factory/factory_test.dart
index d7b5c2d..5431241 100644
--- a/tests/language_2/factory/factory_test.dart
+++ b/tests/language_2/factory/factory_test.dart
@@ -36,7 +36,7 @@
abstract class Link<T> {
factory Link.create() = LinkFactory<T>.create;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
// ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.REDIRECT_TO_INVALID_RETURN_TYPE
diff --git a/tests/language_2/factory/return_type_checked_test.dart b/tests/language_2/factory/return_type_checked_test.dart
index c882f4f..76e6f3a 100644
--- a/tests/language_2/factory/return_type_checked_test.dart
+++ b/tests/language_2/factory/return_type_checked_test.dart
@@ -7,7 +7,7 @@
class A {
factory A() => 42;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
// [cfe] A value of type 'int' can't be assigned to a variable of type 'A'.
}
diff --git a/tests/language_2/field/type_check_test.dart b/tests/language_2/field/type_check_test.dart
index 51f03fc..c27d3d5 100644
--- a/tests/language_2/field/type_check_test.dart
+++ b/tests/language_2/field/type_check_test.dart
@@ -9,6 +9,6 @@
int main() {
new A().e = "String";
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
}
diff --git a/tests/language_2/function/malformed_result_type_test.dart b/tests/language_2/function/malformed_result_type_test.dart
index 3b0257b..d149be5 100644
--- a/tests/language_2/function/malformed_result_type_test.dart
+++ b/tests/language_2/function/malformed_result_type_test.dart
@@ -11,6 +11,6 @@
main() {
C<int> f() => null;
//^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
}
diff --git a/tests/language_2/function/type_call_getter2_test.dart b/tests/language_2/function/type_call_getter2_test.dart
index c52cb9e..789f22e 100644
--- a/tests/language_2/function/type_call_getter2_test.dart
+++ b/tests/language_2/function/type_call_getter2_test.dart
@@ -27,42 +27,42 @@
Function
a2 = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'Function'.
final
F
a3 = a;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A' can't be assigned to a variable of type 'int Function(String)'.
final
Function
b2 = b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'B' can't be assigned to a variable of type 'Function'.
final
F
b3 = b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'B' can't be assigned to a variable of type 'int Function(String)'.
final
Function
c2 = c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'C' can't be assigned to a variable of type 'Function'.
final
F
c3 = c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'C' can't be assigned to a variable of type 'int Function(String)'.
Expect.throwsTypeError(() {
diff --git a/tests/language_2/generic/field_mixin6_test.dart b/tests/language_2/generic/field_mixin6_test.dart
index 47a3678..303df88 100644
--- a/tests/language_2/generic/field_mixin6_test.dart
+++ b/tests/language_2/generic/field_mixin6_test.dart
@@ -9,7 +9,7 @@
class M<T> {
T field1 = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'int' can't be assigned to a variable of type 'T'.
T field2 = 0 as dynamic;
}
diff --git a/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart b/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
index a1dd791..10775ef 100644
--- a/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
+++ b/tests/language_2/generic/function_subtype_parametrized_typedef_test.dart
@@ -17,30 +17,30 @@
H<A> haa = ha;
H<A> hab = hb;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
H<A> hac = hc;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends A>()'.
H<B> hba = ha;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
H<B> hbb = hb;
H<B> hbc = hc;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends C>()' can't be assigned to a variable of type 'void Function<Y extends B>()'.
H<C> hca = ha;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends A>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
H<C> hcb = hb;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y extends B>()' can't be assigned to a variable of type 'void Function<Y extends C>()'.
H<C> hcc = hc;
}
diff --git a/tests/language_2/generic/function_subtype_test.dart b/tests/language_2/generic/function_subtype_test.dart
index 28cb90a..d392f6d 100644
--- a/tests/language_2/generic/function_subtype_test.dart
+++ b/tests/language_2/generic/function_subtype_test.dart
@@ -14,12 +14,12 @@
F1 f11 = f1;
F1 f12 = f2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y2 extends String>()' can't be assigned to a variable of type 'void Function<X1 extends num>()'.
F2 f21 = f1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'void Function<Y1 extends num>()' can't be assigned to a variable of type 'void Function<X2 extends String>()'.
F2 f22 = f2;
}
diff --git a/tests/language_2/generic/function_typedef2_test.dart b/tests/language_2/generic/function_typedef2_test.dart
index 5a3207f..704a824 100644
--- a/tests/language_2/generic/function_typedef2_test.dart
+++ b/tests/language_2/generic/function_typedef2_test.dart
@@ -27,7 +27,7 @@
// [cfe] Can't create typedef from non-function type.
typedef K = Function(Function<A>(A<int>));
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Can't use type arguments with type variable 'A'.
typedef L = Function({x});
// ^
diff --git a/tests/language_2/generic/wrong_number_type_arguments_test.dart b/tests/language_2/generic/wrong_number_type_arguments_test.dart
index 69a0b68..53e9627 100644
--- a/tests/language_2/generic/wrong_number_type_arguments_test.dart
+++ b/tests/language_2/generic/wrong_number_type_arguments_test.dart
@@ -5,18 +5,18 @@
// Map takes 2 type arguments.
Map<String> foo;
// [error line 6, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
Map<String> baz;
// [error line 10, column 1, length 11]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
main() {
foo = null;
var bar = new Map<String>();
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
baz = new Map();
}
diff --git a/tests/language_2/getter/no_setter2_test.dart b/tests/language_2/getter/no_setter2_test.dart
index 83d92c4..22ad07e 100644
--- a/tests/language_2/getter/no_setter2_test.dart
+++ b/tests/language_2/getter/no_setter2_test.dart
@@ -18,7 +18,7 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
// [cfe] The getter 'nextVar' isn't defined for the class 'Example'.
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
}
static test() {
@@ -31,7 +31,7 @@
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
// [cfe] Expected identifier, but got 'this'.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
}
diff --git a/tests/language_2/getter/no_setter_test.dart b/tests/language_2/getter/no_setter_test.dart
index c403d32..260b5fc 100644
--- a/tests/language_2/getter/no_setter_test.dart
+++ b/tests/language_2/getter/no_setter_test.dart
@@ -15,7 +15,7 @@
// [cfe] Setter not found: 'nextVar'.
this.nextVar = 1;
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The setter 'nextVar' isn't defined for the class 'Example'.
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
@@ -30,7 +30,7 @@
// [analyzer] COMPILE_TIME_ERROR.INVALID_REFERENCE_TO_THIS
// [cfe] Expected identifier, but got 'this'.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+// [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_FINAL_NO_SETTER
}
diff --git a/tests/language_2/getter/setter2_test.dart b/tests/language_2/getter/setter2_test.dart
index ab9ba5a..a533c41 100644
--- a/tests/language_2/getter/setter2_test.dart
+++ b/tests/language_2/getter/setter2_test.dart
@@ -74,7 +74,7 @@
// Type 'A' has no method named 'b'
instance1.field.b();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'b' isn't defined for the class 'A'.
instance3.field = new B();
diff --git a/tests/language_2/identifier/known_prefix_error_test.dart b/tests/language_2/identifier/known_prefix_error_test.dart
index fe1ea19..06ec097 100644
--- a/tests/language_2/identifier/known_prefix_error_test.dart
+++ b/tests/language_2/identifier/known_prefix_error_test.dart
@@ -72,82 +72,82 @@
async.B<async> _B_async = new async.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'async' isn't a type.
await.B<await> _B_await = new await.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'await' isn't a type.
hide.B<hide> _B_hide = new hide.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'hide' isn't a type.
of.B<of> _B_of = new of.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'of' isn't a type.
on.B<on> _B_on = new on.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'on' isn't a type.
show.B<show> _B_show = new show.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'show' isn't a type.
sync.B<sync> _B_sync = new sync.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'sync' isn't a type.
yield.B<yield> _B_yield = new yield.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'yield' isn't a type.
async.B<async<dynamic>> _B2_async = new async.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'async' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
await.B<await<dynamic>> _B2_await = new await.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'await' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
hide.B<hide<dynamic>> _B2_hide = new hide.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'hide' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
of.B<of<dynamic>> _B2_of = new of.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'of' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
on.B<on<dynamic>> _B2_on = new on.B();
// ^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'on' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
show.B<show<dynamic>> _B2_show = new show.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'show' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
sync.B<sync<dynamic>> _B2_sync = new sync.B();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'sync' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
yield.B<yield<dynamic>> _B2_yield = new yield.B();
// ^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'yield' isn't a type.
// ^
// [cfe] Expected 0 type arguments.
diff --git a/tests/language_2/if_null/assignment_behavior_test.dart b/tests/language_2/if_null/assignment_behavior_test.dart
index 99811f2..6b02779 100644
--- a/tests/language_2/if_null/assignment_behavior_test.dart
+++ b/tests/language_2/if_null/assignment_behavior_test.dart
@@ -214,11 +214,11 @@
check(1, () => C?.x ??= bad(), ['C.x']);
h.C.xgetValue = 1;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] Setter not found: 'xgetValue'.
check(1, () => h.c?.x ??= bad(), ['h.C.x']);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: 'c'.
yGetValue = 1;
check(1, () => C?.x ??= y, ['C.x', 'y', 'C.x=1']);
diff --git a/tests/language_2/if_null/precedence_test.dart b/tests/language_2/if_null/precedence_test.dart
index cb419fc..224238f 100644
--- a/tests/language_2/if_null/precedence_test.dart
+++ b/tests/language_2/if_null/precedence_test.dart
@@ -29,7 +29,7 @@
// "(a ?? b) || c" would allow b to have any type provided that a is bool.
false ?? 1 || true;
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// "a || b ?? c" should parse as "(a || b) ?? c", therefore it is a static
@@ -37,7 +37,7 @@
// "a || (b ?? c)" would allow b to have any type provided that c is bool.
false || 1 ?? true;
// ^
- // [analyzer] STATIC_TYPE_WARNING.NON_BOOL_OPERAND
+ // [analyzer] COMPILE_TIME_ERROR.NON_BOOL_OPERAND
// [cfe] A value of type 'int' can't be assigned to a variable of type 'bool'.
// An incorrect parse of "a || (b ?? c)" would result in no checked-mode
diff --git a/tests/language_2/import/self_test.dart b/tests/language_2/import/self_test.dart
index 1feeb88..f724a60 100644
--- a/tests/language_2/import/self_test.dart
+++ b/tests/language_2/import/self_test.dart
@@ -18,6 +18,6 @@
main() {
p._x;
//^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: '_x'.
}
diff --git a/tests/language_2/inference/accessor_ref_test.dart b/tests/language_2/inference/accessor_ref_test.dart
index 8f16f8b..ec80b14 100644
--- a/tests/language_2/inference/accessor_ref_test.dart
+++ b/tests/language_2/inference/accessor_ref_test.dart
@@ -35,14 +35,14 @@
x = new E();
x = new B();
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
y = new C();
y = new E();
y = new B();
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'B' can't be assigned to a variable of type 'C'.
}
diff --git a/tests/language_2/least_upper_bound/expansive_test.dart b/tests/language_2/least_upper_bound/expansive_test.dart
index d798b15..970b685 100644
--- a/tests/language_2/least_upper_bound/expansive_test.dart
+++ b/tests/language_2/least_upper_bound/expansive_test.dart
@@ -42,37 +42,37 @@
// Is least upper bound dynamic?
(z ? a : b).z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'z' isn't defined for the class 'Object'.
// Is least upper bound N<...> ?
(z ? a : b).n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound C1<...> ?
(z ? a : b).c1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c1' isn't defined for the class 'Object'.
// Is least upper bound N<dynamic> ?
(z ? a : b).n.z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<N<...>> ?
(z ? a : b).n.n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<C1<...>> ?
(z ? a : b).n.c1;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
}
}
@@ -106,37 +106,37 @@
// Is least upper bound dynamic?
(z ? a : b).z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'z' isn't defined for the class 'Object'.
// Is least upper bound N<...> ?
(z ? a : b).n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound C2<...> ?
(z ? a : b).c2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c2' isn't defined for the class 'Object'.
// Is least upper bound N<dynamic> ?
(z ? a : b).n.z;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<N<...>> ?
(z ? a : b).n.n;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
// Is least upper bound N<C2<...>> ?
(z ? a : b).n.c2;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'n' isn't defined for the class 'Object'.
}
}
diff --git a/tests/language_2/least_upper_bound/least_upper_bound_test.dart b/tests/language_2/least_upper_bound/least_upper_bound_test.dart
index 4815316..4a7a784 100644
--- a/tests/language_2/least_upper_bound/least_upper_bound_test.dart
+++ b/tests/language_2/least_upper_bound/least_upper_bound_test.dart
@@ -47,11 +47,11 @@
B r2 = false ? a : b;
(true ? a : b).a = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'a' isn't defined for the class 'Object'.
(false ? a : b).b = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'b' isn't defined for the class 'Object'.
var c = new C();
(true ? a as dynamic : c).a = 0;
@@ -64,7 +64,7 @@
(true ? b : c).b = 0;
(false ? b : c).c = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'c' isn't defined for the class 'B'.
var a = null;
(true ? b : a).b = 0;
@@ -80,11 +80,11 @@
(false ? c : d).b = 0;
(true ? c : d).c = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'c' isn't defined for the class 'B'.
(false ? c : d).d = 0;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'd' isn't defined for the class 'B'.
}
@@ -94,12 +94,12 @@
F<C> r2 = false ? e : f;
A r3 = true ? e : f;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
B r4 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
(true ? e : f).e = null;
@@ -112,18 +112,18 @@
F<C> r2 = false ? e : f;
A r3 = true ? e : f;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'A'.
B r4 = false ? e : f;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E<B>' can't be assigned to a variable of type 'B'.
var r5;
r5 = (true ? e : f).e;
r5 = (false ? e : f).f;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'f' isn't defined for the class 'E<B>'.
}
diff --git a/tests/language_2/malformed/inheritance_test.dart b/tests/language_2/malformed/inheritance_test.dart
index 55154d7..8eed858 100644
--- a/tests/language_2/malformed/inheritance_test.dart
+++ b/tests/language_2/malformed/inheritance_test.dart
@@ -18,7 +18,7 @@
class C1
extends A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -36,7 +36,7 @@
class C3
extends Object with A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -52,7 +52,7 @@
class C5
implements A<Unresolved>
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -63,7 +63,7 @@
// [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -73,9 +73,9 @@
// [analyzer] COMPILE_TIME_ERROR.EXTENDS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -88,7 +88,7 @@
// [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -100,9 +100,9 @@
// [analyzer] COMPILE_TIME_ERROR.MIXIN_OF_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
@@ -113,7 +113,7 @@
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
{
}
@@ -123,9 +123,9 @@
// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
// [cfe] Can't use type arguments with type variable 'A'.
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] Type 'Unresolved' not found.
{
}
diff --git a/tests/language_2/malformed/malformed_test.dart b/tests/language_2/malformed/malformed_test.dart
index d825460..7f51c3d 100644
--- a/tests/language_2/malformed/malformed_test.dart
+++ b/tests/language_2/malformed/malformed_test.dart
@@ -29,25 +29,25 @@
checkIsListUnresolved(var v) {
v is List<Unresolved>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v is List<Unresolved<int>>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v is List<prefix.Unresolved>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v is List<prefix.Unresolved<int>>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v is List<int, String>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
@@ -75,25 +75,25 @@
checkAsListUnresolved(var v) {
v as List<Unresolved>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v as List<Unresolved<int>>;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'Unresolved' isn't a type.
v as List<prefix.Unresolved>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v as List<prefix.Unresolved<int>>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+ // [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// ^
// [cfe] 'Unresolved' isn't a type.
v as List<int, String>;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
diff --git a/tests/language_2/map/literal13_test.dart b/tests/language_2/map/literal13_test.dart
index ec5e0be..08f06e4 100644
--- a/tests/language_2/map/literal13_test.dart
+++ b/tests/language_2/map/literal13_test.dart
@@ -7,7 +7,7 @@
main() {
var map = new Map<int>{ "a": 1, "b": 2, "c": 3 };
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
// ^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/mixin/illegal_static_access_test.dart b/tests/language_2/mixin/illegal_static_access_test.dart
index 21e2348..8cd792d 100644
--- a/tests/language_2/mixin/illegal_static_access_test.dart
+++ b/tests/language_2/mixin/illegal_static_access_test.dart
@@ -20,10 +20,10 @@
Expect.throwsNoSuchMethodError(() => C.foo());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.foo'.
Expect.throwsNoSuchMethodError(() => C.bar());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.bar'.
}
diff --git a/tests/language_2/mixin/illegal_super_use_test.dart b/tests/language_2/mixin/illegal_super_use_test.dart
index 89c3a76..ca47645 100644
--- a/tests/language_2/mixin/illegal_super_use_test.dart
+++ b/tests/language_2/mixin/illegal_super_use_test.dart
@@ -11,22 +11,22 @@
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
void inner() {
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
}
inner();
@@ -35,11 +35,11 @@
super.toString();
super.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_METHOD
// [cfe] Superclass has no method named 'foo'.
super.bar = 100;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SUPER_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SUPER_SETTER
// [cfe] Superclass has no setter named 'bar'.
})();
diff --git a/tests/language_2/mixin/type_parameters_errors_test.dart b/tests/language_2/mixin/type_parameters_errors_test.dart
index 2988b2f..25e99b6 100644
--- a/tests/language_2/mixin/type_parameters_errors_test.dart
+++ b/tests/language_2/mixin/type_parameters_errors_test.dart
@@ -11,11 +11,11 @@
// ^
// [cfe] The type 'M<U, V>' can't be mixed in.
// ^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
class C<A, B> extends S<A, int> with M { }
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
class F<X> = S<X> with M<X>;
@@ -23,7 +23,7 @@
// ^
// [cfe] The type 'M<double, double>' can't be mixed in.
// ^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
main() {
@@ -32,11 +32,11 @@
a = new A<int>();
a = new A<String, String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
a = new F<int>();
a = new F<int, String>();
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+ // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 1 type arguments.
}
diff --git a/tests/language_2/null/checked_null_test.dart b/tests/language_2/null/checked_null_test.dart
index f6187cc..f33227b 100644
--- a/tests/language_2/null/checked_null_test.dart
+++ b/tests/language_2/null/checked_null_test.dart
@@ -25,6 +25,6 @@
// crash.
new A().a.foo();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'foo' isn't defined for the class 'Map<dynamic, dynamic>'.
}
diff --git a/tests/language_2/null_aware/access_test.dart b/tests/language_2/null_aware/access_test.dart
index 4965ccb..7a216c9 100644
--- a/tests/language_2/null_aware/access_test.dart
+++ b/tests/language_2/null_aware/access_test.dart
@@ -35,19 +35,19 @@
{ int i = new C(1)?.v; Expect.equals(1, i); }
{ String s = new C(null)?.v; Expect.equals(null, s); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
{ C.staticInt = 1; int i = C?.staticInt; Expect.equals(1, i); }
{ h.C.staticInt = 1; int i = h.C?.staticInt; Expect.equals(1, i); }
{ C.staticInt = null; String s = C?.staticInt; Expect.equals(null, s); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
{ h.C.staticInt = null; String s = h.C?.staticInt; Expect.equals(null, s); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -56,11 +56,11 @@
// generated in the case of e1?.id.
Expect.equals(null, nullC()?.bad);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'bad' isn't defined for the class 'C'.
{ B b = new C(1); Expect.equals(1, b?.v); }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'v' isn't defined for the class 'B'.
// '?.' cannot be used to access toplevel properties in libraries imported via
@@ -73,10 +73,10 @@
// Nor can it be used to access the hashCode getter on the class Type.
Expect.throwsNoSuchMethodError(() => C?.hashCode);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'hashCode'.
Expect.throwsNoSuchMethodError(() => h.C?.hashCode);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Getter not found: 'hashCode'.
}
diff --git a/tests/language_2/null_aware/assignment_test.dart b/tests/language_2/null_aware/assignment_test.dart
index 0b97167..22bde4f 100644
--- a/tests/language_2/null_aware/assignment_test.dart
+++ b/tests/language_2/null_aware/assignment_test.dart
@@ -56,20 +56,20 @@
// The static type of e1?.v = e2 is the static type of e2.
{ D d = new D(new E()); G g = new G(); F f = (d?.v = g); Expect.identical(f, g); }
{ D d = new D(new E()); E e = new G(); F f = (d?.v = e); }
- // ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ D.staticE = new E(); G g = new G(); F f = (D?.staticE = g); Expect.identical(f, g); }
{ h.D.staticE = new h.E(); h.G g = new h.G(); h.F f = (h.D?.staticE = g); Expect.identical(f, g); }
{ D.staticE = new E(); E e = new G(); F f = (D?.staticE = e); }
- // ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ h.D.staticE = new h.E(); h.E e = new h.G(); h.F f = (h.D?.staticE = e); }
- // ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
@@ -77,11 +77,11 @@
// also generated in the case of e1?.v = e2.
Expect.equals(null, nullC()?.bad = bad());
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'bad' isn't defined for the class 'C'.
{ B b = new C(1); Expect.equals(2, b?.v = 2); }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'v' isn't defined for the class 'B'.
// e1?.v op= e2 is equivalent to ((x) => x?.v = x.v op e2)(e1).
@@ -101,22 +101,22 @@
// also generated in the case of e1?.v op= e2.
nullC()?.bad = bad();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'bad' isn't defined for the class 'C'.
{ B b = new C(1); b?.v += 2; }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'v' isn't defined for the class 'B'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] The setter 'v' isn't defined for the class 'B'.
{ D d = new D(new E()); F f = (d?.v += nullC()); }
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'C' can't be assigned to a variable of type 'int'.
{ D d = new D(new E()); H h = (d?.v += 1); }
- // ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ D.staticE = new E(); F f = (D?.staticE += nullC()); }
@@ -128,13 +128,13 @@
// [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE
// [cfe] A value of type 'C' can't be assigned to a variable of type 'int'.
{ D.staticE = new E(); H h = (D?.staticE += 1); }
- // ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ h.D.staticE = new h.E(); h.H hh = (h.D?.staticE += 1); }
- // ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
diff --git a/tests/language_2/null_aware/increment_decrement_test.dart b/tests/language_2/null_aware/increment_decrement_test.dart
index 2341f98..4e7796e 100644
--- a/tests/language_2/null_aware/increment_decrement_test.dart
+++ b/tests/language_2/null_aware/increment_decrement_test.dart
@@ -52,18 +52,18 @@
{ E e1 = new E(); D d = new D(e1); E e2 = d?.v++; Expect.identical(e1, e2); }
{ G g = new G(); D d = new D(g); F f = d?.v++; Expect.identical(f, g); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ E e1 = new E(); D.staticE = e1; E e2 = D?.staticE++; Expect.identical(e1, e2); }
{ h.E e1 = new h.E(); h.D.staticE = e1; h.E e2 = h.D?.staticE++; Expect.identical(e1, e2); }
{ G g = new G(); D.staticE = g; F f = D?.staticE++; Expect.identical(f, g); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ h.G g = new h.G(); h.D.staticE = g; h.F f = h.D?.staticE++; Expect.identical(f, g); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
@@ -79,18 +79,18 @@
{ E e1 = new E(); D d = new D(e1); E e2 = d?.v--; Expect.identical(e1, e2); }
{ G g = new G(); D d = new D(g); F f = d?.v--; Expect.identical(f, g); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ E e1 = new E(); D.staticE = e1; E e2 = D?.staticE--; Expect.identical(e1, e2); }
{ h.E e1 = new h.E(); h.D.staticE = e1; h.E e2 = h.D?.staticE--; Expect.identical(e1, e2); }
{ G g = new G(); D.staticE = g; F f = D?.staticE--; Expect.identical(f, g); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
{ h.G g = new h.G(); h.D.staticE = g; h.F f = h.D?.staticE--; Expect.identical(f, g); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'E' can't be assigned to a variable of type 'F'.
@@ -106,19 +106,19 @@
{ D d = new D(new E()); F f = ++d?.v; Expect.identical(d.v, f); }
{ D d = new D(new E()); H h = ++d?.v; Expect.identical(d.v, h); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ D.staticE = new E(); F f = ++D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F f = ++h.D?.staticE; Expect.identical(h.D.staticE, f); }
{ D.staticE = new E(); H h = ++D?.staticE; Expect.identical(D.staticE, h); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ h.D.staticE = new h.E(); h.H hh = ++h.D?.staticE; Expect.identical(h.D.staticE, hh); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
@@ -134,19 +134,19 @@
{ D d = new D(new E()); F f = --d?.v; Expect.identical(d.v, f); }
{ D d = new D(new E()); H h = --d?.v; Expect.identical(d.v, h); }
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ D.staticE = new E(); F f = --D?.staticE; Expect.identical(D.staticE, f); }
{ h.D.staticE = new h.E(); h.F f = --h.D?.staticE; Expect.identical(h.D.staticE, f); }
{ D.staticE = new E(); H h = --D?.staticE; Expect.identical(D.staticE, h); }
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
{ h.D.staticE = new h.E(); h.H hh = --h.D?.staticE; Expect.identical(h.D.staticE, hh); }
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'G' can't be assigned to a variable of type 'H'.
}
diff --git a/tests/language_2/null_aware/invocation_test.dart b/tests/language_2/null_aware/invocation_test.dart
index 03c3ddb..e882353 100644
--- a/tests/language_2/null_aware/invocation_test.dart
+++ b/tests/language_2/null_aware/invocation_test.dart
@@ -41,23 +41,23 @@
{ int i = new C()?.g(() => 1); Expect.equals(1, i); }
{ String s = nullC()?.g(bad()); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
{ String s = new C()?.g(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
{ int i = C?.staticG(() => 1); Expect.equals(1, i); }
{ int i = h.C?.staticG(() => 1); Expect.equals(1, i); }
{ String s = C?.staticG(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
{ String s = h.C?.staticG(() => null); Expect.equals(null, s); }
// ^^^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -66,7 +66,7 @@
// generated in the case of o?.m(...).
{ B b = new C(); Expect.equals(1, b?.f(() => 1)); }
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'f' isn't defined for the class 'B'.
{ int i = 1; Expect.equals(null, nullC()?.f(i)); }
// ^
@@ -83,10 +83,10 @@
// Nor can it be used to access the toString method on the class Type.
Expect.throwsNoSuchMethodError(() => C?.toString());
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.toString'.
Expect.throwsNoSuchMethodError(() => h.C?.toString());
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.toString'.
}
diff --git a/tests/language_2/number/identifier_test.dart b/tests/language_2/number/identifier_test.dart
index 7b575c5..d66bf6b 100644
--- a/tests/language_2/number/identifier_test.dart
+++ b/tests/language_2/number/identifier_test.dart
@@ -68,7 +68,7 @@
Expect.equals(1e+2, 1e+2 as double);
Expect.throwsNoSuchMethodError(() => 1.e+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e' isn't defined for the class 'int'.
1d;
//^
@@ -86,11 +86,11 @@
// [cfe] Getter not found: 'D'.
Expect.throwsNoSuchMethodError(() => 1.d+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'int'.
Expect.throwsNoSuchMethodError(() => 1.D+2);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'D' isn't defined for the class 'int'.
1.1d;
//^^^
diff --git a/tests/language_2/override/method_with_field_test.dart b/tests/language_2/override/method_with_field_test.dart
index edd17fd..7d31ba2 100644
--- a/tests/language_2/override/method_with_field_test.dart
+++ b/tests/language_2/override/method_with_field_test.dart
@@ -31,7 +31,7 @@
Expect.equals(42, s.superInstanceMethod());
Expect.equals(42, sup.superInstanceMethod());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'superInstanceMethod' isn't defined for the class 'Super'.
Expect.equals(42, sub.superInstanceMethod());
}
diff --git a/tests/language_2/prefix/shadow_test.dart b/tests/language_2/prefix/shadow_test.dart
index 1680b1e..1af4c58 100644
--- a/tests/language_2/prefix/shadow_test.dart
+++ b/tests/language_2/prefix/shadow_test.dart
@@ -27,7 +27,7 @@
var result = 0;
result = lib10.Library10.static_fld;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'Library10' isn't defined for the class 'int'.
Expect.equals(4, result);
}
diff --git a/tests/language_2/prefix/transitive_import_test.dart b/tests/language_2/prefix/transitive_import_test.dart
index 582b3e2..ef53584 100644
--- a/tests/language_2/prefix/transitive_import_test.dart
+++ b/tests/language_2/prefix/transitive_import_test.dart
@@ -16,6 +16,6 @@
// Variable should not be visible.
lib12.top_level11;
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_PREFIXED_NAME
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_PREFIXED_NAME
// [cfe] Getter not found: 'top_level11'.
}
diff --git a/tests/language_2/private/access_test.dart b/tests/language_2/private/access_test.dart
index cbfef18..6e10558 100644
--- a/tests/language_2/private/access_test.dart
+++ b/tests/language_2/private/access_test.dart
@@ -10,13 +10,13 @@
main() {
_function();
//^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: '_function'.
private._function();
//^
// [cfe] Method not found: '_function'.
// ^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
new _Class();
// ^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
@@ -25,7 +25,7 @@
//^
// [cfe] Method not found: '_Class'.
// ^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
new Class._constructor();
// ^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.NEW_WITH_UNDEFINED_CONSTRUCTOR
diff --git a/tests/language_2/private/member3_test.dart b/tests/language_2/private/member3_test.dart
index eba3211..557a9e6 100644
--- a/tests/language_2/private/member3_test.dart
+++ b/tests/language_2/private/member3_test.dart
@@ -10,7 +10,7 @@
test() {
_fun();
// ^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method '_fun' isn't defined for the class 'Test'.
}
}
diff --git a/tests/language_2/regress/regress11724_test.dart b/tests/language_2/regress/regress11724_test.dart
index ddf3925..a408da1 100644
--- a/tests/language_2/regress/regress11724_test.dart
+++ b/tests/language_2/regress/regress11724_test.dart
@@ -7,6 +7,6 @@
void main() {
method(<int>[]);
//^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Method not found: 'method'.
}
diff --git a/tests/language_2/regress/regress1363_test.dart b/tests/language_2/regress/regress1363_test.dart
index cd7df8f..27f02c2 100644
--- a/tests/language_2/regress/regress1363_test.dart
+++ b/tests/language_2/regress/regress1363_test.dart
@@ -24,7 +24,7 @@
C contents = myCup.getContents(); // expect no warning or error
contents = libCup.getContents();
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C/*1*/' can't be assigned to a variable of type 'C/*2*/'.
}
diff --git a/tests/language_2/regress/regress18628_1_test.dart b/tests/language_2/regress/regress18628_1_test.dart
index 3f2bef3..214f9aa 100644
--- a/tests/language_2/regress/regress18628_1_test.dart
+++ b/tests/language_2/regress/regress18628_1_test.dart
@@ -13,7 +13,7 @@
// line just doesn't make sense without this line.
T t = int;
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Type' can't be assigned to a variable of type 'T'.
}
diff --git a/tests/language_2/regress/regress21912_test.dart b/tests/language_2/regress/regress21912_test.dart
index 46e6e58..eaacaad 100644
--- a/tests/language_2/regress/regress21912_test.dart
+++ b/tests/language_2/regress/regress21912_test.dart
@@ -19,11 +19,11 @@
Function2<Function2<int, double>, Function2<int, double>> left;
left = t1;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
left = t2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'A Function(B) Function(B Function(A))' can't be assigned to a variable of type 'double Function(int) Function(double Function(int))'.
}
}
diff --git a/tests/language_2/regress/regress22976_test.dart b/tests/language_2/regress/regress22976_test.dart
index 63180f8..de83e9b 100644
--- a/tests/language_2/regress/regress22976_test.dart
+++ b/tests/language_2/regress/regress22976_test.dart
@@ -20,7 +20,7 @@
A<int> a0 = c1;
A<int> a1 = c2;
// ^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'C<String, int>' can't be assigned to a variable of type 'A<int>'.
}
diff --git a/tests/language_2/regress/regress34489_test.dart b/tests/language_2/regress/regress34489_test.dart
index a29cab8..7fba3cb 100644
--- a/tests/language_2/regress/regress34489_test.dart
+++ b/tests/language_2/regress/regress34489_test.dart
@@ -9,6 +9,6 @@
main() {
new C().field = 'bad';
// ^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'String' can't be assigned to a variable of type 'Type'.
}
diff --git a/tests/language_2/regress/regress34495_test.dart b/tests/language_2/regress/regress34495_test.dart
index 41e58bf..2e69b38 100644
--- a/tests/language_2/regress/regress34495_test.dart
+++ b/tests/language_2/regress/regress34495_test.dart
@@ -7,7 +7,7 @@
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
// [cfe] Method not found: 'A'.
// ^
-// [analyzer] STATIC_TYPE_WARNING.NON_TYPE_AS_TYPE_ARGUMENT
+// [analyzer] COMPILE_TIME_ERROR.NON_TYPE_AS_TYPE_ARGUMENT
// [cfe] 'B' isn't a type.
main() {}
diff --git a/tests/language_2/regress/regress35043_test.dart b/tests/language_2/regress/regress35043_test.dart
index 884f707..d8c1b75 100644
--- a/tests/language_2/regress/regress35043_test.dart
+++ b/tests/language_2/regress/regress35043_test.dart
@@ -4,7 +4,7 @@
final foo = Map<int>();
// ^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 2 type arguments.
main() {}
diff --git a/tests/language_2/rewrite/implicit_this_test.dart b/tests/language_2/rewrite/implicit_this_test.dart
index 078dcd2..28adbcf 100644
--- a/tests/language_2/rewrite/implicit_this_test.dart
+++ b/tests/language_2/rewrite/implicit_this_test.dart
@@ -20,7 +20,7 @@
shadow_y_parameter(y) {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -28,7 +28,7 @@
var y = z;
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -37,7 +37,7 @@
foo() {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
return foo();
@@ -47,7 +47,7 @@
foo(y) {
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
return foo(z);
@@ -58,7 +58,7 @@
var y = z;
return x + this.y + y;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
}
@@ -117,10 +117,10 @@
shadow_x_toplevel() {
return x + this.y + toplevel + this.toplevel;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'y' isn't defined for the class 'Foo'.
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'toplevel' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language_2/setter/no_getter_call_test.dart b/tests/language_2/setter/no_getter_call_test.dart
index 77b06dc..a49d8e4 100644
--- a/tests/language_2/setter/no_getter_call_test.dart
+++ b/tests/language_2/setter/no_getter_call_test.dart
@@ -23,7 +23,7 @@
x = topLevel(3);
// ^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_FUNCTION
// [cfe] Getter not found: 'topLevel'.
Expect.equals(6, x);
}
diff --git a/tests/language_2/setter/no_getter_test.dart b/tests/language_2/setter/no_getter_test.dart
index f2ea3e3..53c8b58 100644
--- a/tests/language_2/setter/no_getter_test.dart
+++ b/tests/language_2/setter/no_getter_test.dart
@@ -17,6 +17,6 @@
Example ex = new Example();
print(ex.foo++);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'foo' isn't defined for the class 'Example'.
}
diff --git a/tests/language_2/static/field1_test.dart b/tests/language_2/static/field1_test.dart
index e4e1472..7c3c338 100644
--- a/tests/language_2/static/field1_test.dart
+++ b/tests/language_2/static/field1_test.dart
@@ -14,7 +14,7 @@
var foo = new Foo();
var x = foo.x;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The getter 'x' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language_2/static/field1a_test.dart b/tests/language_2/static/field1a_test.dart
index 9d7f2f2..27a336d 100644
--- a/tests/language_2/static/field1a_test.dart
+++ b/tests/language_2/static/field1a_test.dart
@@ -14,7 +14,7 @@
var foo = new Foo();
var m = foo.m;
// ^
- // [analyzer] STATIC_TYPE_WARNING.INSTANCE_ACCESS_TO_STATIC_MEMBER
+ // [analyzer] COMPILE_TIME_ERROR.INSTANCE_ACCESS_TO_STATIC_MEMBER
// [cfe] The getter 'm' isn't defined for the class 'Foo'.
}
}
diff --git a/tests/language_2/static/field3_test.dart b/tests/language_2/static/field3_test.dart
index 0498f48..f794e68 100644
--- a/tests/language_2/static/field3_test.dart
+++ b/tests/language_2/static/field3_test.dart
@@ -21,7 +21,7 @@
// [cfe] Getter not found: 'm'.
Foo.m = 1;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_SETTER
// [cfe] Setter not found: 'm'.
Foo.x = 1;
// ^
diff --git a/tests/language_2/string/interpolation_test.dart b/tests/language_2/string/interpolation_test.dart
index 8fd6fac..debcbf3 100644
--- a/tests/language_2/string/interpolation_test.dart
+++ b/tests/language_2/string/interpolation_test.dart
@@ -60,7 +60,7 @@
if (alwaysFalse) {
"${i.toHorse()}";
// ^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'toHorse' isn't defined for the class 'int'.
}
diff --git a/tests/language_2/string/no_operator_test.dart b/tests/language_2/string/no_operator_test.dart
index d5d013c..a7eabf7 100644
--- a/tests/language_2/string/no_operator_test.dart
+++ b/tests/language_2/string/no_operator_test.dart
@@ -9,23 +9,23 @@
var y = "y";
Expect.throws(() => x < y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<' isn't defined for the class 'String'.
Expect.throws(() => x <= y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<=' isn't defined for the class 'String'.
Expect.throws(() => x > y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>' isn't defined for the class 'String'.
Expect.throws(() => x >= y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>=' isn't defined for the class 'String'.
Expect.throws(() => x - y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '-' isn't defined for the class 'String'.
Expect.throws(() => x * y);
// ^
@@ -33,42 +33,42 @@
// [cfe] A value of type 'String' can't be assigned to a variable of type 'int'.
Expect.throws(() => x / y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '/' isn't defined for the class 'String'.
Expect.throws(() => x ~/ y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '~/' isn't defined for the class 'String'.
Expect.throws(() => x % y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '%' isn't defined for the class 'String'.
Expect.throws(() => x >> y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>>' isn't defined for the class 'String'.
Expect.throws(() => x << y);
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<<' isn't defined for the class 'String'.
Expect.throws(() => x & y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '&' isn't defined for the class 'String'.
Expect.throws(() => x | y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '|' isn't defined for the class 'String'.
Expect.throws(() => x ^ y);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '^' isn't defined for the class 'String'.
Expect.throws(() => -x);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator 'unary-' isn't defined for the class 'String'.
Expect.throws(() => ~x);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '~' isn't defined for the class 'String'.
}
diff --git a/tests/language_2/string/string_test.dart b/tests/language_2/string/string_test.dart
index da6d40a..68cca75 100644
--- a/tests/language_2/string/string_test.dart
+++ b/tests/language_2/string/string_test.dart
@@ -33,7 +33,7 @@
String a = "Hello";
a[1] = 12;
// ^^^
-// [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'String'.
}
diff --git a/tests/language_2/super/assign_test.dart b/tests/language_2/super/assign_test.dart
index d3c1b90..3e77ef5 100644
--- a/tests/language_2/super/assign_test.dart
+++ b/tests/language_2/super/assign_test.dart
@@ -17,6 +17,6 @@
a.x = 37;
a.setX(42);
//^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] The method 'setX' isn't defined for the class 'A'.
}
diff --git a/tests/language_2/super/conditional_operator_test.dart b/tests/language_2/super/conditional_operator_test.dart
index cd2d498..5c41ab4 100644
--- a/tests/language_2/super/conditional_operator_test.dart
+++ b/tests/language_2/super/conditional_operator_test.dart
@@ -52,7 +52,7 @@
// [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
!super?.field;
// ^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.NON_BOOL_NEGATION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.NON_BOOL_NEGATION_EXPRESSION
// ^^
// [analyzer] SYNTACTIC_ERROR.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
// [cfe] The operator '?.' cannot be used with 'super' because 'super' cannot be null.
diff --git a/tests/language_2/symbol/literal_test.dart b/tests/language_2/symbol/literal_test.dart
index 268b610..976158f 100644
--- a/tests/language_2/symbol/literal_test.dart
+++ b/tests/language_2/symbol/literal_test.dart
@@ -46,7 +46,7 @@
// Tries to call the symbol literal #a.toString
Expect.throwsNoSuchMethodError(() => #a.toString());
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Symbol'.
}
diff --git a/tests/language_2/sync_star/generator1_test.dart b/tests/language_2/sync_star/generator1_test.dart
index 79b294d..ef6bd9b 100644
--- a/tests/language_2/sync_star/generator1_test.dart
+++ b/tests/language_2/sync_star/generator1_test.dart
@@ -48,7 +48,7 @@
// Throws type error: yielded object is not an iterable.
yield* 3;
// ^
- // [analyzer] STATIC_TYPE_WARNING.YIELD_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.YIELD_OF_INVALID_TYPE
// [cfe] A value of type 'int' can't be assigned to a variable of type 'Iterable<dynamic>'.
}
diff --git a/tests/language_2/this/conditional_operator_test.dart b/tests/language_2/this/conditional_operator_test.dart
index 75f711c..9ccddb2 100644
--- a/tests/language_2/this/conditional_operator_test.dart
+++ b/tests/language_2/this/conditional_operator_test.dart
@@ -21,7 +21,7 @@
//^^^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
// [error line 15, column 11, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Expected '.' before this.
// ^^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/type_object/first_class_types_literals_test.dart b/tests/language_2/type_object/first_class_types_literals_test.dart
index e8fdca5..663e516 100644
--- a/tests/language_2/type_object/first_class_types_literals_test.dart
+++ b/tests/language_2/type_object/first_class_types_literals_test.dart
@@ -54,46 +54,46 @@
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
// [cfe] Can't assign to a type literal.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.throwsNoSuchMethodError(() => C++);
// ^
// [analyzer] COMPILE_TIME_ERROR.ASSIGNMENT_TO_TYPE
// [cfe] Can't assign to a type literal.
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
Expect.throwsNoSuchMethodError(() => C + 1);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2]);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic = 1);
// ^
// [cfe] Can't assign to a type literal.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.throwsNoSuchMethodError(() => dynamic++);
// ^
// [cfe] Can't assign to a type literal.
// ^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
Expect.throwsNoSuchMethodError(() => dynamic + 1);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '+' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2]);
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]=' isn't defined for the class 'Type'.
Expect.equals((dynamic).toString(), 'dynamic');
diff --git a/tests/language_2/type_promotion/assign_test.dart b/tests/language_2/type_promotion/assign_test.dart
index 38f8f55..35d99d8 100644
--- a/tests/language_2/type_promotion/assign_test.dart
+++ b/tests/language_2/type_promotion/assign_test.dart
@@ -33,7 +33,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
a = null;
}
@@ -42,14 +42,14 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
if (a is B) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
{
a = null;
@@ -57,7 +57,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
diff --git a/tests/language_2/type_promotion/closure_test.dart b/tests/language_2/type_promotion/closure_test.dart
index 9fb7568..2e6fec9 100644
--- a/tests/language_2/type_promotion/closure_test.dart
+++ b/tests/language_2/type_promotion/closure_test.dart
@@ -55,7 +55,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
void foo() {
@@ -73,7 +73,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -88,7 +88,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
void foo() {
a = new D();
@@ -97,7 +97,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -112,7 +112,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
void foo() {
a = new D();
@@ -121,7 +121,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -140,7 +140,7 @@
if (a is B) {
func(() => a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.a);
}
@@ -154,7 +154,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = null;
@@ -167,7 +167,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = null;
@@ -187,7 +187,7 @@
if (a is B
&& func(() => a.b)
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
) {
print(a.a);
@@ -199,7 +199,7 @@
A a = new E();
var b = a is B ? func(() => a.b) : false;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
a = null;
}
@@ -210,7 +210,7 @@
func(() => a[0]);
print(a[0].b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = null;
@@ -222,7 +222,7 @@
func(() => a[0] = null);
print(a[0].b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = null;
@@ -235,7 +235,7 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
a = null;
diff --git a/tests/language_2/type_promotion/functions_test.dart b/tests/language_2/type_promotion/functions_test.dart
index 590f1cc..30de4c1 100644
--- a/tests/language_2/type_promotion/functions_test.dart
+++ b/tests/language_2/type_promotion/functions_test.dart
@@ -87,7 +87,7 @@
b = funcDynToDyn(new B());
c = funcDynToDyn(new C());
// ^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -124,7 +124,7 @@
b = funcDynToVoid(new B());
c = funcDynToVoid(new C());
// ^^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -136,7 +136,7 @@
b = funcDynToA(new B());
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
@@ -146,7 +146,7 @@
b = funcDynToA(new B());
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
@@ -157,7 +157,7 @@
b = funcDynToA(new B());
c = funcDynToA(new C());
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'C'.
}
diff --git a/tests/language_2/type_promotion/local_test.dart b/tests/language_2/type_promotion/local_test.dart
index c0fe87d..85b0386 100644
--- a/tests/language_2/type_promotion/local_test.dart
+++ b/tests/language_2/type_promotion/local_test.dart
@@ -32,15 +32,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is B) {
@@ -48,11 +48,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
if (a is C) {
@@ -61,7 +61,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -69,11 +69,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is C) {
@@ -82,7 +82,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a is B) {
@@ -91,7 +91,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D) {
@@ -100,7 +100,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -109,33 +109,33 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is D) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -143,15 +143,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
var o1 = a is B
@@ -159,24 +159,24 @@
'${a.b}'
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -186,20 +186,20 @@
'${a.c}'
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -207,25 +207,25 @@
? '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
'${a.d}'
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -234,11 +234,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is B && a is C) {
@@ -247,7 +247,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is B) {
@@ -256,7 +256,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is D) {
@@ -265,18 +265,18 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D && a is C) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
diff --git a/tests/language_2/type_promotion/logical_and_test.dart b/tests/language_2/type_promotion/logical_and_test.dart
index 7dc5b2b..79945ba 100644
--- a/tests/language_2/type_promotion/logical_and_test.dart
+++ b/tests/language_2/type_promotion/logical_and_test.dart
@@ -33,19 +33,19 @@
if (a is D && ((a = new D()) != null)) {
b = a.d;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
}
if (a is D && (b = a.d)) {
b = a.d;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
a = null;
}
if ((((a) is D) && (b = (a).d))) {
b = a.d;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
a = null;
}
diff --git a/tests/language_2/type_promotion/more_specific_test.dart b/tests/language_2/type_promotion/more_specific_test.dart
index ec19e52..2e7d840 100644
--- a/tests/language_2/type_promotion/more_specific_test.dart
+++ b/tests/language_2/type_promotion/more_specific_test.dart
@@ -48,7 +48,7 @@
// No promotion C !<< A.
x = a.c;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
}
B b = new B();
@@ -60,7 +60,7 @@
// Promotion A << dynamic.
y = x.b;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
}
}
@@ -78,12 +78,12 @@
// Promotion: E<A> << D.
int a = d1.d;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'int'.
String b = d1.d;
// ^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'A' can't be assigned to a variable of type 'String'.
x = d1.e;
@@ -94,7 +94,7 @@
// No promotion: E !<< D<A>
x = d2.e;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'e' isn't defined for the class 'D<A>'.
}
diff --git a/tests/language_2/type_promotion/multiple_test.dart b/tests/language_2/type_promotion/multiple_test.dart
index 8410597..21a2f7d 100644
--- a/tests/language_2/type_promotion/multiple_test.dart
+++ b/tests/language_2/type_promotion/multiple_test.dart
@@ -36,29 +36,29 @@
print(a1.a);
print(a1.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a1.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
print(a2.a);
print(a2.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a2.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a1 is B && a2 is C) {
@@ -66,11 +66,11 @@
print(a1.b);
print(a1.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
print(a2.a);
@@ -78,7 +78,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a1 is C && a2 is D) {
@@ -87,7 +87,7 @@
print(a1.c);
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
print(a2.a);
@@ -95,7 +95,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
@@ -105,44 +105,44 @@
'${a1.b}'
'${a1.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a1.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
'${a2.a}'
'${a2.b}'
'${a2.c}'
'${a2.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a1.a}'
'${a1.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a1.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a1.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
'${a2.a}'
'${a2.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a2.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a2.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -152,7 +152,7 @@
print(a1.c);
print(a1.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
print(a2.a);
@@ -160,7 +160,7 @@
print(a2.c);
print(a2.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
diff --git a/tests/language_2/type_promotion/parameter_test.dart b/tests/language_2/type_promotion/parameter_test.dart
index b93d764..7ce7119 100644
--- a/tests/language_2/type_promotion/parameter_test.dart
+++ b/tests/language_2/type_promotion/parameter_test.dart
@@ -35,15 +35,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is B) {
@@ -51,11 +51,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
if (a is C) {
@@ -64,7 +64,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -72,11 +72,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is C) {
@@ -85,7 +85,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
if (a is B) {
@@ -94,7 +94,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D) {
@@ -103,7 +103,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
@@ -112,33 +112,33 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
if (a is D) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -146,15 +146,15 @@
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
var o1 = a is B
@@ -162,24 +162,24 @@
'${a.b}'
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -189,20 +189,20 @@
'${a.c}'
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -210,25 +210,25 @@
? '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
'${a.d}'
: '${a.a}'
'${a.b}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
'${a.c}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
'${a.d}'
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
;
@@ -237,11 +237,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if (a is B && a is C) {
@@ -250,7 +250,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is B) {
@@ -259,7 +259,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is C && a is D) {
@@ -268,18 +268,18 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if (a is D && a is C) {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
@@ -287,37 +287,37 @@
a.a == ""
&& a.b == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
&&
a.d == "") {
print(a.a);
print(a.b);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'D'.
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'D'.
print(a.d);
}
if (a.a == ""
&& a.b == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'b' isn't defined for the class 'A'.
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'A'.
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'A'.
&&
a is B &&
@@ -325,11 +325,11 @@
a.b == ""
&& a.c == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
&&
a is C &&
@@ -338,7 +338,7 @@
a.c == ""
&& a.d == ""
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
) {
print(a.a);
@@ -346,7 +346,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
if ((a is B)) {
@@ -354,11 +354,11 @@
print(a.b);
print(a.c);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'c' isn't defined for the class 'B'.
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'B'.
}
if ((a is B && (a) is C) && a is B) {
@@ -367,7 +367,7 @@
print(a.c);
print(a.d);
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'd' isn't defined for the class 'C'.
}
}
diff --git a/tests/language_2/type_variable/bound_access_test.dart b/tests/language_2/type_variable/bound_access_test.dart
index 77f8594..39d52ea 100644
--- a/tests/language_2/type_variable/bound_access_test.dart
+++ b/tests/language_2/type_variable/bound_access_test.dart
@@ -21,7 +21,7 @@
num method2() => field1 + field2.length;
// ^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'length' isn't defined for the class 'num'.
}
diff --git a/tests/language_2/type_variable/conflict2_test.dart b/tests/language_2/type_variable/conflict2_test.dart
index 8b8439d..f43e609 100644
--- a/tests/language_2/type_variable/conflict2_test.dart
+++ b/tests/language_2/type_variable/conflict2_test.dart
@@ -14,13 +14,13 @@
// This is equivalent to (T).call(). See issue 19725
foo() => T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
// [cfe] Method not found: 'T'.
// T is in scope, even in static context. Compile-time error to call this.T().
static bar() => T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION
// [cfe] Method not found: 'T'.
// ^
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
@@ -28,26 +28,26 @@
// X is not in scope. NoSuchMethodError.
static baz() => X();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'X'.
// Class 'C' has no static method 'T': NoSuchMethodError.
static qux() => C.T();
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
// [cfe] Method not found: 'C.T'.
// Class '_Type' has no instance method 'call': NoSuchMethodError.
quux() => (T)();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [cfe] The method 'call' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
static corge() => (T)();
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+ // [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
@@ -57,7 +57,7 @@
// Class '_Type' has no [] operator: NoSuchMethodError.
grault() => T[0];
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
@@ -66,13 +66,13 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '[]' isn't defined for the class 'Type'.
// Class '_Type' has no member m: NoSuchMethodError.
waldo() => T.m;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm' isn't defined for the class 'Type'.
// Runtime type T not accessible from static context. Compile-time error.
@@ -81,7 +81,7 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] The getter 'm' isn't defined for the class 'Type'.
}
diff --git a/tests/language_2/type_variable/scope_test.dart b/tests/language_2/type_variable/scope_test.dart
index 1b5cbb7..febaa5d 100644
--- a/tests/language_2/type_variable/scope_test.dart
+++ b/tests/language_2/type_variable/scope_test.dart
@@ -24,10 +24,10 @@
// [analyzer] COMPILE_TIME_ERROR.TYPE_PARAMETER_REFERENCED_BY_STATIC
// [cfe] Type variables can't be used in static members.
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
return new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
}
// T is in scope for a factory method.
@@ -52,7 +52,7 @@
// [cfe] Can only use type variables in instance methods.
return new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.RETURN_OF_INVALID_TYPE
+ // [analyzer] COMPILE_TIME_ERROR.RETURN_OF_INVALID_TYPE
}
static void set f(
@@ -76,7 +76,7 @@
new I(new Foo<String>());
Foo.f1 = new Foo<String>();
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// ^
// [cfe] A value of type 'Foo<String>' can't be assigned to a variable of type 'Foo<T>'.
var x = Foo.f;
diff --git a/tests/language_2/unsorted/callable_test.dart b/tests/language_2/unsorted/callable_test.dart
index 75ff4c2..16dde13 100644
--- a/tests/language_2/unsorted/callable_test.dart
+++ b/tests/language_2/unsorted/callable_test.dart
@@ -42,12 +42,12 @@
//^
// [cfe] A value of type 'dynamic Function()' can't be assigned to a variable of type 'dynamic Function(int)'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
G g0 = y;
//^
// [cfe] A value of type 'dynamic Function(int)' can't be assigned to a variable of type 'dynamic Function(String)'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
Expect.equals(f(), 42);
Expect.equals(g(100), 187);
diff --git a/tests/language_2/unsorted/invalid_type_argument_count_test.dart b/tests/language_2/unsorted/invalid_type_argument_count_test.dart
index 3a93da2..cf9619d 100644
--- a/tests/language_2/unsorted/invalid_type_argument_count_test.dart
+++ b/tests/language_2/unsorted/invalid_type_argument_count_test.dart
@@ -5,14 +5,14 @@
// Test top level field.
dynamic<int> x1 = 42;
// [error line 6, column 1, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
class Foo {
// Test class member.
dynamic<int> x2 = 42;
// [error line 13, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
Foo() {
@@ -28,7 +28,7 @@
// Test local variable.
dynamic<int> x3 = 42;
// [error line 29, column 3, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
print(x3);
@@ -38,7 +38,7 @@
// Test parameter.
void foo(dynamic<int> x4) {
// [error line 39, column 10, length 12]
-// [analyzer] STATIC_TYPE_WARNING.WRONG_NUMBER_OF_TYPE_ARGUMENTS
+// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS
// [cfe] Expected 0 type arguments.
print(x4);
}
diff --git a/tests/language_2/variable/illegal_initializer_test.dart b/tests/language_2/variable/illegal_initializer_test.dart
index 1b99406..6924b69 100644
--- a/tests/language_2/variable/illegal_initializer_test.dart
+++ b/tests/language_2/variable/illegal_initializer_test.dart
@@ -24,7 +24,7 @@
// ^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.INITIALIZER_FOR_NON_EXISTENT_FIELD
// ^^^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
B.c3() : super;
// ^
@@ -45,7 +45,7 @@
// ^^^^
// [analyzer] SYNTACTIC_ERROR.MISSING_ASSIGNMENT_IN_INITIALIZER
// [error line 39, column 16, length 0]
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
// [cfe] Expected '.' before this.
// ^
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
diff --git a/tests/language_2/variable/ref_before_declaration_test.dart b/tests/language_2/variable/ref_before_declaration_test.dart
index 53f42bc..ee9ebc2 100644
--- a/tests/language_2/variable/ref_before_declaration_test.dart
+++ b/tests/language_2/variable/ref_before_declaration_test.dart
@@ -76,7 +76,7 @@
// ^
// [analyzer] COMPILE_TIME_ERROR.REFERENCED_BEFORE_DECLARATION
// ^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
}
test() {
diff --git a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 71e14caa..e3e51d3 100644
--- a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -17,7 +17,7 @@
// [cfe] Expected ')' before this.
List<out String> bar;
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '<' isn't defined for the class 'Type'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
@@ -26,7 +26,7 @@
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
// [cfe] Getter not found: 'out'.
// ^
- // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
+ // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
// [cfe] The operator '>' isn't defined for the class 'Type'.
// ^^^
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_IDENTIFIER
diff --git a/tests/language_2/variance/variance_in_inference_error_test.dart b/tests/language_2/variance/variance_in_inference_error_test.dart
index 4e79966..f7ab3d4 100644
--- a/tests/language_2/variance/variance_in_inference_error_test.dart
+++ b/tests/language_2/variance/variance_in_inference_error_test.dart
@@ -32,7 +32,7 @@
var inferredMiddle = inferContraContra(Contravariant<Upper>(), Contravariant<Middle>());
upper = inferredMiddle;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Upper>'.
// T <: Upper and T <: Lower.
@@ -40,7 +40,7 @@
var inferredLower = inferContraContra(Contravariant<Upper>(), Contravariant<Lower>());
upper = inferredLower;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
// int <: T <: String is not a valid constraint.
@@ -88,7 +88,7 @@
var inferredContraUpper = inferContraBound(ContraBound(Lower(), (Upper x) {}));
lower = inferredContraUpper;
// ^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Inference for Contrabound(...) produces Lower <: T <: Middle.
@@ -96,6 +96,6 @@
var inferredContraMiddle = inferContraBound(ContraBound(Lower(), (Middle x) {}));
lower = inferredContraMiddle;
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
}
diff --git a/tests/language_2/variance/variance_in_subtyping_error_test.dart b/tests/language_2/variance/variance_in_subtyping_error_test.dart
index 9779d33..4271fd0 100644
--- a/tests/language_2/variance/variance_in_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_in_subtyping_error_test.dart
@@ -70,7 +70,7 @@
List<Contravariant<Lower>> listLower = [new Contravariant<Lower>()];
iterableMiddle = listLower;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Contravariant<Lower>>' can't be assigned to a variable of type 'Iterable<Contravariant<Middle>>'.
testCall(listLower);
diff --git a/tests/language_2/variance/variance_inout_subtyping_error_test.dart b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
index 3bcec37..d994e6c 100644
--- a/tests/language_2/variance/variance_inout_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_inout_subtyping_error_test.dart
@@ -108,14 +108,14 @@
List<Invariant<Middle>> listMiddle = [new Invariant<Middle>()];
iterableLower = listMiddle;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Invariant<Middle>>' can't be assigned to a variable of type 'Iterable<Invariant<Lower>>'.
Iterable<Invariant<Middle>> iterableMiddle = [new Invariant<Middle>()];
List<Invariant<Lower>> listLower = [new Invariant<Lower>()];
iterableMiddle = listLower;
// ^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Invariant<Lower>>' can't be assigned to a variable of type 'Iterable<Invariant<Middle>>'.
testCall<Lower>(listMiddle);
diff --git a/tests/language_2/variance/variance_out_inference_error_test.dart b/tests/language_2/variance/variance_out_inference_error_test.dart
index 809cdfb..ccce0d1 100644
--- a/tests/language_2/variance/variance_out_inference_error_test.dart
+++ b/tests/language_2/variance/variance_out_inference_error_test.dart
@@ -31,7 +31,7 @@
var inferredMiddle = inferCovCov(Covariant<Lower>(), Covariant<Middle>());
lower = inferredMiddle;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Middle>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Lower <: T <: Upper.
@@ -39,7 +39,7 @@
var inferredUpper = inferCovCov(Covariant<Lower>(), Covariant<Upper>());
lower = inferredUpper;
// ^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Upper>' can't be assigned to a variable of type 'Exactly<Lower>'.
// Inference for Covbound(...) produces Lower <: T <: Upper.
@@ -47,7 +47,7 @@
var inferredCovLower = inferCovBound(CovBound(Lower(), (Upper x) {}));
upper = inferredCovLower;
// ^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Upper>'.
// Inference for Covbound(...) produces Lower <: T <: Middle.
@@ -55,6 +55,6 @@
var inferredCovLower2 = inferCovBound(CovBound(Lower(), (Middle x) {}));
middle = inferredCovLower2;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Lower>' can't be assigned to a variable of type 'Exactly<Middle>'.
}
diff --git a/tests/language_2/variance/variance_out_subtyping_error_test.dart b/tests/language_2/variance/variance_out_subtyping_error_test.dart
index dd925e2..2ddcd3e 100644
--- a/tests/language_2/variance/variance_out_subtyping_error_test.dart
+++ b/tests/language_2/variance/variance_out_subtyping_error_test.dart
@@ -70,7 +70,7 @@
List<Covariant<Middle>> listMiddle = [new Covariant<Middle>()];
iterableLower = listMiddle;
// ^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'List<Covariant<Middle>>' can't be assigned to a variable of type 'Iterable<Covariant<Lower>>'.
testCall(listMiddle);
diff --git a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
index 2c69097..a8e1f25 100644
--- a/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
+++ b/tests/language_2/variance/variance_upper_lower_bounds_error_test.dart
@@ -28,39 +28,39 @@
exactly(condition ? Contravariant<Upper>() : Contravariant<Lower>());
Exactly<Contravariant<Upper>> contraUpperExpected = contraLowerActual;
// ^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Contravariant<Lower>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
var contraMiddleActual =
exactly(condition ? Contravariant<Upper>() : Contravariant<Middle>());
contraUpperExpected = contraMiddleActual;
// ^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Contravariant<Middle>>' can't be assigned to a variable of type 'Exactly<Contravariant<Upper>>'.
var covMiddleActual =
exactly(condition ? Covariant<Middle>() : Covariant<Lower>());
Exactly<Covariant<Lower>> covLowerExpected = covMiddleActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Covariant<Middle>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
var covUpperActual =
exactly(condition ? Covariant<Upper>() : Covariant<Lower>());
covLowerExpected = covUpperActual;
// ^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Covariant<Upper>>' can't be assigned to a variable of type 'Exactly<Covariant<Lower>>'.
var invObjectActual =
exactly(condition ? Invariant<Upper>() : Invariant<Middle>());
Exactly<Invariant<Middle>> invMiddleExpected = invObjectActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Middle>>'.
Exactly<Invariant<Upper>> invUpperExpected = invObjectActual;
// ^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Invariant<Upper>>'.
var legacyCovMiddleActual =
@@ -68,14 +68,14 @@
Exactly<LegacyCovariant<Lower>> legacyCovLowerExpected =
legacyCovMiddleActual;
// ^^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<LegacyCovariant<Middle>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
var legacyCovUpperActual =
exactly(condition ? LegacyCovariant<Upper>() : LegacyCovariant<Lower>());
legacyCovLowerExpected = legacyCovUpperActual;
// ^^^^^^^^^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<LegacyCovariant<Upper>>' can't be assigned to a variable of type 'Exactly<LegacyCovariant<Lower>>'.
var multiActual = exactly(condition
@@ -83,20 +83,20 @@
: Multi<Lower, Middle, Lower>());
Exactly<Multi<Lower, Middle, Lower>> multiExpected = multiActual;
// ^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Multi<Middle, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Multi<Lower, Middle, Lower>>'.
var multiActual2 = exactly(
condition ? Multi<Middle, int, Middle>() : Multi<Lower, Middle, Lower>());
Exactly<Multi<Middle, Object, Lower>> multiObjectExpected = multiActual2;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Object>' can't be assigned to a variable of type 'Exactly<Multi<Middle, Object, Lower>>'.
var multiActual3 = exactly(
condition ? Multi<int, Middle, Middle>() : Multi<Lower, Middle, Lower>());
Exactly<Object> multiObjectExpected2 = multiActual3;
// ^^^^^^^^^^^^
- // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+ // [analyzer] COMPILE_TIME_ERROR.INVALID_ASSIGNMENT
// [cfe] A value of type 'Exactly<Multi<Object, Middle, Lower>>' can't be assigned to a variable of type 'Exactly<Object>'.
}
diff --git a/tests/lib/html/js_function_getter_trust_types/compile_test.dart b/tests/lib/html/js_function_getter_trust_types/compile_test.dart
index 9cbbe1f..e7481d1 100644
--- a/tests/lib/html/js_function_getter_trust_types/compile_test.dart
+++ b/tests/lib/html/js_function_getter_trust_types/compile_test.dart
@@ -18,25 +18,25 @@
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0, 0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.add(4);
// ^
diff --git a/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
index 9cbbe1f..e7481d1 100644
--- a/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
+++ b/tests/lib_2/html/js_function_getter_trust_types/compile_test.dart
@@ -18,25 +18,25 @@
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0, 0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.nonFunctionStatic(0, 0, 0, 0, 0, 0);
// ^
// [cfe] Error: 'nonFunctionStatic' isn't a function or method and can't be invoked.
//^^^^^^^^^^^^^^^^^^^^^^^^^
-// [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
foo.bar.add(4);
// ^
diff --git a/tests/standalone/check_for_aot_snapshot_jit_test.dart b/tests/standalone/check_for_aot_snapshot_jit_test.dart
new file mode 100644
index 0000000..851dc0c5
--- /dev/null
+++ b/tests/standalone/check_for_aot_snapshot_jit_test.dart
@@ -0,0 +1,59 @@
+// 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:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+ final buildDir = path.dirname(Platform.executable);
+ final sdkDir = path.dirname(path.dirname(buildDir));
+ final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+ final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+ final exePath = Platform.resolvedExecutable;
+ final genSnapshotPath =
+ Uri.parse(Platform.executable).resolve('gen_snapshot').path;
+ final powTest = Platform.script.resolve('pow_test.dart').path;
+ final d = Directory.systemTemp.createTempSync('aot_tmp');
+ final kernelOutput = d.uri.resolve('pow_test.dill').path;
+ final aotOutput = d.uri.resolve('pow_test.aot').path;
+
+ final genKernelResult = Process.runSync(
+ 'pkg/vm/tool/gen_kernel',
+ [
+ '--aot',
+ '--platform=$platformDill',
+ '-o',
+ kernelOutput,
+ powTest,
+ ],
+ );
+ Expect.equals(genKernelResult.exitCode, 0);
+
+ final genAotResult = Process.runSync(
+ genSnapshot,
+ [
+ '--snapshot_kind=app-aot-elf',
+ '--elf=$aotOutput',
+ kernelOutput,
+ ],
+ );
+ Expect.equals(genAotResult.exitCode, 0);
+
+ final runAotResult = Process.runSync(
+ exePath,
+ [
+ 'run',
+ aotOutput,
+ ],
+ );
+ Expect.equals(runAotResult.exitCode, 255);
+ Expect.stringContainsInOrder(
+ runAotResult.stderr,
+ [
+ "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
+ ],
+ );
+}
diff --git a/tests/standalone/io/http_ban_http_embedder_test.dart b/tests/standalone/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index 7fd3cb3..0000000
--- a/tests/standalone/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// 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.
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
- await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
- asyncExpectThrows(
- () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: 'foo'}),
- (e) => e is StateError);
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: false}),
- (e) => e is StateError);
- await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: true}));
- });
-}
-
-Future<void> testWithLoopback() async {
- await testBanHttp("127.0.0.1", (httpClient, uri) async {
- await asyncTest(
- () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
- await asyncTest(
- () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
- });
-}
-
-Future<void> testWithIPv6() async {
- if (await supportsIPV6()) {
- await testBanHttp("::1", (httpClient, uri) async {
- await asyncTest(() => httpClient.getUrl(uri));
- });
- }
-}
-
-Future<void> testWithHTTPS() async {
- await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
- asyncExpectThrows(
- () => httpClient.getUrl(Uri(
- scheme: 'https',
- host: uri.host,
- port: uri.port,
- )),
- (e) => e is SocketException || e is HandshakeException);
- });
-}
-
-main() {
- asyncStart();
- Future.wait(<Future>[
- testWithHostname(),
- testWithLoopback(),
- testWithIPv6(),
- testWithHTTPS(),
- ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone/io/http_ban_http_normal_test.dart b/tests/standalone/io/http_ban_http_normal_test.dart
deleted file mode 100644
index 118dd4c..0000000
--- a/tests/standalone/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
- final interfaces = await NetworkInterface.list(
- includeLoopback: false, type: InternetAddressType.IPv4);
- return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
- Future<void> testCode(HttpClient client, Uri uri)) async {
- final httpClient = new HttpClient();
- final server = await HttpServer.bind(serverHost, 0);
- final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
- try {
- await testCode(httpClient, uri);
- } finally {
- httpClient.close(force: true);
- await server.close();
- }
-}
-
-main() async {
- await asyncTest(() async {
- final host = await getLocalHostIP();
- // Normal HTTP request succeeds.
- await testBanHttp(host, (httpClient, uri) async {
- await asyncTest(() => httpClient.getUrl(uri));
- });
- // We can ban HTTP explicitly.
- await testBanHttp(host, (httpClient, uri) async {
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(uri),
- zoneValues: {#dart.library.io.allow_http: false}),
- (e) => e is StateError);
- });
- });
-}
diff --git a/tests/standalone/io/network_policy_configuration_test.dart b/tests/standalone/io/network_policy_configuration_test.dart
new file mode 100644
index 0000000..6ee1bf0
--- /dev/null
+++ b/tests/standalone/io/network_policy_configuration_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["foobar.com",true,true],["foobar.com",true,true],["baz.foobar.com",true,true],["baz.foobar.com",false,false]] -Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void _checkAllows(List<String> domains) {
+ for (final domain in domains) {
+ Expect.isTrue(
+ isInsecureConnectionAllowed(domain), "$domain should be allowed.");
+ }
+}
+
+void _checkDenies(List<String> domains) {
+ for (final domain in domains) {
+ Expect.isFalse(
+ isInsecureConnectionAllowed(domain), "$domain should not be allowed.");
+ }
+}
+
+void main() {
+ // These have no policy but the default is false.
+ _checkDenies(["mailfoobar.com", "abc.com", "oobar.com", "foobar.co"]);
+ // These are explicitly denied.
+ _checkDenies(["baz.foobar.com"]);
+ _checkAllows(
+ ["foobar.com", "test.baz.foobar.com", "test2.test.baz.foobar.com"]);
+}
diff --git a/tests/standalone/io/network_policy_invalid_domain_test.dart b/tests/standalone/io/network_policy_invalid_domain_test.dart
new file mode 100644
index 0000000..971996c
--- /dev/null
+++ b/tests/standalone/io/network_policy_invalid_domain_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["com",true,true]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+// This test passes in an invalid domain as a network policy and checks that
+// loading the policies throws.
+void main() {
+ Expect.throwsArgumentError(() => isInsecureConnectionAllowed("test.com"));
+}
diff --git a/tests/standalone/io/network_policy_tie_breaker_test.dart b/tests/standalone/io/network_policy_tie_breaker_test.dart
new file mode 100644
index 0000000..c25d3ac
--- /dev/null
+++ b/tests/standalone/io/network_policy_tie_breaker_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["baz.foobar.com",true,true],["baz.foobar.com",false,false]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void main() {
+ Expect.isFalse(isInsecureConnectionAllowed("baz.foobar.com"));
+ Expect.isTrue(isInsecureConnectionAllowed("test.baz.foobar.com"));
+}
diff --git a/tests/standalone/io/socket_network_policy_localhost_test.dart b/tests/standalone/io/socket_network_policy_localhost_test.dart
new file mode 100644
index 0000000..957f894
--- /dev/null
+++ b/tests/standalone/io/socket_network_policy_localhost_test.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// Test whether localhost connection succeeds even when insecure connections
+// are banned by default.
+// SharedOptions=-Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnectionByDefault() {
+ asyncExpectThrows(
+ () async => await Socket.connect("domain.invalid", 80),
+ (e) =>
+ e is SocketException &&
+ e.message.contains(
+ "Insecure socket connections are disallowed by platform"));
+}
+
+Future<void> testLocalhostConnection() async {
+ ServerSocket server =
+ await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+ Socket? socket;
+ try {
+ server.listen((_) {});
+ socket = await Socket.connect(InternetAddress.loopbackIPv4, server.port);
+ } finally {
+ server.close();
+ if (socket != null) {
+ socket.close();
+ await socket.done;
+ socket.destroy();
+ }
+ }
+}
+
+Future<void> test() async {
+ testDisallowedConnectionByDefault();
+ await testLocalhostConnection();
+}
+
+void main() {
+ asyncStart();
+ test().whenComplete(() => asyncEnd());
+}
diff --git a/tests/standalone/io/socket_network_policy_test.dart b/tests/standalone/io/socket_network_policy_test.dart
new file mode 100644
index 0000000..f476d67
--- /dev/null
+++ b/tests/standalone/io/socket_network_policy_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["notallowed.domain.invalid",true,false]]
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnection() {
+ asyncExpectThrows(
+ () async => await Socket.connect("foo.notallowed.domain.invalid", 12345),
+ (e) {
+ print((e as SocketException).message);
+ return e is SocketException &&
+ e.message.startsWith(
+ "Insecure socket connections are disallowed by platform");
+ });
+}
+
+void testAllowedConnection() {
+ asyncExpectThrows(
+ () async => await Socket.connect("allowed.domain.invalid", 12345),
+ (e) =>
+ e is SocketException &&
+ !e.message.startsWith(
+ "Insecure socket connections are disallowed by platform"));
+}
+
+void main() {
+ testDisallowedConnection();
+ testAllowedConnection();
+}
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index 01f6276..5eca181 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -13,8 +13,10 @@
[ $system == android ]
entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
-io/http_ban_http_embedder_test: Skip # Requires http server bound to non-loopback; not provided by system.
-io/http_ban_http_normal_test: Skip # Requires http server bound to non-loopback; not provided by system.
+io/network_policy_configuration_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_invalid_domain_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_tie_breaker_test: Skip # Can't pass -D params containing quotes to adb.
+io/socket_network_policy_test: Skip # Can't pass -D params containing quotes to adb.
[ $arch == ia32 && $builder_tag == optimization_counter_threshold ]
io/file_lock_test: SkipSlow # Timeout
diff --git a/tests/standalone/standalone_precompiled.status b/tests/standalone/standalone_precompiled.status
index 672a30e..6953302 100644
--- a/tests/standalone/standalone_precompiled.status
+++ b/tests/standalone/standalone_precompiled.status
@@ -6,6 +6,7 @@
dwarf_stack_trace_test: Pass, RuntimeError # Issue 35563
[ $runtime == dart_precompiled ]
+check_for_aot_snapshot_jit_test: SkipByDesign
http_launch_test: Skip
io/addlatexhash_test: Skip
io/dart_std_io_pipe_test: Skip
diff --git a/tests/standalone_2/check_for_aot_snapshot_jit_test.dart b/tests/standalone_2/check_for_aot_snapshot_jit_test.dart
new file mode 100644
index 0000000..851dc0c5
--- /dev/null
+++ b/tests/standalone_2/check_for_aot_snapshot_jit_test.dart
@@ -0,0 +1,59 @@
+// 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:io';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as path;
+
+main() {
+ final buildDir = path.dirname(Platform.executable);
+ final sdkDir = path.dirname(path.dirname(buildDir));
+ final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
+ final genSnapshot = path.join(buildDir, 'gen_snapshot');
+
+ final exePath = Platform.resolvedExecutable;
+ final genSnapshotPath =
+ Uri.parse(Platform.executable).resolve('gen_snapshot').path;
+ final powTest = Platform.script.resolve('pow_test.dart').path;
+ final d = Directory.systemTemp.createTempSync('aot_tmp');
+ final kernelOutput = d.uri.resolve('pow_test.dill').path;
+ final aotOutput = d.uri.resolve('pow_test.aot').path;
+
+ final genKernelResult = Process.runSync(
+ 'pkg/vm/tool/gen_kernel',
+ [
+ '--aot',
+ '--platform=$platformDill',
+ '-o',
+ kernelOutput,
+ powTest,
+ ],
+ );
+ Expect.equals(genKernelResult.exitCode, 0);
+
+ final genAotResult = Process.runSync(
+ genSnapshot,
+ [
+ '--snapshot_kind=app-aot-elf',
+ '--elf=$aotOutput',
+ kernelOutput,
+ ],
+ );
+ Expect.equals(genAotResult.exitCode, 0);
+
+ final runAotResult = Process.runSync(
+ exePath,
+ [
+ 'run',
+ aotOutput,
+ ],
+ );
+ Expect.equals(runAotResult.exitCode, 255);
+ Expect.stringContainsInOrder(
+ runAotResult.stderr,
+ [
+ "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
+ ],
+ );
+}
diff --git a/tests/standalone_2/io/http_ban_http_embedder_test.dart b/tests/standalone_2/io/http_ban_http_embedder_test.dart
deleted file mode 100644
index 7fd3cb3..0000000
--- a/tests/standalone_2/io/http_ban_http_embedder_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// 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.
-
-// SharedOptions=-Ddart.library.io.allow_http=false
-
-import 'dart:async';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-import 'http_ban_http_normal_test.dart';
-import 'http_bind_test.dart';
-
-Future<void> testWithHostname() async {
- await testBanHttp(await getLocalHostIP(), (httpClient, httpUri) async {
- asyncExpectThrows(
- () async => await httpClient.getUrl(httpUri), (e) => e is StateError);
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: 'foo'}),
- (e) => e is StateError);
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: false}),
- (e) => e is StateError);
- await asyncTest(() => runZoned(() => httpClient.getUrl(httpUri),
- zoneValues: {#dart.library.io.allow_http: true}));
- });
-}
-
-Future<void> testWithLoopback() async {
- await testBanHttp("127.0.0.1", (httpClient, uri) async {
- await asyncTest(
- () => httpClient.getUrl(Uri.parse('http://localhost:${uri.port}')));
- await asyncTest(
- () => httpClient.getUrl(Uri.parse('http://127.0.0.1:${uri.port}')));
- });
-}
-
-Future<void> testWithIPv6() async {
- if (await supportsIPV6()) {
- await testBanHttp("::1", (httpClient, uri) async {
- await asyncTest(() => httpClient.getUrl(uri));
- });
- }
-}
-
-Future<void> testWithHTTPS() async {
- await testBanHttp(await getLocalHostIP(), (httpClient, uri) async {
- asyncExpectThrows(
- () => httpClient.getUrl(Uri(
- scheme: 'https',
- host: uri.host,
- port: uri.port,
- )),
- (e) => e is SocketException || e is HandshakeException);
- });
-}
-
-main() {
- asyncStart();
- Future.wait(<Future>[
- testWithHostname(),
- testWithLoopback(),
- testWithIPv6(),
- testWithHTTPS(),
- ]).then((_) => asyncEnd());
-}
diff --git a/tests/standalone_2/io/http_ban_http_normal_test.dart b/tests/standalone_2/io/http_ban_http_normal_test.dart
deleted file mode 100644
index 118dd4c..0000000
--- a/tests/standalone_2/io/http_ban_http_normal_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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';
-import 'dart:io';
-
-import "package:async_helper/async_helper.dart";
-
-Future<String> getLocalHostIP() async {
- final interfaces = await NetworkInterface.list(
- includeLoopback: false, type: InternetAddressType.IPv4);
- return interfaces.first.addresses.first.address;
-}
-
-Future<void> testBanHttp(String serverHost,
- Future<void> testCode(HttpClient client, Uri uri)) async {
- final httpClient = new HttpClient();
- final server = await HttpServer.bind(serverHost, 0);
- final uri = Uri(scheme: 'http', host: serverHost, port: server.port);
- try {
- await testCode(httpClient, uri);
- } finally {
- httpClient.close(force: true);
- await server.close();
- }
-}
-
-main() async {
- await asyncTest(() async {
- final host = await getLocalHostIP();
- // Normal HTTP request succeeds.
- await testBanHttp(host, (httpClient, uri) async {
- await asyncTest(() => httpClient.getUrl(uri));
- });
- // We can ban HTTP explicitly.
- await testBanHttp(host, (httpClient, uri) async {
- asyncExpectThrows(
- () async => await runZoned(() => httpClient.getUrl(uri),
- zoneValues: {#dart.library.io.allow_http: false}),
- (e) => e is StateError);
- });
- });
-}
diff --git a/tests/standalone_2/io/network_policy_configuration_test.dart b/tests/standalone_2/io/network_policy_configuration_test.dart
new file mode 100644
index 0000000..6ee1bf0
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_configuration_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["foobar.com",true,true],["foobar.com",true,true],["baz.foobar.com",true,true],["baz.foobar.com",false,false]] -Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void _checkAllows(List<String> domains) {
+ for (final domain in domains) {
+ Expect.isTrue(
+ isInsecureConnectionAllowed(domain), "$domain should be allowed.");
+ }
+}
+
+void _checkDenies(List<String> domains) {
+ for (final domain in domains) {
+ Expect.isFalse(
+ isInsecureConnectionAllowed(domain), "$domain should not be allowed.");
+ }
+}
+
+void main() {
+ // These have no policy but the default is false.
+ _checkDenies(["mailfoobar.com", "abc.com", "oobar.com", "foobar.co"]);
+ // These are explicitly denied.
+ _checkDenies(["baz.foobar.com"]);
+ _checkAllows(
+ ["foobar.com", "test.baz.foobar.com", "test2.test.baz.foobar.com"]);
+}
diff --git a/tests/standalone_2/io/network_policy_invalid_domain_test.dart b/tests/standalone_2/io/network_policy_invalid_domain_test.dart
new file mode 100644
index 0000000..971996c
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_invalid_domain_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["com",true,true]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+// This test passes in an invalid domain as a network policy and checks that
+// loading the policies throws.
+void main() {
+ Expect.throwsArgumentError(() => isInsecureConnectionAllowed("test.com"));
+}
diff --git a/tests/standalone_2/io/network_policy_tie_breaker_test.dart b/tests/standalone_2/io/network_policy_tie_breaker_test.dart
new file mode 100644
index 0000000..c25d3ac
--- /dev/null
+++ b/tests/standalone_2/io/network_policy_tie_breaker_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["baz.foobar.com",true,true],["baz.foobar.com",false,false]]
+
+import 'dart:io';
+
+import "package:expect/expect.dart";
+
+void main() {
+ Expect.isFalse(isInsecureConnectionAllowed("baz.foobar.com"));
+ Expect.isTrue(isInsecureConnectionAllowed("test.baz.foobar.com"));
+}
diff --git a/tests/standalone_2/io/socket_network_policy_localhost_test.dart b/tests/standalone_2/io/socket_network_policy_localhost_test.dart
new file mode 100644
index 0000000..e531815
--- /dev/null
+++ b/tests/standalone_2/io/socket_network_policy_localhost_test.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// Test whether localhost connection succeeds even when insecure connections
+// are banned by default.
+// SharedOptions=-Ddart.library.io.may_insecurely_connect_to_all_domains=false
+
+import 'dart:async';
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnectionByDefault() {
+ asyncExpectThrows(
+ () async => await Socket.connect("domain.invalid", 80),
+ (e) =>
+ e is SocketException &&
+ e.message.contains(
+ "Insecure socket connections are disallowed by platform"));
+}
+
+Future<void> testLocalhostConnection() async {
+ ServerSocket server =
+ await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
+ Socket socket;
+ try {
+ server.listen((_) {});
+ socket = await Socket.connect(InternetAddress.loopbackIPv4, server.port);
+ } finally {
+ server.close();
+ if (socket != null) {
+ socket.close();
+ await socket.done;
+ socket.destroy();
+ }
+ }
+}
+
+Future<void> test() async {
+ testDisallowedConnectionByDefault();
+ await testLocalhostConnection();
+}
+
+void main() {
+ asyncStart();
+ test().whenComplete(() => asyncEnd());
+}
diff --git a/tests/standalone_2/io/socket_network_policy_test.dart b/tests/standalone_2/io/socket_network_policy_test.dart
new file mode 100644
index 0000000..f476d67
--- /dev/null
+++ b/tests/standalone_2/io/socket_network_policy_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// SharedOptions=-Ddart.library.io.domain_network_policies=[["notallowed.domain.invalid",true,false]]
+
+import 'dart:io';
+
+import "package:async_helper/async_helper.dart";
+
+void testDisallowedConnection() {
+ asyncExpectThrows(
+ () async => await Socket.connect("foo.notallowed.domain.invalid", 12345),
+ (e) {
+ print((e as SocketException).message);
+ return e is SocketException &&
+ e.message.startsWith(
+ "Insecure socket connections are disallowed by platform");
+ });
+}
+
+void testAllowedConnection() {
+ asyncExpectThrows(
+ () async => await Socket.connect("allowed.domain.invalid", 12345),
+ (e) =>
+ e is SocketException &&
+ !e.message.startsWith(
+ "Insecure socket connections are disallowed by platform"));
+}
+
+void main() {
+ testDisallowedConnection();
+ testAllowedConnection();
+}
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index 01f6276..5eca181 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -13,8 +13,10 @@
[ $system == android ]
entrypoints_verification_test: Skip # Requires shared objects which the test script doesn't "adb push".
-io/http_ban_http_embedder_test: Skip # Requires http server bound to non-loopback; not provided by system.
-io/http_ban_http_normal_test: Skip # Requires http server bound to non-loopback; not provided by system.
+io/network_policy_configuration_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_invalid_domain_test: Skip # Can't pass -D params containing quotes to adb.
+io/network_policy_tie_breaker_test: Skip # Can't pass -D params containing quotes to adb.
+io/socket_network_policy_test: Skip # Can't pass -D params containing quotes to adb.
[ $arch == ia32 && $builder_tag == optimization_counter_threshold ]
io/file_lock_test: SkipSlow # Timeout
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index 417ed1d..829aafc 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -3,6 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
[ $runtime == dart_precompiled ]
+check_for_aot_snapshot_jit_test: SkipByDesign
http_launch_test: Skip
io/addlatexhash_test: Skip
io/dart_std_io_pipe_test: Skip
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index 286b4b7..2a622d1 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -25,6 +25,7 @@
Force build after DEPS format revert
Force build while trybots are broken, to check builders for brokenness.
Force build to test recipe changes
+Force build to test recipe changes
Analyzer branch commits:
Force build on new analyzer-branch linux build with new workflow
diff --git a/tools/VERSION b/tools/VERSION
index 0944177..d0b396f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
MAJOR 2
MINOR 10
PATCH 0
-PRERELEASE 1
+PRERELEASE 2
PRERELEASE_PATCH 0
ABI_VERSION 39
OLDEST_SUPPORTED_ABI_VERSION 39
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 5cc65e9..1e84bd0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -392,16 +392,16 @@
}
},
"unittest-weak-asserts-no-sdk-(linux|mac|win)": {
- "options": {
- "compiler": "dartk",
- "enable-asserts": true,
- "mode": "release",
- "runtime": "vm",
- "timeout": 240,
- "enable-experiment": [
- "non-nullable"
- ]
- }
+ "options": {
+ "compiler": "dartk",
+ "enable-asserts": true,
+ "mode": "release",
+ "runtime": "vm",
+ "timeout": 240,
+ "enable-experiment": [
+ "non-nullable"
+ ]
+ }
},
"analyzer-unittest-asserts-(debug|product|release)-(linux|mac|win)": {
"options": {
@@ -707,32 +707,32 @@
"builder-tag": "canary"
}
},
- "dartkp-weak-asserts-(linux|mac)-(debug|product|release)-x64": {
+ "dartkp-weak-asserts-(linux|mac)-(debug|product|release)-(simarm64|x64)": {
"options": {
"enable-experiment": [
"non-nullable"
],
- "gen-kernel-options": [
+ "gen-kernel-options": [
"--no-sound-null-safety"
],
"enable-asserts": true,
- "vm-options": [
+ "vm-options": [
"--no-sound-null-safety"
],
"builder-tag": "vm_nnbd"
}
},
- "dartkp-weak-asserts-win-(debug|product|release)-x64": {
+ "dartkp-weak-asserts-win-(debug|product|release)-(simarm64|x64)": {
"options": {
"enable-experiment": [
"non-nullable"
],
- "gen-kernel-options": [
+ "gen-kernel-options": [
"--no-sound-null-safety"
],
"enable-asserts": true,
"use-elf": true,
- "vm-options": [
+ "vm-options": [
"--no-sound-null-safety"
],
"builder-tag": "vm_nnbd"
@@ -744,7 +744,7 @@
"non-nullable"
],
"enable-asserts": true,
- "vm-options": [
+ "vm-options": [
"--no-sound-null-safety"
],
"builder-tag": "vm_nnbd"
@@ -761,7 +761,7 @@
"builder-tag": "vm_nnbd"
}
},
- "dartkp-strong-(linux|mac)-(debug|product|release)-x64": {
+ "dartkp-strong-(linux|mac)-(debug|product|release)-(simarm64|x64)": {
"options": {
"enable-experiment": [
"non-nullable"
@@ -775,7 +775,7 @@
"builder-tag": "vm_nnbd"
}
},
- "dartkp-strong-win-(debug|product|release)-x64": {
+ "dartkp-strong-win-(debug|product|release)-(simarm64|x64)": {
"options": {
"use-elf": true,
"enable-experiment": [
@@ -913,9 +913,6 @@
]
}
},
- "dartkb-abi-linux-release-x64": {
- "__comment__": "This configuration is only used for a custom test runner. If it conflicts with a new configuration you are adding, you can make this configuration more specific by adding options."
- },
"dartdevk-checked-(linux|mac|win)-(debug|product|release)-(chrome|firefox)": {
"options": {
"checked": true,
@@ -1295,6 +1292,7 @@
},
{
"builders": [
+ "vm-kernel-precomp-nnbd-linux-release-simarm64",
"vm-kernel-precomp-nnbd-linux-release-x64"
],
"meta": {
@@ -1316,7 +1314,7 @@
"co19"
],
"fileset": "vm-kernel",
- "shards": 2
+ "shards": 3
},
{
"name": "co19 nnbd tests in strong mode",
@@ -1325,7 +1323,7 @@
"co19"
],
"fileset": "vm-kernel",
- "shards": 2
+ "shards": 3
},
{
"name": "vm nnbd tests in weak mode with asserts",
@@ -1351,7 +1349,9 @@
"lib",
"standalone/io",
"vm"
- ]
+ ],
+ "fileset": "vm-kernel",
+ "shards": 3
}
]
},
@@ -3443,30 +3443,6 @@
},
{
"builders": [
- "vm-dartkb-linux-release-x64-abi"
- ],
- "meta": {
- "description": "This configuration runs tests for each supported ABI version."
- },
- "steps": [
- {
- "name": "build dart",
- "script": "tools/build.py",
- "arguments": [
- "--bytecode",
- "create_sdk_with_abi_versions"
- ]
- },
- {
- "name": "run tests",
- "script": "tools/run_abi_tests.py",
- "testRunner": true,
- "arguments": ["-ndartkb-abi-linux-release-x64"]
- }
- ]
- },
- {
- "builders": [
"vm-kernel-precomp-linux-debug-simarm_x64",
"vm-kernel-precomp-linux-release-simarm_x64"
],
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 7a9a03f..e9b21ba 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -104,6 +104,8 @@
help: "Alternative invalidation strategy for incremental compilation"
category: "CFE"
+ value-class:
+ help: "Value class"
#
# Flags below this line are shipped, retired, or rejected, cannot be specified
# on the command line, and will eventually be removed.
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 8c5406f..254af29 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -99,39 +99,6 @@
out = "$root_out_dir/dev_compiler/build/web/dart_stack_trace_mapper.js"
}
-# Apply dev_compiler's patch files to create the Dart version of the dartdevc
-# SDK.
-prebuilt_dart_action("dartdevc_patch_sdk") {
- deps = [
- ":dartdevc_files_stamp",
- ":dartdevc_sdk_patch_stamp",
-
- # The patch script uses several packages, including analyzer, so consider
- # it dirty if any of those change.
- "../../pkg:pkg_files_stamp",
- ]
-
- script = "../../pkg/dev_compiler/tool/patch_sdk.dart"
-
- inputs = sdk_lib_files
-
- # Arbitrarily use the version file as a token file to check against to see if
- # the sources have changed.
- # TODO(rnystrom): List the outputs more precisely?
- outputs = [ "$patched_sdk_dir/version" ]
-
- vm_args = [ "-Dsdk_hash=$sdk_hash" ]
-
- args = [
- "--libraries",
- rebase_path("$sdk_root/lib/libraries.json"),
- "--target",
- "dartdevc",
- "--out",
- rebase_path("$patched_sdk_dir/"),
- ]
-}
-
# Builds everything needed to run dartdevc tests using test.dart.
group("dartdevc_test") {
deps = [