Version 2.5.0-dev.4.0

Merge commit '027071318ff1333fefcf7b4e475c10a8f68ebc0d' into dev
diff --git a/DEPS b/DEPS
index b32253a..8aba950 100644
--- a/DEPS
+++ b/DEPS
@@ -107,7 +107,7 @@
   "mustache_tag" : "5e81b12215566dbe2473b2afd01a8a8aedd56ad9",
   "oauth2_tag": "1.2.1",
   "observatory_pub_packages_rev": "0894122173b0f98eb08863a7712e78407d4477bc",
-  "package_config_tag": "1.0.5",
+  "package_config_tag": "2453cd2e78c2db56ee2669ced17ce70dd00bf576", # should be 1.1.0
   "package_resolver_tag": "1.0.10",
   "path_tag": "1.6.2",
   "pedantic_tag": "v1.8.0",
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index b919610..48fbe59 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -498,6 +498,7 @@
   ParserErrorCode.INVALID_CONSTRUCTOR_NAME,
   ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE,
   ParserErrorCode.INVALID_HEX_ESCAPE,
+  ParserErrorCode.INVALID_INITIALIZER,
   ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION,
   ParserErrorCode.INVALID_OPERATOR,
   ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index cec3fe1..d5a9bbb 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -357,6 +357,8 @@
 
   static const ParserErrorCode INVALID_HEX_ESCAPE = _INVALID_HEX_ESCAPE;
 
+  static const ParserErrorCode INVALID_INITIALIZER = _INVALID_INITIALIZER;
+
   static const ParserErrorCode INVALID_LITERAL_IN_CONFIGURATION =
       const ParserErrorCode('INVALID_LITERAL_IN_CONFIGURATION',
           "The literal in a configuration can't contain interpolation.",
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index 80d4ee8b..732496e 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -97,6 +97,7 @@
   _EXTERNAL_CONSTRUCTOR_WITH_BODY,
   _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
   _VAR_AND_TYPE,
+  _INVALID_INITIALIZER,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -190,7 +191,7 @@
 
 const ParserErrorCode _DUPLICATED_MODIFIER = const ParserErrorCode(
     'DUPLICATED_MODIFIER', r"The modifier '#lexeme' was already specified.",
-    correction: "Try removing all but one occurence of the modifier.");
+    correction: "Try removing all but one occurrence of the modifier.");
 
 const ParserErrorCode _DUPLICATE_DEFERRED = const ParserErrorCode(
     'DUPLICATE_DEFERRED',
@@ -342,6 +343,10 @@
     'INVALID_HEX_ESCAPE',
     r"An escape sequence starting with '\x' must be followed by 2 hexadecimal digits.");
 
+const ParserErrorCode _INVALID_INITIALIZER = const ParserErrorCode(
+    'INVALID_INITIALIZER', r"Not a valid initializer.",
+    correction: "To initialize a field, use the syntax 'name = value'.");
+
 const ParserErrorCode _INVALID_OPERATOR = const ParserErrorCode(
     'INVALID_OPERATOR',
     r"The string '#lexeme' isn't a user-definable operator.");
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 131f83f..71e5474 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -32,6 +32,7 @@
         messageFieldInitializerOutsideConstructor,
         messageIllegalAssignmentToNonAssignable,
         messageInterpolationInUri,
+        messageInvalidInitializer,
         messageInvalidSuperInInitializer,
         messageInvalidThisInInitializer,
         messageMissingAssignableSelector,
@@ -419,8 +420,7 @@
           initializerObject.target, initializerObject);
     }
 
-    throw new UnsupportedError('unsupported initializer:'
-        ' ${initializerObject.runtimeType} :: $initializerObject');
+    return null;
   }
 
   AstNode buildInitializerTargetExpressionRecovery(
@@ -455,9 +455,7 @@
       return ast.redirectingConstructorInvocation(
           target.thisKeyword, null, null, argumentList);
     }
-    throw new UnsupportedError('unsupported initializer:'
-        ' ${initializerObject.runtimeType} :: $initializerObject'
-        ' %% target : ${target.runtimeType} :: $target');
+    return null;
   }
 
   void checkFieldFormalParameters(FormalParameterList parameters) {
@@ -1367,11 +1365,14 @@
     var initializers = <ConstructorInitializer>[];
     for (Object initializerObject in initializerObjects) {
       ConstructorInitializer initializer = buildInitializer(initializerObject);
-      if (initializer == null) {
-        throw new UnsupportedError('unsupported initializer:'
-            ' ${initializerObject.runtimeType} :: $initializerObject');
+      if (initializer != null) {
+        initializers.add(initializer);
+      } else {
+        handleRecoverableError(
+            messageInvalidInitializer,
+            initializerObject is AstNode ? initializerObject.beginToken : colon,
+            initializerObject is AstNode ? initializerObject.endToken : colon);
       }
-      initializers.add(initializer);
     }
 
     push(initializers);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index bde9710..63c5052 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -792,11 +792,7 @@
       return;
     }
     if (_checkForEachParts(node, identifier)) {
-      Element variableElement = identifier.staticElement;
-      if (variableElement is VariableElement && variableElement.isConst) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, identifier);
-      }
+      _checkForAssignmentToFinal(identifier);
     }
     super.visitForEachPartsWithIdentifier(node);
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
index 586123a..426c86f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_text_printer.dart
@@ -333,6 +333,26 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    _compilationUnitMember(node);
+    _token(node.extensionKeyword);
+    node.name?.accept(this);
+    node.typeParameters?.accept(this);
+    _token(node.onKeyword);
+    node.extendedType.accept(this);
+    _token(node.leftBracket);
+    node.members.accept(this);
+    _token(node.rightBracket);
+  }
+
+  @override
+  void visitExtensionOverride(ExtensionOverride node) {
+    node.extensionName.accept(this);
+    node.typeArguments.accept(this);
+    node.argumentList.accept(this);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     _classMember(node);
     _token(node.staticKeyword);
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
index e011614..899e2e5 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code.dart
@@ -1571,7 +1571,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, 28, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index ba715e5..eb70ef3 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -231,7 +231,7 @@
 }
 ''', [
       error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE, 28, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 383986c..3718020 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -97,6 +97,14 @@
     expect(rightHandSide.name, 'value');
   }
 
+  void test_parseConstructor_invalidInitializer() {
+    // https://github.com/dart-lang/sdk/issues/37693
+    parseCompilationUnit('class C{ C() : super() * (); }', errors: [
+      expectedError(ParserErrorCode.INVALID_INITIALIZER, 15, 12),
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+    ]);
+  }
+
   void test_parseConstructor_nullSuperArgList_openBrace_37735() {
     // https://github.com/dart-lang/sdk/issues/37735
     var unit = parseCompilationUnit('class{const():super.{n', errors: [
@@ -1232,6 +1240,14 @@
     ]);
   }
 
+  void test_listLiteral_invalidElement_37697() {
+    // https://github.com/dart-lang/sdk/issues/37674
+    parseExpression('[<y.<z>(){}]', errors: [
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 4, 1),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1),
+    ]);
+  }
+
   void test_listLiteral_spread_disabled() {
     ListLiteral list =
         parseExpression('[1, ...[2]]', featureSet: beforeUiAsCode, errors: [
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 74b8c43..5bc3108 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -58,4 +58,19 @@
   Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
     fail('Unexpected invocation of resolve');
   }
+
+  @override
+  String get defaultPackageName {
+    fail('Unexpected invocation of defaultPackageName');
+  }
+
+  @override
+  String libraryMetadata(Uri libraryUri, String key) {
+    fail('Unexpected invocation of libraryMetadata');
+  }
+
+  @override
+  String packageMetadata(String packageName, String key) {
+    fail('Unexpected invocation of packageMetadata');
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
index a3b7863..a9022b5 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
@@ -61,4 +61,16 @@
       error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
     ]);
   }
+
+  test_localVariable_inForEach() async {
+    await assertErrorsInCode('''
+f() {
+  const x = 0;
+  for (x in <int>[1, 2]) {
+    print(x);
+  }
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 28, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
index 2839d0a..cef7998 100644
--- a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -113,6 +113,18 @@
     ]);
   }
 
+  test_localVariable_inForEach() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  for (x in <int>[1, 2]) {
+    print(x);
+  }
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 28, 1),
+    ]);
+  }
+
   test_topLevelVariable() async {
     await assertErrorsInCode('''
 final x = 0;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index af985cd..ab3bc02 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -6044,7 +6044,7 @@
       FunctionEntity function, TypeVariableType typeVariable) {
     DartType bound =
         _elementEnvironment.getTypeVariableDefaultType(typeVariable.element);
-    if (bound.containsTypeVariables) {
+    if (bound.containsTypeVariables && !options.experimentNewRti) {
       // TODO(33422): Support type variables in default
       // types. Temporarily using the "any" type (encoded as -2) to
       // avoid failing on bounds checks.
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index b081701..e1cb003 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -494,7 +494,8 @@
     if (contents != null) {
       _packagesUri = file;
       try {
-        Map<String, Uri> map = package_config.parse(contents, file);
+        Map<String, Uri> map =
+            package_config.parse(contents, file, allowDefaultPackage: true);
         return new MapPackages(map);
       } on FormatException catch (e) {
         report(
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 7db58b7..81f0051 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -6402,6 +6402,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidInitializer = const MessageCode(
     "InvalidInitializer",
+    index: 90,
     message: r"""Not a valid initializer.""",
     tip: r"""To initialize a field, use the syntax 'name = value'.""");
 
diff --git a/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
index e17c773..29ae839 100644
--- a/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
+++ b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
@@ -26,7 +26,7 @@
   }
 
   void beginStatement() {
-    var set = Set<Variable>.identity();
+    Set<Variable> set = Set<Variable>.identity();
     _stack.add(set);
   }
 
@@ -35,7 +35,7 @@
   }
 
   void write(Variable variable) {
-    for (var i = 0; i < _stack.length; ++i) {
+    for (int i = 0; i < _stack.length; ++i) {
       _stack[i].add(variable);
     }
   }
@@ -100,7 +100,8 @@
     TypeOperations<Variable, Type> typeOperations,
     FunctionBodyAccess<Variable> functionBody,
   ) {
-    var emptySet = FlowModel<Variable, Type>(false).notAssigned;
+    _VariableSet<Variable> emptySet =
+        FlowModel<Variable, Type>(false).notAssigned;
     return FlowAnalysis._(
       nodeOperations,
       typeOperations,
@@ -139,8 +140,8 @@
   }
 
   void conditional_elseBegin(Expression thenExpression) {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> afterThen = _current;
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _conditionalEnd(thenExpression);
     // Tail of the stack: falseThen, trueThen
@@ -151,20 +152,20 @@
 
   void conditional_end(
       Expression conditionalExpression, Expression elseExpression) {
-    var afterThen = _stack.removeLast();
-    var afterElse = _current;
+    FlowModel<Variable, Type> afterThen = _stack.removeLast();
+    FlowModel<Variable, Type> afterElse = _current;
 
     _conditionalEnd(elseExpression);
     // Tail of the stack: falseThen, trueThen, falseElse, trueElse
 
-    var trueElse = _stack.removeLast();
-    var falseElse = _stack.removeLast();
+    FlowModel<Variable, Type> trueElse = _stack.removeLast();
+    FlowModel<Variable, Type> falseElse = _stack.removeLast();
 
-    var trueThen = _stack.removeLast();
-    var falseThen = _stack.removeLast();
+    FlowModel<Variable, Type> trueThen = _stack.removeLast();
+    FlowModel<Variable, Type> falseThen = _stack.removeLast();
 
-    var trueResult = _join(trueThen, trueElse);
-    var falseResult = _join(falseThen, falseElse);
+    FlowModel<Variable, Type> trueResult = _join(trueThen, trueElse);
+    FlowModel<Variable, Type> falseResult = _join(falseThen, falseElse);
 
     _condition = conditionalExpression;
     _conditionTrue = trueResult;
@@ -177,7 +178,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
     _current = trueCondition;
   }
 
@@ -191,7 +192,8 @@
     }
 
     _condition = binaryExpression;
-    var currentPromoted = _current.markNonNullable(typeOperations, variable);
+    FlowModel<Variable, Type> currentPromoted =
+        _current.markNonNullable(typeOperations, variable);
     if (notEqual) {
       _conditionTrue = currentPromoted;
       _conditionFalse = _current;
@@ -214,7 +216,7 @@
   void doStatement_conditionBegin() {
     // Tail of the stack: break, continue
 
-    var continueState = _stack.removeLast();
+    FlowModel<Variable, Type> continueState = _stack.removeLast();
     _current = _join(_current, continueState);
   }
 
@@ -223,8 +225,8 @@
     // Tail of the stack:  break, falseCondition, trueCondition
 
     _stack.removeLast(); // trueCondition
-    var falseCondition = _stack.removeLast();
-    var breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
@@ -234,7 +236,7 @@
   void finish() {
     assert(_stack.isEmpty);
     assert(() {
-      var variablesNotAdded =
+      Set<Variable> variablesNotAdded =
           _referencedVariables.difference(Set<Variable>.from(_addedVariables));
       assert(variablesNotAdded.isEmpty,
           'Variables not passed to add: $variablesNotAdded');
@@ -249,7 +251,7 @@
   }
 
   void forEachStatement_end() {
-    var afterIterable = _stack.removeLast();
+    FlowModel<Variable, Type> afterIterable = _stack.removeLast();
     _current = _join(_current, afterIterable);
   }
 
@@ -257,7 +259,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
 
     _statementToStackIndex[node] = _stack.length;
     _stack.add(null); // break
@@ -273,16 +275,16 @@
 
   void forStatement_end() {
     // Tail of the stack: falseCondition, break
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
 
   void forStatement_updaterBegin() {
     // Tail of the stack: falseCondition, break, continue
-    var afterBody = _current;
-    var continueState = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _current;
+    FlowModel<Variable, Type> continueState = _stack.removeLast();
 
     _current = _join(afterBody, continueState);
   }
@@ -291,9 +293,9 @@
     _stack.add(_current);
 
     Set<Variable> notPromoted = null;
-    for (var entry in _current.promoted.entries) {
-      var variable = entry.key;
-      var promotedType = entry.value;
+    for (MapEntry<Variable, Type> entry in _current.promoted.entries) {
+      Variable variable = entry.key;
+      Type promotedType = entry.value;
       if (promotedType != null &&
           functionBody.isPotentiallyMutatedInScope(variable)) {
         notPromoted ??= Set<Variable>.identity();
@@ -311,7 +313,7 @@
   }
 
   void handleBreak(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
+    int breakIndex = _statementToStackIndex[target];
     if (breakIndex != null) {
       _stack[breakIndex] = _join(_stack[breakIndex], _current);
     }
@@ -319,9 +321,9 @@
   }
 
   void handleContinue(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
+    int breakIndex = _statementToStackIndex[target];
     if (breakIndex != null) {
-      var continueIndex = breakIndex + 1;
+      int continueIndex = breakIndex + 1;
       _stack[continueIndex] = _join(_stack[continueIndex], _current);
     }
     _current = _current.setReachable(false);
@@ -334,7 +336,7 @@
   }
 
   void ifNullExpression_end() {
-    var afterLeft = _stack.removeLast();
+    FlowModel<Variable, Type> afterLeft = _stack.removeLast();
     _current = _join(_current, afterLeft);
   }
 
@@ -343,8 +345,8 @@
   }
 
   void ifStatement_elseBegin() {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> afterThen = _current;
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
     _stack.add(afterThen);
     _current = falseCondition;
   }
@@ -366,7 +368,7 @@
     _conditionalEnd(condition);
     // Tail of the stack:  falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
     _current = trueCondition;
   }
 
@@ -398,11 +400,11 @@
     _conditionalEnd(rightOperand);
     // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
 
-    var trueRight = _stack.removeLast();
-    var falseRight = _stack.removeLast();
+    FlowModel<Variable, Type> trueRight = _stack.removeLast();
+    FlowModel<Variable, Type> falseRight = _stack.removeLast();
 
-    var trueLeft = _stack.removeLast();
-    var falseLeft = _stack.removeLast();
+    FlowModel<Variable, Type> trueLeft = _stack.removeLast();
+    FlowModel<Variable, Type> falseLeft = _stack.removeLast();
 
     FlowModel<Variable, Type> trueResult;
     FlowModel<Variable, Type> falseResult;
@@ -414,7 +416,7 @@
       falseResult = falseRight;
     }
 
-    var afterResult = _join(trueResult, falseResult);
+    FlowModel<Variable, Type> afterResult = _join(trueResult, falseResult);
 
     _condition = wholeExpression;
     _conditionTrue = trueResult;
@@ -429,18 +431,18 @@
     // Tail of the stack: falseLeft, trueLeft
 
     if (isAnd) {
-      var trueLeft = _stack.last;
+      FlowModel<Variable, Type> trueLeft = _stack.last;
       _current = trueLeft;
     } else {
-      var falseLeft = _stack[_stack.length - 2];
+      FlowModel<Variable, Type> falseLeft = _stack[_stack.length - 2];
       _current = falseLeft;
     }
   }
 
   void logicalNot_end(Expression notExpression, Expression operand) {
     _conditionalEnd(operand);
-    var trueExpr = _stack.removeLast();
-    var falseExpr = _stack.removeLast();
+    FlowModel<Variable, Type> trueExpr = _stack.removeLast();
+    FlowModel<Variable, Type> falseExpr = _stack.removeLast();
 
     _condition = notExpression;
     _conditionTrue = falseExpr;
@@ -465,9 +467,9 @@
 
   void switchStatement_end(Statement switchStatement, bool hasDefault) {
     // Tail of the stack: break, continue, afterExpression
-    var afterExpression = _current = _stack.removeLast();
+    FlowModel<Variable, Type> afterExpression = _current = _stack.removeLast();
     _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
 
     if (hasDefault) {
       // breakState should not be null because we should have joined it with
@@ -493,25 +495,26 @@
 
   void tryCatchStatement_bodyEnd(Set<Variable> assignedInBody) {
     _variablesReferenced(assignedInBody);
-    var beforeBody = _stack.removeLast();
-    var beforeCatch = beforeBody.removePromotedAll(assignedInBody);
+    FlowModel<Variable, Type> beforeBody = _stack.removeLast();
+    FlowModel<Variable, Type> beforeCatch =
+        beforeBody.removePromotedAll(assignedInBody);
     _stack.add(beforeCatch);
     _stack.add(_current); // afterBodyAndCatches
     // Tail of the stack: beforeCatch, afterBodyAndCatches
   }
 
   void tryCatchStatement_catchBegin() {
-    var beforeCatch = _stack[_stack.length - 2];
+    FlowModel<Variable, Type> beforeCatch = _stack[_stack.length - 2];
     _current = beforeCatch;
   }
 
   void tryCatchStatement_catchEnd() {
-    var afterBodyAndCatches = _stack.last;
+    FlowModel<Variable, Type> afterBodyAndCatches = _stack.last;
     _stack.last = _join(afterBodyAndCatches, _current);
   }
 
   void tryCatchStatement_end() {
-    var afterBodyAndCatches = _stack.removeLast();
+    FlowModel<Variable, Type> afterBodyAndCatches = _stack.removeLast();
     _stack.removeLast(); // beforeCatch
     _current = afterBodyAndCatches;
   }
@@ -522,7 +525,7 @@
 
   void tryFinallyStatement_end(Set<Variable> assignedInFinally) {
     _variablesReferenced(assignedInFinally);
-    var afterBody = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _stack.removeLast();
     _current = _current.restrict(
       typeOperations,
       _emptySet,
@@ -533,8 +536,8 @@
 
   void tryFinallyStatement_finallyBegin(Set<Variable> assignedInBody) {
     _variablesReferenced(assignedInBody);
-    var beforeTry = _stack.removeLast();
-    var afterBody = _current;
+    FlowModel<Variable, Type> beforeTry = _stack.removeLast();
+    FlowModel<Variable, Type> afterBody = _current;
     _stack.add(afterBody);
     _current = _join(afterBody, beforeTry.removePromotedAll(assignedInBody));
   }
@@ -544,7 +547,7 @@
     _conditionalEnd(condition);
     // Tail of the stack: falseCondition, trueCondition
 
-    var trueCondition = _stack.removeLast();
+    FlowModel<Variable, Type> trueCondition = _stack.removeLast();
 
     _statementToStackIndex[whileStatement] = _stack.length;
     _stack.add(null); // break
@@ -560,8 +563,8 @@
 
   void whileStatement_end() {
     _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
+    FlowModel<Variable, Type> breakState = _stack.removeLast();
+    FlowModel<Variable, Type> falseCondition = _stack.removeLast();
 
     _current = _join(falseCondition, breakState);
   }
@@ -657,8 +660,9 @@
   /// optional [assigned] boolean indicates whether the variable is assigned at
   /// the point of declaration.
   FlowModel<Variable, Type> add(Variable variable, {bool assigned: false}) {
-    var newNotAssigned = assigned ? notAssigned : notAssigned.add(variable);
-    var newPromoted = Map<Variable, Type>.from(promoted);
+    _VariableSet<Variable> newNotAssigned =
+        assigned ? notAssigned : notAssigned.add(variable);
+    Map<Variable, Type> newPromoted = Map<Variable, Type>.from(promoted);
     newPromoted[variable] = null;
 
     return FlowModel<Variable, Type>._(
@@ -675,12 +679,12 @@
   /// assigned?  Does it matter?
   FlowModel<Variable, Type> markNonNullable(
       TypeOperations<Variable, Type> typeOperations, Variable variable) {
-    var previousType = promoted[variable];
+    Type previousType = promoted[variable];
     previousType ??= typeOperations.variableType(variable);
-    var type = typeOperations.promoteToNonNull(previousType);
+    Type type = typeOperations.promoteToNonNull(previousType);
 
     if (!typeOperations.isSameType(type, previousType)) {
-      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      Map<Variable, Type> newPromoted = <Variable, Type>{}..addAll(promoted);
       newPromoted[variable] = type;
       return FlowModel<Variable, Type>._(
         reachable,
@@ -706,12 +710,12 @@
     Variable variable,
     Type type,
   ) {
-    var previousType = promoted[variable];
+    Type previousType = promoted[variable];
     previousType ??= typeOperations.variableType(variable);
 
     if (typeOperations.isSubtypeOf(type, previousType) &&
         !typeOperations.isSameType(type, previousType)) {
-      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      Map<Variable, Type> newPromoted = <Variable, Type>{}..addAll(promoted);
       newPromoted[variable] = type;
       return FlowModel<Variable, Type>._(
         reachable,
@@ -743,7 +747,7 @@
   /// later in the loop body.  If we switch to a fixed point analysis, we should
   /// be able to remove this method.
   FlowModel<Variable, Type> removePromotedAll(Set<Variable> variables) {
-    var newPromoted = _removePromotedAll(promoted, variables);
+    Map<Variable, Type> newPromoted = _removePromotedAll(promoted, variables);
 
     if (identical(newPromoted, promoted)) return this;
 
@@ -780,8 +784,8 @@
     FlowModel<Variable, Type> other,
     Set<Variable> unsafe,
   ) {
-    var newReachable = reachable && other.reachable;
-    var newNotAssigned = notAssigned.intersect(
+    bool newReachable = reachable && other.reachable;
+    _VariableSet<Variable> newNotAssigned = notAssigned.intersect(
       empty: emptySet,
       other: other.notAssigned,
     );
@@ -792,13 +796,13 @@
       newNotAssigned = other.notAssigned;
     }
 
-    var newPromoted = <Variable, Type>{};
+    Map<Variable, Type> newPromoted = <Variable, Type>{};
     bool promotedMatchesThis = true;
     bool promotedMatchesOther = other.promoted.length == promoted.length;
-    for (var entry in promoted.entries) {
-      var variable = entry.key;
-      var thisType = entry.value;
-      var otherType = other.promoted[variable];
+    for (MapEntry<Variable, Type> entry in promoted.entries) {
+      Variable variable = entry.key;
+      Type thisType = entry.value;
+      Type otherType = other.promoted[variable];
       if (!unsafe.contains(variable)) {
         if (otherType != null &&
             (thisType == null ||
@@ -867,11 +871,12 @@
   /// TODO(paulberry): allow for writes that preserve type promotions.
   FlowModel<Variable, Type> write(TypeOperations<Variable, Type> typeOperations,
       _VariableSet<Variable> emptySet, Variable variable) {
-    var newNotAssigned = typeOperations.isLocalVariable(variable)
-        ? notAssigned.remove(emptySet, variable)
-        : notAssigned;
+    _VariableSet<Variable> newNotAssigned =
+        typeOperations.isLocalVariable(variable)
+            ? notAssigned.remove(emptySet, variable)
+            : notAssigned;
 
-    var newPromoted = _removePromoted(promoted, variable);
+    Map<Variable, Type> newPromoted = _removePromoted(promoted, variable);
 
     if (identical(newNotAssigned, notAssigned) &&
         identical(newPromoted, promoted)) {
@@ -891,7 +896,7 @@
       Map<Variable, Type> map, Variable variable) {
     if (map[variable] == null) return map;
 
-    var result = Map<Variable, Type>.from(map);
+    Map<Variable, Type> result = Map<Variable, Type>.from(map);
     result[variable] = null;
     return result;
   }
@@ -905,11 +910,11 @@
     if (map.isEmpty) return const {};
     if (variables.isEmpty) return map;
 
-    var result = <Variable, Type>{};
-    var noChanges = true;
-    for (var entry in map.entries) {
-      var variable = entry.key;
-      var promotedType = entry.value;
+    Map<Variable, Type> result = <Variable, Type>{};
+    bool noChanges = true;
+    for (MapEntry<Variable, Type> entry in map.entries) {
+      Variable variable = entry.key;
+      Type promotedType = entry.value;
       if (variables.contains(variable) && promotedType != null) {
         result[variable] = null;
         noChanges = false;
@@ -943,9 +948,10 @@
     if (first.reachable && !second.reachable) return first;
     if (!first.reachable && second.reachable) return second;
 
-    var newReachable = first.reachable || second.reachable;
-    var newNotAssigned = first.notAssigned.union(second.notAssigned);
-    var newPromoted =
+    bool newReachable = first.reachable || second.reachable;
+    _VariableSet<Variable> newNotAssigned =
+        first.notAssigned.union(second.notAssigned);
+    Map<Variable, Type> newPromoted =
         FlowModel.joinPromoted(typeOperations, first.promoted, second.promoted);
 
     return FlowModel._identicalOrNew(
@@ -967,16 +973,16 @@
     if (identical(first, second)) return first;
     if (first.isEmpty || second.isEmpty) return const {};
 
-    var result = <Variable, Type>{};
-    var alwaysFirst = true;
-    var alwaysSecond = true;
-    for (var entry in first.entries) {
-      var variable = entry.key;
+    Map<Variable, Type> result = <Variable, Type>{};
+    bool alwaysFirst = true;
+    bool alwaysSecond = true;
+    for (MapEntry<Variable, Type> entry in first.entries) {
+      Variable variable = entry.key;
       if (!second.containsKey(variable)) {
         alwaysFirst = false;
       } else {
-        var firstType = entry.value;
-        var secondType = second[variable];
+        Type firstType = entry.value;
+        Type secondType = second[variable];
         if (identical(firstType, secondType)) {
           result[variable] = firstType;
         } else if (firstType == null) {
@@ -1039,9 +1045,9 @@
       Map<Variable, Type> p2) {
     if (p1.length != p2.length) return false;
     if (!p1.keys.toSet().containsAll(p2.keys)) return false;
-    for (var entry in p1.entries) {
-      var p1Value = entry.value;
-      var p2Value = p2[entry.key];
+    for (MapEntry<Variable, Type> entry in p1.entries) {
+      Type p1Value = entry.value;
+      Type p2Value = p2[entry.key];
       if (p1Value == null) {
         if (p2Value != null) return false;
       } else {
@@ -1098,9 +1104,9 @@
       return this;
     }
 
-    var length = variables.length;
-    var newVariables = List<Variable>(length + 1);
-    for (var i = 0; i < length; ++i) {
+    int length = variables.length;
+    List<Variable> newVariables = List<Variable>(length + 1);
+    for (int i = 0; i < length; ++i) {
       newVariables[i] = variables[i];
     }
     newVariables[length] = addedVariable;
@@ -1108,16 +1114,16 @@
   }
 
   _VariableSet<Variable> addAll(Iterable<Variable> variables) {
-    var result = this;
-    for (var variable in variables) {
+    _VariableSet<Variable> result = this;
+    for (Variable variable in variables) {
       result = result.add(variable);
     }
     return result;
   }
 
   bool contains(Variable variable) {
-    var length = variables.length;
-    for (var i = 0; i < length; ++i) {
+    int length = variables.length;
+    for (int i = 0; i < length; ++i) {
       if (identical(variables[i], variable)) {
         return true;
       }
@@ -1133,7 +1139,7 @@
     if (identical(this, other)) return this;
 
     // TODO(scheglov) optimize
-    var newVariables =
+    List<Variable> newVariables =
         variables.toSet().intersection(other.variables.toSet()).toList();
 
     if (newVariables.isEmpty) return empty;
@@ -1148,15 +1154,15 @@
       return this;
     }
 
-    var length = variables.length;
+    int length = variables.length;
     if (length == 1) {
       return empty;
     }
 
-    var newVariables = List<Variable>(length - 1);
-    var newIndex = 0;
-    for (var i = 0; i < length; ++i) {
-      var variable = variables[i];
+    List<Variable> newVariables = List<Variable>(length - 1);
+    int newIndex = 0;
+    for (int i = 0; i < length; ++i) {
+      Variable variable = variables[i];
       if (!identical(variable, removedVariable)) {
         newVariables[newIndex++] = variable;
       }
@@ -1173,10 +1179,10 @@
       return this;
     }
 
-    var result = this;
-    var otherVariables = other.variables;
-    for (var i = 0; i < otherVariables.length; ++i) {
-      var otherVariable = otherVariables[i];
+    _VariableSet<Variable> result = this;
+    List<Variable> otherVariables = other.variables;
+    for (int i = 0; i < otherVariables.length; ++i) {
+      Variable otherVariable = otherVariables[i];
       result = result.add(otherVariable);
     }
     return result;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index c15646d..5d697e6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -740,7 +740,7 @@
     debugEvent("endInitializer");
     inFieldInitializer = false;
     assert(!inInitializer);
-    final member = this.member;
+    final ModifierBuilder member = this.member;
     Object node = pop();
     Initializer initializer;
     if (node is Initializer) {
@@ -2507,7 +2507,7 @@
   @override
   void endForControlFlow(Token token) {
     debugEvent("ForControlFlow");
-    var entry = pop();
+    Object entry = pop();
     int updateExpressionCount = pop();
     pop(); // left separator
     pop(); // left parenthesis
@@ -2638,7 +2638,7 @@
     List<Expression> expressions =
         new List<Expression>.filled(count, null, growable: true);
     for (int i = count - 1; i >= 0; i--) {
-      var elem = pop();
+      Object elem = pop();
       if (elem != invalidCollectionElement) {
         expressions[i] = toValue(elem);
       } else {
@@ -2691,9 +2691,9 @@
       typeArgument = implicitTypeArgument;
     }
 
-    var expressions = <Expression>[];
+    List<Expression> expressions = <Expression>[];
     if (setOrMapEntries != null) {
-      for (var entry in setOrMapEntries) {
+      for (dynamic entry in setOrMapEntries) {
         if (entry is MapEntry) {
           // TODO(danrubel): report the error on the colon
           addProblem(fasta.templateExpectedButGot.withArguments(','),
@@ -2730,9 +2730,10 @@
   ) {
     debugEvent("LiteralSetOrMap");
 
-    var setOrMapEntries = new List<dynamic>.filled(count, null, growable: true);
+    List<dynamic> setOrMapEntries =
+        new List<dynamic>.filled(count, null, growable: true);
     for (int i = count - 1; i >= 0; i--) {
-      var elem = pop();
+      Object elem = pop();
       // TODO(danrubel): Revise this to handle control flow and spread
       if (elem == invalidCollectionElement) {
         setOrMapEntries.removeAt(i);
@@ -2751,7 +2752,7 @@
     // TODO(danrubel): Since type resolution is needed to disambiguate
     // set or map in some situations, consider always deferring determination
     // until the type resolution phase.
-    final typeArgCount = typeArguments?.length;
+    final int typeArgCount = typeArguments?.length;
     bool isSet = typeArgCount == 1 ? true : typeArgCount != null ? false : null;
 
     for (int i = 0; i < setOrMapEntries.length; ++i) {
@@ -3981,8 +3982,8 @@
   @override
   void endIfControlFlow(Token token) {
     debugEvent("endIfControlFlow");
-    var entry = pop();
-    var condition = pop(); // parenthesized expression
+    Object entry = pop();
+    Object condition = pop(); // parenthesized expression
     Token ifToken = pop();
     typePromoter?.enterElse();
     typePromoter?.exitConditional();
@@ -4020,9 +4021,9 @@
   @override
   void endIfElseControlFlow(Token token) {
     debugEvent("endIfElseControlFlow");
-    var elseEntry = pop(); // else entry
-    var thenEntry = pop(); // then entry
-    var condition = pop(); // parenthesized expression
+    Object elseEntry = pop(); // else entry
+    Object thenEntry = pop(); // then entry
+    Object condition = pop(); // parenthesized expression
     Token ifToken = pop();
     typePromoter?.exitConditional();
     if (!library.loader.target.enableControlFlowCollections) {
@@ -4098,7 +4099,7 @@
   @override
   void handleSpreadExpression(Token spreadToken) {
     debugEvent("SpreadExpression");
-    var expression = pop();
+    Object expression = pop();
     if (!library.loader.target.enableSpreadCollections) {
       handleRecoverableError(
           fasta.templateUnexpectedToken.withArguments(spreadToken),
@@ -4418,7 +4419,7 @@
   @override
   void endForInControlFlow(Token token) {
     debugEvent("ForInControlFlow");
-    var entry = pop();
+    Object entry = pop();
     Token inToken = pop();
     Token forToken = pop();
     Token awaitToken = pop(NullValue.AwaitToken);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index a025fd0..d9ba7e9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -11,6 +11,7 @@
     show
         Constructor,
         Field,
+        IntLiteral,
         InvalidExpression,
         Let,
         Node,
@@ -85,6 +86,9 @@
 
 import '../scope.dart';
 
+import '../type_inference/type_promotion.dart'
+    show TypePromotionFact, TypePromotionScope;
+
 import 'body_builder.dart' show noLocation;
 
 import 'constness.dart' show Constness;
@@ -194,7 +198,7 @@
   /// The returned expression evaluates to the assigned value, unless
   /// [voidContext] is true, in which case it may evaluate to anything.
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     return _finish(_makeSimpleWrite(value, voidContext, complexAssignment),
         complexAssignment);
   }
@@ -215,9 +219,9 @@
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     if (voidContext) {
-      var nullAwareCombiner = _forest.createConditionalExpression(
+      Expression nullAwareCombiner = _forest.createConditionalExpression(
           buildIsNull(_makeRead(complexAssignment), offset, _helper),
           null,
           _makeWrite(value, false, complexAssignment),
@@ -227,8 +231,9 @@
       complexAssignment?.nullAwareCombiner = nullAwareCombiner;
       return _finish(nullAwareCombiner, complexAssignment);
     }
-    var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
-    var nullAwareCombiner = _forest.createConditionalExpression(
+    VariableDeclaration tmp =
+        new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    Expression nullAwareCombiner = _forest.createConditionalExpression(
         buildIsNull(new VariableGet(tmp), offset, _helper),
         null,
         _makeWrite(value, false, complexAssignment),
@@ -247,11 +252,11 @@
       Procedure interfaceTarget,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    var complexAssignment = startComplexAssignment(value);
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(value);
     complexAssignment?.isPreIncDec = isPreIncDec;
     complexAssignment?.isPostIncDec = isPostIncDec;
-    var combiner = makeBinary(_makeRead(complexAssignment), binaryOperator,
-        interfaceTarget, value, _helper,
+    Expression combiner = makeBinary(_makeRead(complexAssignment),
+        binaryOperator, interfaceTarget, value, _helper,
         offset: offset);
     complexAssignment?.combiner = combiner;
     return _finish(_makeWrite(combiner, voidContext, complexAssignment),
@@ -286,18 +291,20 @@
           interfaceTarget: interfaceTarget,
           isPostIncDec: true);
     }
-    var rhs = _forest.createIntLiteral(1, null)..fileOffset = offset;
-    var complexAssignment = startComplexAssignment(rhs);
-    var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    IntLiteral rhs = _forest.createIntLiteral(1, null)..fileOffset = offset;
+    ComplexAssignmentJudgment complexAssignment = startComplexAssignment(rhs);
+    VariableDeclaration value =
+        new VariableDeclaration.forValue(_makeRead(complexAssignment));
     valueAccess() => new VariableGet(value);
-    var combiner = makeBinary(
+    Expression combiner = makeBinary(
         valueAccess(), binaryOperator, interfaceTarget, rhs, _helper,
         offset: offset);
     complexAssignment?.combiner = combiner;
     complexAssignment?.isPostIncDec = true;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        _makeWrite(combiner, true, complexAssignment),
-        _helper.functionNestingLevel);
+    VariableDeclarationJudgment dummy =
+        new VariableDeclarationJudgment.forValue(
+            _makeWrite(combiner, true, complexAssignment),
+            _helper.functionNestingLevel);
     return _finish(
         makeLet(value, makeLet(dummy, valueAccess())), complexAssignment);
   }
@@ -531,10 +538,10 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var fact = _helper.typePromoter
+    TypePromotionFact fact = _helper.typePromoter
         ?.getFactForAccess(variable, _helper.functionNestingLevel);
-    var scope = _helper.typePromoter?.currentScope;
-    var read = new VariableGetJudgment(variable, fact, scope)
+    TypePromotionScope scope = _helper.typePromoter?.currentScope;
+    VariableGetJudgment read = new VariableGetJudgment(variable, fact, scope)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -664,7 +671,7 @@
   @override
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiver, name, value, setter)
+    PropertySet write = new PropertySet(receiver, name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -672,7 +679,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
+    PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -681,7 +688,7 @@
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
+    PropertySet write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -780,7 +787,7 @@
     if (getter == null) {
       _helper.warnUnresolvedGet(name, offsetForToken(token));
     }
-    var read =
+    PropertyGet read =
         new PropertyGet(_forest.createThisExpression(token), name, getter)
           ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -793,7 +800,7 @@
     if (setter == null) {
       _helper.warnUnresolvedSet(name, offsetForToken(token));
     }
-    var write = new PropertySet(
+    PropertySet write = new PropertySet(
         _forest.createThisExpression(token), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -866,7 +873,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
+    PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
@@ -875,7 +882,7 @@
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
+    PropertySet write = new PropertySet(receiverAccess(), name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -884,8 +891,8 @@
   @override
   Expression _finish(
       Expression body, ComplexAssignmentJudgment complexAssignment) {
-    var offset = offsetForToken(token);
-    var nullAwareGuard = _forest.createConditionalExpression(
+    int offset = offsetForToken(token);
+    Expression nullAwareGuard = _forest.createConditionalExpression(
         buildIsNull(receiverAccess(), offset, _helper),
         null,
         _forest.createNullLiteral(null)..fileOffset = offset,
@@ -955,8 +962,9 @@
       _helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertyGet] when possible.
-    var read = new SuperPropertyGetJudgment(name, interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
+    SuperPropertyGetJudgment read =
+        new SuperPropertyGetJudgment(name, interfaceTarget: getter)
+          ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
     return read;
   }
@@ -968,7 +976,7 @@
       _helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
     }
     // TODO(ahe): Use [DirectPropertySet] when possible.
-    var write = new SuperPropertySet(name, value, setter)
+    SuperPropertySet write = new SuperPropertySet(name, value, setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
     return write;
@@ -1048,8 +1056,8 @@
 
   @override
   Expression _makeSimpleRead() {
-    var read = new MethodInvocationJudgment(receiver, indexGetName,
-        _forest.createArguments(<Expression>[index], token),
+    MethodInvocationJudgment read = new MethodInvocationJudgment(receiver,
+        indexGetName, _forest.createArguments(<Expression>[index], token),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
     return read;
@@ -1059,7 +1067,9 @@
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(receiver, indexSetName,
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
+        receiver,
+        indexSetName,
         _forest.createArguments(<Expression>[index, value], token),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
@@ -1069,7 +1079,9 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(receiverAccess(), indexGetName,
+    MethodInvocationJudgment read = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token),
         interfaceTarget: getter)
       ..fileOffset = offsetForToken(token);
@@ -1081,7 +1093,9 @@
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(receiverAccess(), indexSetName,
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
@@ -1095,8 +1109,8 @@
       Expression value, ComplexAssignmentJudgment complexAssignment) {
     // The call to []= does not return the value like direct-style assignments
     // do.  We need to bind the value in a let.
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         receiverAccess(),
         indexSetName,
         _forest.createArguments(
@@ -1104,8 +1118,9 @@
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        write, _helper.functionNestingLevel);
+    VariableDeclarationJudgment dummy =
+        new VariableDeclarationJudgment.forValue(
+            write, _helper.functionNestingLevel);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1194,8 +1209,8 @@
 
   Expression _makeWriteAndReturn(
       Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(
@@ -1203,7 +1218,7 @@
         interfaceTarget: setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
+    VariableDeclaration dummy = new VariableDeclaration.forValue(write);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1220,7 +1235,7 @@
   Expression _makeSimpleWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(<Expression>[index, value], token),
@@ -1232,7 +1247,7 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(
+    MethodInvocationJudgment read = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token),
@@ -1246,7 +1261,7 @@
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
+    MethodInvocationJudgment write = new MethodInvocationJudgment(
         _forest.createThisExpression(token),
         indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
@@ -1311,19 +1326,19 @@
 
   Expression _makeWriteAndReturn(
       Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
+    VariableDeclaration valueVariable = new VariableDeclaration.forValue(value);
     if (setter == null) {
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(
+    SuperMethodInvocation write = new SuperMethodInvocation(
         indexSetName,
         _forest.createArguments(
             <Expression>[indexAccess(), new VariableGet(valueVariable)], token),
         setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
+    VariableDeclaration dummy = new VariableDeclaration.forValue(write);
     return makeLet(
         valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
@@ -1349,7 +1364,7 @@
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(indexSetName,
+    SuperMethodInvocation write = new SuperMethodInvocation(indexSetName,
         _forest.createArguments(<Expression>[index, value], token), setter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.write = write;
@@ -1362,7 +1377,7 @@
       _helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
           isSuper: true);
     }
-    var read = new SuperMethodInvocation(indexGetName,
+    SuperMethodInvocation read = new SuperMethodInvocation(indexGetName,
         _forest.createArguments(<Expression>[indexAccess()], token), getter)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -1377,7 +1392,7 @@
       _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
           isSuper: true);
     }
-    var write = new SuperMethodInvocation(
+    SuperMethodInvocation write = new SuperMethodInvocation(
         indexSetName,
         _forest.createArguments(<Expression>[indexAccess(), value], token),
         setter)
@@ -1802,7 +1817,7 @@
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     builder.importDependency.targetLibrary;
-    var read = new LoadLibraryTearOffJudgment(
+    LoadLibraryTearOffJudgment read = new LoadLibraryTearOffJudgment(
         builder.importDependency, builder.createTearoffMethod(_helper.forest))
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -3266,7 +3281,7 @@
     sink.write(", name: ");
     sink.write(name.name);
     sink.write(", arguments: ");
-    var node = arguments;
+    Arguments node = arguments;
     if (node is Node) {
       printNodeOn(node, sink);
     } else {
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 2c7a1d3..dcfc73d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -56,9 +56,9 @@
   }
 
   void visitAssertStatementJudgment(AssertStatementJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var messageJudgment = node.messageJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    Expression messageJudgment = node.messageJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -77,7 +77,7 @@
     if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
       typeContext = inferrer.wrapFutureOrType(typeContext);
     }
-    var operand = node.operand;
+    Expression operand = node.operand;
     inferrer.inferExpression(operand, typeContext, true, isVoidAllowed: true);
     inferrer.storeInferredType(
         node,
@@ -86,7 +86,7 @@
   }
 
   void visitBlockJudgment(BlockJudgment node) {
-    for (var judgment in node.judgments) {
+    for (Statement judgment in node.judgments) {
       inferrer.inferStatement(judgment);
     }
   }
@@ -103,7 +103,7 @@
     node.inferredType =
         inferrer.inferExpression(node.targetJudgment, typeContext, true);
     node.variable.type = getInferredType(node, inferrer);
-    for (var judgment in node.cascadeJudgments) {
+    for (Expression judgment in node.cascadeJudgments) {
       inferrer.inferExpression(
           judgment, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true);
@@ -114,10 +114,10 @@
   @override
   void visitConditionalExpression(
       ConditionalExpression node, DartType typeContext) {
-    var condition = node.condition;
-    var then = node.then;
-    var otherwise = node.otherwise;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression condition = node.condition;
+    Expression then = node.then;
+    Expression otherwise = node.otherwise;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(condition, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         expectedType,
@@ -135,7 +135,7 @@
   @override
   void visitConstructorInvocation(
       ConstructorInvocation node, DartType typeContext) {
-    var library = inferrer.engine.beingInferred[node.target];
+    LibraryBuilder library = inferrer.engine.beingInferred[node.target];
     if (library != null) {
       // There is a cyclic dependency where inferring the types of the
       // initializing formals of a constructor required us to infer the
@@ -152,26 +152,30 @@
           node.target.fileOffset,
           name.length,
           node.target.fileUri);
-      for (var declaration in node.target.function.positionalParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.positionalParameters) {
         declaration.type ??= const InvalidType();
       }
-      for (var declaration in node.target.function.namedParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.namedParameters) {
         declaration.type ??= const InvalidType();
       }
     } else if ((library = inferrer.engine.toBeInferred[node.target]) != null) {
       inferrer.engine.toBeInferred.remove(node.target);
       inferrer.engine.beingInferred[node.target] = library;
-      for (var declaration in node.target.function.positionalParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.positionalParameters) {
         inferrer.engine.inferInitializingFormal(declaration, node.target);
       }
-      for (var declaration in node.target.function.namedParameters) {
+      for (VariableDeclaration declaration
+          in node.target.function.namedParameters) {
         inferrer.engine.inferInitializingFormal(declaration, node.target);
       }
       inferrer.engine.beingInferred.remove(node.target);
     }
     bool hasExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function.functionType,
@@ -196,16 +200,16 @@
       DeferredCheckJudgment node, DartType typeContext) {
     // Since the variable is not used in the body we don't need to type infer
     // it.  We can just type infer the body.
-    var judgment = node.judgment;
+    Expression judgment = node.judgment;
     inferrer.inferExpression(judgment, typeContext, true, isVoidAllowed: true);
     node.inferredType = getInferredType(judgment, inferrer);
     return null;
   }
 
   void visitDoJudgment(DoJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
+    Expression conditionJudgment = node.conditionJudgment;
     inferrer.inferStatement(node.body);
-    var boolType = inferrer.coreTypes.boolClass.rawType;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(conditionJudgment, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
         boolType,
@@ -232,7 +236,7 @@
       FactoryConstructorInvocationJudgment node, DartType typeContext) {
     bool hadExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
         node.target.function.functionType,
@@ -252,7 +256,7 @@
   }
 
   void visitShadowFieldInitializer(ShadowFieldInitializer node) {
-    var initializerType =
+    DartType initializerType =
         inferrer.inferExpression(node.value, node.field.type, true);
     inferrer.ensureAssignable(
         node.field.type, initializerType, node.value, node.fileOffset);
@@ -410,7 +414,7 @@
   }
 
   void visitForJudgment(ForJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
+    Expression conditionJudgment = node.conditionJudgment;
     for (VariableDeclaration variable in node.variables) {
       if (variable.name == null) {
         Expression initializer = variable.initializer;
@@ -424,7 +428,7 @@
       }
     }
     if (conditionJudgment != null) {
-      var expectedType = inferrer.coreTypes.boolClass.rawType;
+      InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
       inferrer.inferExpression(
           conditionJudgment, expectedType, !inferrer.isTopLevel);
       inferrer.ensureAssignable(
@@ -433,7 +437,7 @@
           node.condition,
           node.condition.fileOffset);
     }
-    for (var update in node.updateJudgments) {
+    for (Expression update in node.updateJudgments) {
       inferrer.inferExpression(
           update, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true);
@@ -454,22 +458,22 @@
     inferrer.inferMetadataKeepingHelper(node.variable.annotations);
     DartType returnContext =
         node._hasImplicitReturnType ? null : node.function.returnType;
-    var inferenceResult = visitFunctionNodeJudgment(
+    ExpressionInferenceResult inferenceResult = visitFunctionNodeJudgment(
         node.functionJudgment, null, returnContext, node.fileOffset);
     node.variable.type = inferenceResult.type;
   }
 
   @override
   void visitFunctionExpression(FunctionExpression node, DartType typeContext) {
-    var inferenceResult = visitFunctionNodeJudgment(
+    ExpressionInferenceResult inferenceResult = visitFunctionNodeJudgment(
         node.function, typeContext, null, node.fileOffset);
     inferrer.storeInferredType(node, inferenceResult.type);
   }
 
   void visitInvalidSuperInitializerJudgment(
       InvalidSuperInitializerJudgment node) {
-    var substitution = Substitution.fromSupertype(inferrer.classHierarchy
-        .getClassAsInstanceOf(
+    Substitution substitution = Substitution.fromSupertype(
+        inferrer.classHierarchy.getClassAsInstanceOf(
             inferrer.thisType.classNode, node.target.enclosingClass));
     inferrer.inferInvocation(
         null,
@@ -482,12 +486,12 @@
   }
 
   void visitIfNullJudgment(IfNullJudgment node, DartType typeContext) {
-    var leftJudgment = node.leftJudgment;
-    var rightJudgment = node.rightJudgment;
+    Expression leftJudgment = node.leftJudgment;
+    Expression rightJudgment = node.rightJudgment;
     // To infer `e0 ?? e1` in context K:
     // - Infer e0 in context K to get T0
     inferrer.inferExpression(leftJudgment, typeContext, true);
-    var lhsType = getInferredType(leftJudgment, inferrer);
+    DartType lhsType = getInferredType(leftJudgment, inferrer);
     node.variable.type = lhsType;
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
@@ -498,7 +502,7 @@
       inferrer.inferExpression(rightJudgment, typeContext, true,
           isVoidAllowed: true);
     }
-    var rhsType = getInferredType(rightJudgment, inferrer);
+    DartType rhsType = getInferredType(rightJudgment, inferrer);
     // - Let T = greatest closure of K with respect to `?` if K is not `_`, else
     //   UP(t0, t1)
     // - Then the inferred type is T.
@@ -509,8 +513,8 @@
   }
 
   void visitIfJudgment(IfJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -539,13 +543,13 @@
 
   void visitIndexAssignmentJudgment(
       IndexAssignmentJudgment node, DartType typeContext) {
-    var receiverType = node._inferReceiver(inferrer);
-    var writeMember =
+    DartType receiverType = node._inferReceiver(inferrer);
+    Object writeMember =
         inferrer.findMethodInvocationMember(receiverType, node.write);
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member
     // when doing compound assignment?
-    var calleeType = inferrer.getCalleeFunctionType(
+    FunctionType calleeType = inferrer.getCalleeFunctionType(
         inferrer.getCalleeType(writeMember, receiverType), false);
     DartType expectedIndexTypeForWrite;
     DartType indexContext = const UnknownType();
@@ -558,7 +562,7 @@
       writeContext = calleeType.positionalParameters[1];
     }
     inferrer.inferExpression(node.index, indexContext, true);
-    var indexType = getInferredType(node.index, inferrer);
+    DartType indexType = getInferredType(node.index, inferrer);
     node._storeLetType(inferrer, node.index, indexType);
     if (writeContext is! UnknownType) {
       inferrer.ensureAssignable(
@@ -570,9 +574,9 @@
     InvocationExpression read = node.read;
     DartType readType;
     if (read != null) {
-      var readMember = inferrer.findMethodInvocationMember(receiverType, read,
-          instrumented: false);
-      var calleeFunctionType = inferrer.getCalleeFunctionType(
+      Object readMember = inferrer
+          .findMethodInvocationMember(receiverType, read, instrumented: false);
+      FunctionType calleeFunctionType = inferrer.getCalleeFunctionType(
           inferrer.getCalleeType(readMember, receiverType), false);
       inferrer.ensureAssignable(
           getPositionalParameterType(calleeFunctionType, 0),
@@ -580,10 +584,12 @@
           node._getInvocationArguments(inferrer, read).positional[0],
           read.fileOffset);
       readType = calleeFunctionType.returnType;
-      var desugaredInvocation = read is MethodInvocation ? read : null;
-      var checkKind = inferrer.preCheckInvocationContravariance(node.receiver,
-          receiverType, readMember, desugaredInvocation, read.arguments, read);
-      var replacedRead = inferrer.handleInvocationContravariance(
+      MethodInvocation desugaredInvocation =
+          read is MethodInvocation ? read : null;
+      MethodContravarianceCheckKind checkKind =
+          inferrer.preCheckInvocationContravariance(node.receiver, receiverType,
+              readMember, desugaredInvocation, read.arguments, read);
+      Expression replacedRead = inferrer.handleInvocationContravariance(
           checkKind,
           desugaredInvocation,
           read.arguments,
@@ -855,8 +861,8 @@
 
   void visitListLiteralJudgment(
       ListLiteralJudgment node, DartType typeContext) {
-    var listClass = inferrer.coreTypes.listClass;
-    var listType = listClass.thisType;
+    Class listClass = inferrer.coreTypes.listClass;
+    InterfaceType listType = listClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredTypeArgument;
     List<DartType> formalTypes;
@@ -930,9 +936,9 @@
 
   @override
   void visitLogicalExpression(LogicalExpression node, DartType typeContext) {
-    var boolType = inferrer.coreTypes.boolClass.rawType;
-    var left = node.left;
-    var right = node.right;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
+    Expression left = node.left;
+    Expression right = node.right;
     inferrer.inferExpression(left, boolType, !inferrer.isTopLevel);
     inferrer.inferExpression(right, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, getInferredType(left, inferrer),
@@ -1267,8 +1273,8 @@
   }
 
   void visitMapLiteralJudgment(MapLiteralJudgment node, DartType typeContext) {
-    var mapClass = inferrer.coreTypes.mapClass;
-    var mapType = mapClass.thisType;
+    Class mapClass = inferrer.coreTypes.mapClass;
+    InterfaceType mapType = mapClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredKeyType;
     DartType inferredValueType;
@@ -1551,7 +1557,7 @@
         }
       }
     }
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, node.receiver, node.fileOffset, node._isImplicitCall, typeContext,
         desugaredInvocation: node);
     node.inferredType = inferenceResult.type;
@@ -1568,8 +1574,8 @@
 
   @override
   void visitNot(Not node, DartType typeContext) {
-    var operand = node.operand;
-    var boolType = inferrer.coreTypes.boolClass.rawType;
+    Expression operand = node.operand;
+    InterfaceType boolType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(operand, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(boolType, getInferredType(operand, inferrer),
         node.operand, node.fileOffset);
@@ -1577,7 +1583,7 @@
 
   void visitNullAwareMethodInvocationJudgment(
       NullAwareMethodInvocationJudgment node, DartType typeContext) {
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, node.variable.initializer, node.fileOffset, false, typeContext,
         receiverVariable: node.variable,
         desugaredInvocation: node._desugaredInvocation);
@@ -1615,12 +1621,12 @@
 
   void visitPropertyAssignmentJudgment(
       PropertyAssignmentJudgment node, DartType typeContext) {
-    var receiverType = node._inferReceiver(inferrer);
+    DartType receiverType = node._inferReceiver(inferrer);
 
     DartType readType;
     if (node.read != null) {
-      var readMember = inferrer.findPropertyGetMember(receiverType, node.read,
-          instrumented: false);
+      Object readMember = inferrer
+          .findPropertyGetMember(receiverType, node.read, instrumented: false);
       readType = inferrer.getCalleeType(readMember, receiverType);
       inferrer.handlePropertyGetContravariance(
           node.receiver,
@@ -1638,7 +1644,7 @@
     // To replicate analyzer behavior, we base type inference on the write
     // member.  TODO(paulberry): would it be better to use the read member when
     // doing compound assignment?
-    var writeContext = inferrer.getSetterType(writeMember, receiverType);
+    DartType writeContext = inferrer.getSetterType(writeMember, receiverType);
     node._inferRhs(inferrer, readType, writeContext);
     node.nullAwareGuard?.staticType = node.inferredType;
     node._replaceWithDesugared();
@@ -1676,8 +1682,8 @@
   void visitRethrow(Rethrow node, DartType typeContext) {}
 
   void visitReturnJudgment(ReturnJudgment node) {
-    var judgment = node.judgment;
-    var closureContext = inferrer.closureContext;
+    Expression judgment = node.judgment;
+    ClosureContext closureContext = inferrer.closureContext;
     DartType typeContext = !closureContext.isGenerator
         ? closureContext.returnOrYieldContext
         : const UnknownType();
@@ -1694,8 +1700,8 @@
   }
 
   void visitSetLiteralJudgment(SetLiteralJudgment node, DartType typeContext) {
-    var setClass = inferrer.coreTypes.setClass;
-    var setType = setClass.thisType;
+    Class setClass = inferrer.coreTypes.setClass;
+    InterfaceType setType = setClass.thisType;
     List<DartType> inferredTypes;
     DartType inferredTypeArgument;
     List<DartType> formalTypes;
@@ -1772,14 +1778,14 @@
   void visitStaticAssignmentJudgment(
       StaticAssignmentJudgment node, DartType typeContext) {
     DartType readType = const DynamicType(); // Only used in error recovery
-    var read = node.read;
+    Expression read = node.read;
     if (read is StaticGet) {
       readType = read.target.getterType;
       node._storeLetType(inferrer, read, readType);
     }
     Member writeMember;
     DartType writeContext = const UnknownType();
-    var write = node.write;
+    Expression write = node.write;
     if (write is StaticSet) {
       writeContext = write.target.setterType;
       writeMember = write.target;
@@ -1792,9 +1798,9 @@
 
   @override
   void visitStaticGet(StaticGet node, DartType typeContext) {
-    var target = node.target;
+    Member target = node.target;
     TypeInferenceEngine.resolveInferenceNode(target);
-    var type = target.getterType;
+    DartType type = target.getterType;
     if (target is Procedure && target.kind == ProcedureKind.Method) {
       type = inferrer.instantiateTearOff(type, typeContext, node);
     }
@@ -1808,8 +1814,12 @@
         : new FunctionType([], const DynamicType());
     bool hadExplicitTypeArguments =
         getExplicitTypeArguments(node.arguments) != null;
-    var inferenceResult = inferrer.inferInvocation(typeContext, node.fileOffset,
-        calleeType, calleeType.returnType, node.arguments);
+    ExpressionInferenceResult inferenceResult = inferrer.inferInvocation(
+        typeContext,
+        node.fileOffset,
+        calleeType,
+        calleeType.returnType,
+        node.arguments);
     inferrer.storeInferredType(node, inferenceResult.type);
     if (!hadExplicitTypeArguments && node.target != null) {
       inferrer.library?.checkBoundsInStaticInvocation(
@@ -1822,7 +1832,7 @@
   void visitStringConcatenation(
       StringConcatenation node, DartType typeContext) {
     if (!inferrer.isTopLevel) {
-      for (var expression in node.expressions) {
+      for (Expression expression in node.expressions) {
         inferrer.inferExpression(
             expression, const UnknownType(), !inferrer.isTopLevel);
       }
@@ -1833,8 +1843,8 @@
   void visitStringLiteral(StringLiteral node, DartType typeContext) {}
 
   void visitSuperInitializerJudgment(SuperInitializerJudgment node) {
-    var substitution = Substitution.fromSupertype(inferrer.classHierarchy
-        .getClassAsInstanceOf(
+    Substitution substitution = Substitution.fromSupertype(
+        inferrer.classHierarchy.getClassAsInstanceOf(
             inferrer.thisType.classNode, node.target.enclosingClass));
     inferrer.inferInvocation(
         null,
@@ -1852,7 +1862,7 @@
       inferrer.instrumentation?.record(inferrer.uri, node.fileOffset, 'target',
           new InstrumentationValueForMember(node.interfaceTarget));
     }
-    var inferenceResult = inferrer.inferMethodInvocation(
+    ExpressionInferenceResult inferenceResult = inferrer.inferMethodInvocation(
         node, null, node.fileOffset, false, typeContext,
         interfaceMember: node.interfaceTarget,
         methodName: node.name,
@@ -1871,12 +1881,12 @@
   }
 
   void visitSwitchStatementJudgment(SwitchStatementJudgment node) {
-    var expressionJudgment = node.expressionJudgment;
+    Expression expressionJudgment = node.expressionJudgment;
     inferrer.inferExpression(expressionJudgment, const UnknownType(), true);
-    var expressionType = getInferredType(expressionJudgment, inferrer);
+    DartType expressionType = getInferredType(expressionJudgment, inferrer);
 
-    for (var switchCase in node.caseJudgments) {
-      for (var caseExpression in switchCase.expressionJudgments) {
+    for (SwitchCaseJudgment switchCase in node.caseJudgments) {
+      for (Expression caseExpression in switchCase.expressionJudgments) {
         DartType caseExpressionType =
             inferrer.inferExpression(caseExpression, expressionType, true);
 
@@ -1958,7 +1968,7 @@
 
   void visitTryCatchJudgment(TryCatchJudgment node) {
     inferrer.inferStatement(node.body);
-    for (var catch_ in node.catchJudgments) {
+    for (CatchJudgment catch_ in node.catchJudgments) {
       visitCatchJudgment(catch_);
     }
   }
@@ -1977,12 +1987,12 @@
   void visitVariableAssignmentJudgment(
       VariableAssignmentJudgment node, DartType typeContext) {
     DartType readType;
-    var read = node.read;
+    Expression read = node.read;
     if (read is VariableGet) {
       readType = read.promotedType ?? read.variable.type;
     }
     DartType writeContext = const UnknownType();
-    var write = node.write;
+    Expression write = node.write;
     if (write is VariableSet) {
       writeContext = write.variable.type;
       if (read != null) {
@@ -1995,8 +2005,9 @@
   }
 
   void visitVariableDeclarationJudgment(VariableDeclarationJudgment node) {
-    var initializerJudgment = node.initializerJudgment;
-    var declaredType = node._implicitlyTyped ? const UnknownType() : node.type;
+    Expression initializerJudgment = node.initializerJudgment;
+    DartType declaredType =
+        node._implicitlyTyped ? const UnknownType() : node.type;
     DartType inferredType;
     DartType initializerType;
     if (initializerJudgment != null) {
@@ -2014,7 +2025,7 @@
       node.type = inferredType;
     }
     if (node.initializer != null) {
-      var replacedInitializer = inferrer.ensureAssignable(
+      Expression replacedInitializer = inferrer.ensureAssignable(
           node.type, initializerType, node.initializer, node.fileOffset,
           isVoidAllowed: node.type is VoidType);
       if (replacedInitializer != null) {
@@ -2033,7 +2044,7 @@
 
   void visitUnresolvedTargetInvocationJudgment(
       UnresolvedTargetInvocationJudgment node, DartType typeContext) {
-    var result = visitSyntheticExpressionJudgment(node, typeContext);
+    void result = visitSyntheticExpressionJudgment(node, typeContext);
     inferrer.inferInvocation(
         typeContext,
         node.fileOffset,
@@ -2065,7 +2076,7 @@
           'promotedType', new InstrumentationValueForType(promotedType));
     }
     node.promotedType = promotedType;
-    var type = promotedType ?? declaredOrInferredType;
+    DartType type = promotedType ?? declaredOrInferredType;
     if (variable._isLocalFunction) {
       type = inferrer.instantiateTearOff(type, typeContext, node);
     }
@@ -2074,8 +2085,8 @@
   }
 
   void visitWhileJudgment(WhileJudgment node) {
-    var conditionJudgment = node.conditionJudgment;
-    var expectedType = inferrer.coreTypes.boolClass.rawType;
+    Expression conditionJudgment = node.conditionJudgment;
+    InterfaceType expectedType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(
         conditionJudgment, expectedType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -2087,10 +2098,10 @@
   }
 
   void visitYieldJudgment(YieldJudgment node) {
-    var judgment = node.judgment;
-    var closureContext = inferrer.closureContext;
+    Expression judgment = node.judgment;
+    ClosureContext closureContext = inferrer.closureContext;
     if (closureContext.isGenerator) {
-      var typeContext = closureContext.returnOrYieldContext;
+      DartType typeContext = closureContext.returnOrYieldContext;
       if (node.isYieldStar && typeContext != null) {
         typeContext = inferrer.wrapType(
             typeContext,
@@ -2111,7 +2122,7 @@
     node.inferredType =
         inferrer.typeSchemaEnvironment.futureType(const DynamicType());
     if (node.arguments != null) {
-      var calleeType = new FunctionType([], node.inferredType);
+      FunctionType calleeType = new FunctionType([], node.inferredType);
       inferrer.inferInvocation(typeContext, node.fileOffset, calleeType,
           calleeType.returnType, node.argumentJudgments);
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index db9a1c5..00f8141 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -33,6 +33,8 @@
         InstrumentationValueForType,
         InstrumentationValueForTypeArgs;
 
+import '../builder/library_builder.dart' show LibraryBuilder;
+
 import '../fasta_codes.dart'
     show
         messageCantDisambiguateAmbiguousInformation,
@@ -65,7 +67,12 @@
     show IncludesTypeParametersNonCovariantly, TypeInferenceEngine;
 
 import '../type_inference/type_inferrer.dart'
-    show ExpressionInferenceResult, TypeInferrer, TypeInferrerImpl;
+    show
+        ClosureContext,
+        ExpressionInferenceResult,
+        MethodContravarianceCheckKind,
+        TypeInferrer,
+        TypeInferrerImpl;
 
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
@@ -323,7 +330,7 @@
   ComplexAssignmentJudgment._(this.rhs) : super._(null);
 
   String toString() {
-    var parts = _getToStringParts();
+    List<String> parts = _getToStringParts();
     return '${runtimeType}(${parts.join(', ')})';
   }
 
@@ -350,7 +357,7 @@
       inferrer.helper
           ?.addProblem(messageVoidExpression, read.fileOffset, noLength);
     }
-    var writeOffset = write == null ? -1 : write.fileOffset;
+    int writeOffset = write == null ? -1 : write.fileOffset;
     Procedure combinerMember;
     DartType combinedType;
     if (combiner != null) {
@@ -362,7 +369,7 @@
             .isOverloadedArithmeticOperatorAndType(combinerMember, readType);
       }
       DartType rhsType;
-      var combinerType = inferrer.getCalleeFunctionType(
+      FunctionType combinerType = inferrer.getCalleeFunctionType(
           inferrer.getCalleeType(combinerMember, readType), false);
       if (isPreIncDec || isPostIncDec) {
         rhsType = inferrer.coreTypes.intClass.rawType;
@@ -377,7 +384,7 @@
         rhsType = getInferredType(rhs, inferrer);
         // Do not use rhs after this point because it may be a Shadow node
         // that has been replaced in the tree with its desugaring.
-        var expectedType = getPositionalParameterType(combinerType, 0);
+        DartType expectedType = getPositionalParameterType(combinerType, 0);
         inferrer.ensureAssignable(expectedType, rhsType,
             combiner.arguments.positional.first, combiner.fileOffset);
       }
@@ -387,9 +394,10 @@
       } else {
         combinedType = combinerType.returnType;
       }
-      var checkKind = inferrer.preCheckInvocationContravariance(read, readType,
-          combinerMember, combiner, combiner.arguments, combiner);
-      var replacedCombiner = inferrer.handleInvocationContravariance(
+      MethodContravarianceCheckKind checkKind =
+          inferrer.preCheckInvocationContravariance(read, readType,
+              combinerMember, combiner, combiner.arguments, combiner);
+      Expression replacedCombiner = inferrer.handleInvocationContravariance(
           checkKind,
           combiner,
           combiner.arguments,
@@ -397,7 +405,7 @@
           combinedType,
           combinerType,
           combiner.fileOffset);
-      var replacedCombiner2 = inferrer.ensureAssignable(
+      Expression replacedCombiner2 = inferrer.ensureAssignable(
           writeContext, combinedType, replacedCombiner, writeOffset);
       if (replacedCombiner2 != null) {
         replacedCombiner = replacedCombiner2;
@@ -406,8 +414,8 @@
     } else {
       inferrer.inferExpression(rhs, writeContext ?? const UnknownType(), true,
           isVoidAllowed: true);
-      var rhsType = getInferredType(rhs, inferrer);
-      var replacedRhs = inferrer.ensureAssignable(
+      DartType rhsType = getInferredType(rhs, inferrer);
+      Expression replacedRhs = inferrer.ensureAssignable(
           writeContext, rhsType, rhs, writeOffset,
           isVoidAllowed: writeContext is VoidType);
       _storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
@@ -453,7 +461,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (receiver != null) parts.add('receiver=$receiver');
     if (isSuper) parts.add('isSuper=true');
     return parts;
@@ -462,7 +470,7 @@
   DartType _inferReceiver(ShadowTypeInferrer inferrer) {
     if (receiver != null) {
       inferrer.inferExpression(receiver, const UnknownType(), true);
-      var receiverType = getInferredType(receiver, inferrer);
+      DartType receiverType = getInferredType(receiver, inferrer);
       _storeLetType(inferrer, receiver, receiverType);
       return receiverType;
     } else if (isSuper) {
@@ -750,7 +758,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (index != null) parts.add('index=$index');
     return parts;
   }
@@ -1029,7 +1037,7 @@
 
   @override
   List<String> _getToStringParts() {
-    var parts = super._getToStringParts();
+    List<String> parts = super._getToStringParts();
     if (nullAwareGuard != null) parts.add('nullAwareGuard=$nullAwareGuard');
     return parts;
   }
@@ -1256,7 +1264,7 @@
     while (true) {
       if (desugared is Let) {
         Let desugaredLet = desugared;
-        var variable = desugaredLet.variable;
+        VariableDeclaration variable = desugaredLet.variable;
         if (identical(variable.initializer, expression)) {
           variable.type = type;
           return;
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 1fcfc87..b1ff995 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -118,6 +118,9 @@
 
           default:
             fileUri = uri;
+            // Check for empty package name entry (redirecting to package name
+            // from which we should get the fragment part).
+            packageFragment = target.uriTranslator?.getDefaultPackageFragment();
             break;
         }
       }
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 9a462ff..c7899be 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -915,7 +915,7 @@
     }
     parser.reportRecoverableErrorWithToken(next, fasta.templateExpectedType);
     if (!isOneOfOrEof(
-        next, const ['>', ')', '[', ']', '[]', '{', '}', ',', ';'])) {
+        next, const ['<', '>', ')', '[', ']', '[]', '{', '}', ',', ';'])) {
       // When in doubt, consume the token to ensure we make progress
       token = next;
       next = token.next;
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 7b7f7a7..affb84563 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -688,8 +688,9 @@
   /// Recover given out-of-order clauses in an import directive where [token] is
   /// the import keyword.
   Token parseImportRecovery(Token token) {
-    final primaryListener = listener;
-    final recoveryListener = new ImportRecoveryListener();
+    final Listener primaryListener = listener;
+    final ImportRecoveryListener recoveryListener =
+        new ImportRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener
@@ -1817,8 +1818,9 @@
 
   /// Recover given out-of-order clauses in a class header.
   Token parseClassHeaderRecovery(Token token, Token begin, Token classKeyword) {
-    final primaryListener = listener;
-    final recoveryListener = new ClassHeaderRecoveryListener();
+    final Listener primaryListener = listener;
+    final ClassHeaderRecoveryListener recoveryListener =
+        new ClassHeaderRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener.
@@ -1977,8 +1979,9 @@
 
   Token parseMixinHeaderRecovery(
       Token token, Token mixinKeyword, Token headerStart) {
-    final primaryListener = listener;
-    final recoveryListener = new MixinHeaderRecoveryListener();
+    final Listener primaryListener = listener;
+    final MixinHeaderRecoveryListener recoveryListener =
+        new MixinHeaderRecoveryListener();
 
     // Reparse to determine which clauses have already been parsed
     // but intercept the events so they are not sent to the primary listener.
@@ -3729,7 +3732,7 @@
       return parseExpressionStatementOrDeclarationAfterModifiers(
           token, token, null, null, null, false);
     }
-    final value = token.next.stringValue;
+    final String value = token.next.stringValue;
     if (identical(value, '{')) {
       // The scanner ensures that `{` always has a closing `}`.
       return parseBlock(token, null);
@@ -4243,7 +4246,7 @@
   }
 
   Token parsePrimary(Token token, IdentifierContext context) {
-    final kind = token.next.kind;
+    final int kind = token.next.kind;
     if (kind == IDENTIFIER_TOKEN) {
       return parseSendOrFunctionLiteral(token, context);
     } else if (kind == INT_TOKEN || kind == HEXADECIMAL_TOKEN) {
@@ -4468,8 +4471,8 @@
         }
         // This looks like the start of an expression.
         // Report an error, insert the comma, and continue parsing.
-        var comma = new SyntheticToken(TokenType.COMMA, next.offset);
-        var message = ifCount > 0
+        SyntheticToken comma = new SyntheticToken(TokenType.COMMA, next.offset);
+        Message message = ifCount > 0
             ? fasta.messageExpectedElseOrComma
             : fasta.templateExpectedButGot.withArguments(',');
         next = rewriteAndRecover(token, message, comma);
@@ -4492,7 +4495,7 @@
       return next;
     }
 
-    final old = mayParseFunctionExpressions;
+    final bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
     int count = 0;
     // TODO(danrubel): hasSetEntry parameter exists for replicating existing
@@ -4506,7 +4509,7 @@
         // TODO(danrubel): Remove this section and use the while loop below
         // once hasSetEntry is no longer needed.
         token = parseExpression(token);
-        var isMapEntry = optional(':', token.next);
+        bool isMapEntry = optional(':', token.next);
         hasSetEntry ??= !isMapEntry;
         if (isMapEntry) {
           Token colon = token.next;
@@ -4550,8 +4553,9 @@
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
           // TODO(danrubel): Consider better error message
-          var comma = new SyntheticToken(TokenType.COMMA, next.offset);
-          var message = ifCount > 0
+          SyntheticToken comma =
+              new SyntheticToken(TokenType.COMMA, next.offset);
+          Message message = ifCount > 0
               ? fasta.messageExpectedElseOrComma
               : fasta.templateExpectedButGot.withArguments(',');
           token = rewriteAndRecover(token, message, comma);
@@ -4868,7 +4872,7 @@
     // Parsing the prefix, for instance 'x of 'x${id}y${id}z'
     int interpolationCount = 0;
     Token next = token.next;
-    var kind = next.kind;
+    int kind = next.kind;
     while (kind != EOF_TOKEN) {
       if (identical(kind, STRING_INTERPOLATION_TOKEN)) {
         // Parsing ${expression}.
@@ -5285,7 +5289,7 @@
         // look past the next expression
         // to determine if this is part of a conditional expression
         //
-        final originalListener = listener;
+        Listener originalListener = listener;
         listener = new ForwardingListener();
         // TODO(danrubel): consider using TokenStreamGhostWriter here
         Token afterExpression =
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index a10dea0..dab1b69 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -67,11 +67,12 @@
 
   /// Returns the set of type constraints that was gathered.
   Map<TypeParameter, TypeConstraint> computeConstraints() {
-    var result = <TypeParameter, TypeConstraint>{};
-    for (var parameter in _parametersToConstrain) {
+    Map<TypeParameter, TypeConstraint> result =
+        <TypeParameter, TypeConstraint>{};
+    for (TypeParameter parameter in _parametersToConstrain) {
       result[parameter] = new TypeConstraint();
     }
-    for (var protoConstraint in _protoConstraints) {
+    for (_ProtoConstraint protoConstraint in _protoConstraints) {
       if (protoConstraint.isUpper) {
         addUpperBound(result[protoConstraint.parameter], protoConstraint.bound);
       } else {
@@ -133,9 +134,11 @@
       return false;
     }
     if (subtype.typeParameters.isNotEmpty) {
-      var subtypeSubstitution = <TypeParameter, DartType>{};
-      var supertypeSubstitution = <TypeParameter, DartType>{};
-      var freshTypeVariables = <TypeParameter>[];
+      Map<TypeParameter, DartType> subtypeSubstitution =
+          <TypeParameter, DartType>{};
+      Map<TypeParameter, DartType> supertypeSubstitution =
+          <TypeParameter, DartType>{};
+      List<TypeParameter> freshTypeVariables = <TypeParameter>[];
       if (!_matchTypeFormals(subtype.typeParameters, supertype.typeParameters,
           subtypeSubstitution, supertypeSubstitution, freshTypeVariables)) {
         return false;
@@ -155,8 +158,8 @@
 
     // Test the parameter types.
     for (int i = 0; i < supertype.positionalParameters.length; ++i) {
-      var supertypeParameter = supertype.positionalParameters[i];
-      var subtypeParameter = subtype.positionalParameters[i];
+      DartType supertypeParameter = supertype.positionalParameters[i];
+      DartType subtypeParameter = subtype.positionalParameters[i];
       // Termination: Both types shrink in size.
       if (!_isSubtypeMatch(supertypeParameter, subtypeParameter)) {
         return false;
@@ -201,7 +204,7 @@
     // of supertypes of a given type more than once, the order of the checks
     // above is irrelevant; we just need to find the matched superclass,
     // substitute, and then iterate through type variables.
-    var matchingSupertypeOfSubtype =
+    InterfaceType matchingSupertypeOfSubtype =
         getTypeAsInstanceOf(subtype, supertype.classNode);
     if (matchingSupertypeOfSubtype == null) return false;
     for (int i = 0; i < supertype.classNode.typeParameters.length; i++) {
@@ -266,14 +269,14 @@
     // Handle FutureOr<T> union type.
     if (subtype is InterfaceType &&
         identical(subtype.classNode, futureOrClass)) {
-      var subtypeArg = subtype.typeArguments[0];
+      DartType subtypeArg = subtype.typeArguments[0];
       if (supertype is InterfaceType &&
           identical(supertype.classNode, futureOrClass)) {
         // `FutureOr<P>` is a subtype match for `FutureOr<Q>` with respect to
         // `L` under constraints `C`:
         // - If `P` is a subtype match for `Q` with respect to `L` under
         //   constraints `C`.
-        var supertypeArg = supertype.typeArguments[0];
+        DartType supertypeArg = supertype.typeArguments[0];
         return _isSubtypeMatch(subtypeArg, supertypeArg);
       }
 
@@ -283,7 +286,7 @@
       //   constraints `C0`.
       // - And `P` is a subtype match for `Q` with respect to `L` under
       //   constraints `C1`.
-      var subtypeFuture = futureType(subtypeArg);
+      InterfaceType subtypeFuture = futureType(subtypeArg);
       return _isSubtypeMatch(subtypeFuture, supertype) &&
           _isSubtypeMatch(subtypeArg, supertype);
     }
@@ -298,8 +301,8 @@
       //   under constraints `C`
       //   - And `P` is a subtype match for `Q` with respect to `L` under
       //     constraints `C`
-      var supertypeArg = supertype.typeArguments[0];
-      var supertypeFuture = futureType(supertypeArg);
+      DartType supertypeArg = supertype.typeArguments[0];
+      InterfaceType supertypeFuture = futureType(supertypeArg);
       return trySubtypeMatch(subtype, supertypeFuture) ||
           _isSubtypeMatch(subtype, supertypeArg);
     }
@@ -342,9 +345,9 @@
     //   and `F` is a subtype match for a type `Q` with respect to `L` under
     //   constraints `C`.
     if (subtype is InterfaceType) {
-      var callMember = getInterfaceMember(subtype.classNode, callName);
+      Member callMember = getInterfaceMember(subtype.classNode, callName);
       if (callMember is Procedure && !callMember.isGetter) {
-        var callType = callMember.getterType;
+        DartType callType = callMember.getterType;
         if (callType != null) {
           callType =
               Substitution.fromInterfaceType(subtype).substituteType(callType);
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 0bd0d70..7c8edce 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
@@ -56,7 +56,7 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/type_algebra.dart'
-    show getFreshTypeParameters, Substitution;
+    show FreshTypeParameters, getFreshTypeParameters, Substitution;
 
 import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
 
@@ -132,13 +132,14 @@
     show
         getNamedParameterType,
         getPositionalParameterType,
+        TypeConstraint,
         TypeVariableEliminator,
         TypeSchemaEnvironment;
 
 /// Given a [FunctionNode], gets the named parameter identified by [name], or
 /// `null` if there is no parameter with the given name.
 VariableDeclaration getNamedFormal(FunctionNode function, String name) {
-  for (var formal in function.namedParameters) {
+  for (VariableDeclaration formal in function.namedParameters) {
     if (formal.name == name) return formal;
   }
   return null;
@@ -245,7 +246,7 @@
       ReturnStatement statement, DartType expressionType) {
     // The rules for valid returns for functions with return type T and possibly
     // a return expression with static type S.
-    var flattenedReturnType = isAsync
+    DartType flattenedReturnType = isAsync
         ? inferrer.typeSchemaEnvironment.unfutureType(returnType)
         : returnType;
     if (statement.expression == null) {
@@ -273,7 +274,7 @@
 
     // Sync: invalid if T is void and S is not void, dynamic, or Null
     // Async: invalid if T is void and flatten(S) is not void, dynamic, or Null.
-    var flattenedExpressionType = isAsync
+    DartType flattenedExpressionType = isAsync
         ? inferrer.typeSchemaEnvironment.unfutureType(expressionType)
         : expressionType;
     if (returnType is VoidType &&
@@ -332,7 +333,7 @@
         // Not assignable, use the expectation.
         type = greatestClosure(inferrer.coreTypes, returnOrYieldContext);
       }
-      var unwrappedType = type;
+      DartType unwrappedType = type;
       if (isAsync) {
         unwrappedType = inferrer.typeSchemaEnvironment.unfutureType(type);
       }
@@ -359,7 +360,7 @@
   void handleYield(TypeInferrerImpl inferrer, bool isYieldStar, DartType type,
       Expression expression, int fileOffset) {
     if (!isGenerator) return;
-    var expectedType = isYieldStar
+    DartType expectedType = isYieldStar
         ? _wrapAsyncOrGenerator(inferrer, returnOrYieldContext)
         : returnOrYieldContext;
     if (inferrer.ensureAssignable(expectedType, type, expression, fileOffset,
@@ -368,7 +369,7 @@
       type = greatestClosure(inferrer.coreTypes, expectedType);
     }
     if (_needToInferReturnType) {
-      var unwrappedType = type;
+      DartType unwrappedType = type;
       if (isYieldStar) {
         unwrappedType = inferrer.getDerivedTypeArgumentOf(
                 type,
@@ -633,23 +634,29 @@
     // should tear off `.call`.
     // TODO(paulberry): use resolveTypeParameter.  See findInterfaceMember.
     if (actualType is InterfaceType) {
-      var classNode = (actualType as InterfaceType).classNode;
-      var callMember = classHierarchy.getInterfaceMember(classNode, callName);
+      Class classNode = (actualType as InterfaceType).classNode;
+      Member callMember =
+          classHierarchy.getInterfaceMember(classNode, callName);
       if (callMember is Procedure && callMember.kind == ProcedureKind.Method) {
         if (_shouldTearOffCall(expectedType, actualType)) {
           // Replace expression with:
           // `let t = expression in t == null ? null : t.call`
-          var parent = expression.parent;
-          var t = new VariableDeclaration.forValue(expression, type: actualType)
-            ..fileOffset = fileOffset;
-          var nullCheck = buildIsNull(new VariableGet(t), fileOffset, helper);
-          var tearOff =
+          TreeNode parent = expression.parent;
+          VariableDeclaration t =
+              new VariableDeclaration.forValue(expression, type: actualType)
+                ..fileOffset = fileOffset;
+          Expression nullCheck =
+              buildIsNull(new VariableGet(t), fileOffset, helper);
+          PropertyGet tearOff =
               new PropertyGet(new VariableGet(t), callName, callMember)
                 ..fileOffset = fileOffset;
           actualType = getCalleeType(callMember, actualType);
-          var conditional = new ConditionalExpression(nullCheck,
-              new NullLiteral()..fileOffset = fileOffset, tearOff, actualType);
-          var let = new Let(t, conditional)..fileOffset = fileOffset;
+          ConditionalExpression conditional = new ConditionalExpression(
+              nullCheck,
+              new NullLiteral()..fileOffset = fileOffset,
+              tearOff,
+              actualType);
+          Let let = new Let(t, conditional)..fileOffset = fileOffset;
           parent?.replaceChild(expression, let);
           expression = let;
         }
@@ -673,7 +680,7 @@
 
     if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
       // Error: not assignable.  Perform error recovery.
-      var parent = expression.parent;
+      TreeNode parent = expression.parent;
       Expression errorNode = new AsExpression(
           expression,
           // TODO(ahe): The outline phase doesn't correctly remove invalid
@@ -693,21 +700,23 @@
       parent?.replaceChild(expression, errorNode);
       return errorNode;
     } else {
-      var template = _getPreciseTypeErrorTemplate(expression);
+      Template<Message Function(DartType, DartType)> template =
+          _getPreciseTypeErrorTemplate(expression);
       if (template != null) {
         // The type of the expression is known precisely, so an implicit
         // downcast is guaranteed to fail.  Insert a compile-time error.
-        var parent = expression.parent;
-        var errorNode = helper.wrapInProblem(expression,
+        TreeNode parent = expression.parent;
+        Expression errorNode = helper.wrapInProblem(expression,
             template.withArguments(actualType, expectedType), noLength);
         parent?.replaceChild(expression, errorNode);
         return errorNode;
       } else {
         // Insert an implicit downcast.
-        var parent = expression.parent;
-        var typeCheck = new AsExpression(expression, initialExpectedType)
-          ..isTypeError = true
-          ..fileOffset = fileOffset;
+        TreeNode parent = expression.parent;
+        AsExpression typeCheck =
+            new AsExpression(expression, initialExpectedType)
+              ..isTypeError = true
+              ..fileOffset = fileOffset;
         parent?.replaceChild(expression, typeCheck);
         return typeCheck;
       }
@@ -785,21 +794,21 @@
     // TODO(paulberry): could we add getters to InvocationExpression to make
     // these is-checks unnecessary?
     if (methodInvocation is MethodInvocation) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, methodInvocation.name, methodInvocation.fileOffset,
           errorTemplate: templateUndefinedMethod,
           expression: methodInvocation,
           receiver: methodInvocation.receiver,
           instrumented: instrumented);
       if (receiverType == const DynamicType() && interfaceMember is Procedure) {
-        var arguments = methodInvocation.arguments;
-        var signature = interfaceMember.function;
+        Arguments arguments = methodInvocation.arguments;
+        FunctionNode signature = interfaceMember.function;
         if (arguments.positional.length < signature.requiredParameterCount ||
             arguments.positional.length >
                 signature.positionalParameters.length) {
           return null;
         }
-        for (var argument in arguments.named) {
+        for (kernel.NamedExpression argument in arguments.named) {
           if (!signature.namedParameters
               .any((declaration) => declaration.name == argument.name)) {
             return null;
@@ -816,7 +825,7 @@
       return interfaceMember;
     } else if (methodInvocation is SuperMethodInvocation) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, methodInvocation.name, methodInvocation.fileOffset,
           instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -836,7 +845,7 @@
     // TODO(paulberry): could we add a common base class to PropertyGet and
     // SuperPropertyGet to make these is-checks unnecessary?
     if (propertyGet is PropertyGet) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertyGet.name, propertyGet.fileOffset,
           errorTemplate: templateUndefinedGetter,
           expression: propertyGet,
@@ -854,7 +863,7 @@
       return interfaceMember;
     } else if (propertyGet is SuperPropertyGet) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertyGet.name, propertyGet.fileOffset,
           instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -872,7 +881,7 @@
   Object findPropertySetMember(DartType receiverType, Expression propertySet,
       {bool instrumented: true}) {
     if (propertySet is PropertySet) {
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertySet.name, propertySet.fileOffset,
           errorTemplate: templateUndefinedSetter,
           expression: propertySet,
@@ -891,7 +900,7 @@
       return interfaceMember;
     } else if (propertySet is SuperPropertySet) {
       assert(receiverType != const DynamicType());
-      var interfaceMember = findInterfaceMember(
+      Object interfaceMember = findInterfaceMember(
           receiverType, propertySet.name, propertySet.fileOffset,
           setter: true, instrumented: instrumented);
       if (interfaceMember is Member) {
@@ -908,9 +917,9 @@
     if (calleeType is FunctionType) {
       return calleeType;
     } else if (followCall && calleeType is InterfaceType) {
-      var member =
+      Member member =
           _getInterfaceMember(calleeType.classNode, callName, false, -1);
-      var callType = getCalleeType(member, calleeType);
+      DartType callType = getCalleeType(member, calleeType);
       if (callType is FunctionType) {
         return callType;
       }
@@ -924,7 +933,7 @@
     } else if (interfaceMember == null) {
       return const DynamicType();
     } else if (interfaceMember is Member) {
-      var memberClass = interfaceMember.enclosingClass;
+      Class memberClass = interfaceMember.enclosingClass;
       DartType calleeType;
       if (interfaceMember is Procedure) {
         if (interfaceMember.kind == ProcedureKind.Getter) {
@@ -941,7 +950,7 @@
       if (memberClass.typeParameters.isNotEmpty) {
         receiverType = resolveTypeParameter(receiverType);
         if (receiverType is InterfaceType) {
-          var castedType =
+          InterfaceType castedType =
               classHierarchy.getTypeAsInstanceOf(receiverType, memberClass);
           calleeType = Substitution.fromInterfaceType(castedType)
               .substituteType(calleeType);
@@ -956,7 +965,7 @@
 
   DartType getDerivedTypeArgumentOf(DartType type, Class class_) {
     if (type is InterfaceType) {
-      var typeAsInstanceOfClass =
+      InterfaceType typeAsInstanceOfClass =
           classHierarchy.getTypeAsInstanceOf(type, class_);
       if (typeAsInstanceOfClass != null) {
         return typeAsInstanceOfClass.typeArguments[0];
@@ -984,11 +993,12 @@
     } else if (interfaceMember == null) {
       return const DynamicType();
     } else if (interfaceMember is Member) {
-      var memberClass = interfaceMember.enclosingClass;
+      Class memberClass = interfaceMember.enclosingClass;
       DartType setterType;
       if (interfaceMember is Procedure) {
         assert(interfaceMember.kind == ProcedureKind.Setter);
-        var setterParameters = interfaceMember.function.positionalParameters;
+        List<VariableDeclaration> setterParameters =
+            interfaceMember.function.positionalParameters;
         setterType = setterParameters.length > 0
             ? setterParameters[0].type
             : const DynamicType();
@@ -1001,7 +1011,7 @@
       if (memberClass.typeParameters.isNotEmpty) {
         receiverType = resolveTypeParameter(receiverType);
         if (receiverType is InterfaceType) {
-          var castedType =
+          InterfaceType castedType =
               classHierarchy.getTypeAsInstanceOf(receiverType, memberClass);
           setterType = Substitution.fromInterfaceType(castedType)
               .substituteType(setterType);
@@ -1035,13 +1045,14 @@
       DartType inferredType,
       FunctionType functionType,
       int fileOffset) {
-    var expressionToReplace = desugaredInvocation ?? expression;
+    Expression expressionToReplace = desugaredInvocation ?? expression;
     switch (checkKind) {
       case MethodContravarianceCheckKind.checkMethodReturn:
-        var parent = expressionToReplace.parent;
-        var replacement = new AsExpression(expressionToReplace, inferredType)
-          ..isTypeError = true
-          ..fileOffset = fileOffset;
+        TreeNode parent = expressionToReplace.parent;
+        AsExpression replacement =
+            new AsExpression(expressionToReplace, inferredType)
+              ..isTypeError = true
+              ..fileOffset = fileOffset;
         parent.replaceChild(expressionToReplace, replacement);
         if (instrumentation != null) {
           int offset = arguments.fileOffset == -1
@@ -1052,13 +1063,13 @@
         }
         return replacement;
       case MethodContravarianceCheckKind.checkGetterReturn:
-        var parent = expressionToReplace.parent;
-        var propertyGet = new PropertyGet(desugaredInvocation.receiver,
+        TreeNode parent = expressionToReplace.parent;
+        PropertyGet propertyGet = new PropertyGet(desugaredInvocation.receiver,
             desugaredInvocation.name, desugaredInvocation.interfaceTarget);
-        var asExpression = new AsExpression(propertyGet, functionType)
+        AsExpression asExpression = new AsExpression(propertyGet, functionType)
           ..isTypeError = true
           ..fileOffset = fileOffset;
-        var replacement = new MethodInvocation(
+        MethodInvocation replacement = new MethodInvocation(
             asExpression, callName, desugaredInvocation.arguments);
         parent.replaceChild(expressionToReplace, replacement);
         if (instrumentation != null) {
@@ -1099,10 +1110,10 @@
             interfaceMember.enclosingClass, interfaceMember.type);
       }
     }
-    var replacedExpression = desugaredGet ?? expression;
+    Expression replacedExpression = desugaredGet ?? expression;
     if (checkReturn) {
-      var expressionToReplace = replacedExpression;
-      var parent = expressionToReplace.parent;
+      Expression expressionToReplace = replacedExpression;
+      TreeNode parent = expressionToReplace.parent;
       replacedExpression = new AsExpression(expressionToReplace, inferredType)
         ..isTypeError = true
         ..fileOffset = fileOffset;
@@ -1151,7 +1162,7 @@
     assert(closureContext == null);
     assert(!isTopLevel);
     this.helper = helper;
-    var actualType =
+    DartType actualType =
         inferExpression(initializer, context, true, isVoidAllowed: true);
     ensureAssignable(context, actualType, initializer, initializer.fileOffset,
         isVoidAllowed: context is VoidType);
@@ -1190,7 +1201,7 @@
       // type parameters for the callee (see dartbug.com/31759).
       // TODO(paulberry): is it possible to find a narrower set of circumstances
       // in which me must do this, to avoid a performance regression?
-      var fresh = getFreshTypeParameters(calleeTypeParameters);
+      FreshTypeParameters fresh = getFreshTypeParameters(calleeTypeParameters);
       calleeType = fresh.applyToFunctionType(calleeType);
       returnType = fresh.substitute(returnType);
       calleeTypeParameters = fresh.freshTypeParameters;
@@ -1239,7 +1250,7 @@
       DartType inferredFormalType = substitution != null
           ? substitution.substituteType(formalType)
           : formalType;
-      var expressionType = inferExpression(
+      DartType expressionType = inferExpression(
           expression,
           inferredFormalType,
           inferenceNeeded ||
@@ -1256,28 +1267,30 @@
     });
 
     // Check for and remove duplicated named arguments.
-    var named = arguments.named;
+    List<kernel.NamedExpression> named = arguments.named;
     if (named.length == 2) {
       if (named[0].name == named[1].name) {
-        var name = named[1].name;
-        var error = helper.desugarSyntheticExpression(helper.buildProblem(
-            templateDuplicatedNamedArgument.withArguments(name),
-            named[1].fileOffset,
-            name.length));
+        String name = named[1].name;
+        Expression error = helper.desugarSyntheticExpression(
+            helper.buildProblem(
+                templateDuplicatedNamedArgument.withArguments(name),
+                named[1].fileOffset,
+                name.length));
         arguments.named = [new kernel.NamedExpression(named[1].name, error)];
         formalTypes.removeLast();
         actualTypes.removeLast();
       }
     } else if (named.length > 2) {
-      var seenNames = <String, kernel.NamedExpression>{};
-      var hasProblem = false;
-      var namedTypeIndex = arguments.positional.length;
-      var uniqueNamed = <kernel.NamedExpression>[];
-      for (var expression in named) {
-        var name = expression.name;
+      Map<String, kernel.NamedExpression> seenNames =
+          <String, kernel.NamedExpression>{};
+      bool hasProblem = false;
+      int namedTypeIndex = arguments.positional.length;
+      List<kernel.NamedExpression> uniqueNamed = <kernel.NamedExpression>[];
+      for (kernel.NamedExpression expression in named) {
+        String name = expression.name;
         if (seenNames.containsKey(name)) {
           hasProblem = true;
-          var prevNamedExpression = seenNames[name];
+          kernel.NamedExpression prevNamedExpression = seenNames[name];
           prevNamedExpression.value = helper.desugarSyntheticExpression(
               helper.buildProblem(
                   templateDuplicatedNamedArgument.withArguments(name),
@@ -1322,12 +1335,12 @@
         // Argument counts and names match. Compare types.
         int numPositionalArgs = arguments.positional.length;
         for (int i = 0; i < formalTypes.length; i++) {
-          var formalType = formalTypes[i];
-          var expectedType = substitution != null
+          DartType formalType = formalTypes[i];
+          DartType expectedType = substitution != null
               ? substitution.substituteType(formalType)
               : formalType;
-          var actualType = actualTypes[i];
-          var expression = i < numPositionalArgs
+          DartType actualType = actualTypes[i];
+          Expression expression = i < numPositionalArgs
               ? arguments.positional[i]
               : arguments.named[i - numPositionalArgs].value;
           ensureAssignable(
@@ -1354,15 +1367,16 @@
       returnContext = const DynamicType();
     }
     if (!isTopLevel) {
-      var positionalParameters = function.positionalParameters;
-      for (var i = 0; i < positionalParameters.length; i++) {
-        var parameter = positionalParameters[i];
+      List<VariableDeclaration> positionalParameters =
+          function.positionalParameters;
+      for (int i = 0; i < positionalParameters.length; i++) {
+        VariableDeclaration parameter = positionalParameters[i];
         inferMetadataKeepingHelper(parameter.annotations);
         if (parameter.initializer != null) {
           inferExpression(parameter.initializer, parameter.type, !isTopLevel);
         }
       }
-      for (var parameter in function.namedParameters) {
+      for (VariableDeclaration parameter in function.namedParameters) {
         inferMetadataKeepingHelper(parameter.annotations);
         inferExpression(parameter.initializer, parameter.type, !isTopLevel);
       }
@@ -1404,7 +1418,8 @@
 
       // Let `[T/S]` denote the type substitution where each `Si` is replaced
       // with the corresponding `Ti`.
-      var substitutionMap = <TypeParameter, DartType>{};
+      Map<TypeParameter, DartType> substitutionMap =
+          <TypeParameter, DartType>{};
       for (int i = 0; i < typeContext.typeParameters.length; i++) {
         substitutionMap[typeContext.typeParameters[i]] =
             i < typeParameters.length
@@ -1497,9 +1512,9 @@
       // Place annotations in a temporary list literal so that they will have a
       // parent.  This is necessary in case any of the annotations need to get
       // replaced during type inference.
-      var parents = annotations.map((e) => e.parent).toList();
+      List<TreeNode> parents = annotations.map((e) => e.parent).toList();
       new ListLiteral(annotations);
-      for (var annotation in annotations) {
+      for (Expression annotation in annotations) {
         inferExpression(annotation, const UnknownType(), !isTopLevel);
       }
       for (int i = 0; i < annotations.length; ++i) {
@@ -1522,7 +1537,7 @@
       Name methodName,
       Arguments arguments}) {
     // First infer the receiver so we can look up the method that was invoked.
-    var receiverType = receiver == null
+    DartType receiverType = receiver == null
         ? thisType
         : inferExpression(receiver, const UnknownType(), true);
     receiverVariable?.type = receiverType;
@@ -1535,26 +1550,32 @@
     bool isOverloadedArithmeticOperator = interfaceMember is Procedure &&
         typeSchemaEnvironment.isOverloadedArithmeticOperatorAndType(
             interfaceMember, receiverType);
-    var calleeType = getCalleeType(interfaceMember, receiverType);
-    var functionType = getCalleeFunctionType(calleeType, !isImplicitCall);
+    DartType calleeType = getCalleeType(interfaceMember, receiverType);
+    FunctionType functionType =
+        getCalleeFunctionType(calleeType, !isImplicitCall);
 
     if (interfaceMember != null &&
         calleeType is! DynamicType &&
         calleeType != coreTypes.functionClass.rawType &&
         identical(functionType, unknownFunction)) {
-      var parent = expression.parent;
+      TreeNode parent = expression.parent;
       kernel.Expression error = helper.wrapInProblem(expression,
           templateInvokeNonFunction.withArguments(methodName.name), noLength);
       parent?.replaceChild(expression, error);
       return new ExpressionInferenceResult(null, const DynamicType());
     }
-    var checkKind = preCheckInvocationContravariance(receiver, receiverType,
-        interfaceMember, desugaredInvocation, arguments, expression);
-    var inferenceResult = inferInvocation(typeContext, fileOffset, functionType,
-        functionType.returnType, arguments,
+    MethodContravarianceCheckKind checkKind = preCheckInvocationContravariance(
+        receiver,
+        receiverType,
+        interfaceMember,
+        desugaredInvocation,
+        arguments,
+        expression);
+    ExpressionInferenceResult inferenceResult = inferInvocation(typeContext,
+        fileOffset, functionType, functionType.returnType, arguments,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         receiverType: receiverType);
-    var inferredType = inferenceResult.type;
+    DartType inferredType = inferenceResult.type;
     if (methodName.name == '==') {
       inferredType = coreTypes.boolClass.rawType;
     }
@@ -1567,8 +1588,8 @@
               interfaceMember.kind == ProcedureKind.Method) &&
           receiverType is! DynamicType &&
           receiverType != typeSchemaEnvironment.rawFunctionType) {
-        var parent = expression.parent;
-        var errorNode = helper.wrapInProblem(
+        TreeNode parent = expression.parent;
+        Expression errorNode = helper.wrapInProblem(
             expression,
             templateImplicitCallOfNonMethod.withArguments(receiverType),
             noLength);
@@ -1619,7 +1640,7 @@
     assert(closureContext == null);
     this.helper = helper;
     assert(declaredType != null);
-    var actualType = inferExpression(initializer, declaredType, true);
+    DartType actualType = inferExpression(initializer, declaredType, true);
     ensureAssignable(
         declaredType, actualType, initializer, initializer.fileOffset);
     this.helper = null;
@@ -1657,8 +1678,8 @@
         desugaredGet.interfaceTarget = interfaceMember;
       }
     }
-    var inferredType = getCalleeType(interfaceMember, receiverType);
-    var replacedExpression = handlePropertyGetContravariance(receiver,
+    DartType inferredType = getCalleeType(interfaceMember, receiverType);
+    Expression replacedExpression = handlePropertyGetContravariance(receiver,
         interfaceMember, desugaredGet, expression, inferredType, fileOffset);
     if ((interfaceMember is Procedure &&
         interfaceMember.kind == ProcedureKind.Method)) {
@@ -1686,21 +1707,21 @@
     if (tearoffType is FunctionType &&
         context is FunctionType &&
         context.typeParameters.isEmpty) {
-      var typeParameters = tearoffType.typeParameters;
+      List<TypeParameter> typeParameters = tearoffType.typeParameters;
       if (typeParameters.isNotEmpty) {
-        var inferredTypes = new List<DartType>.filled(
+        List<DartType> inferredTypes = new List<DartType>.filled(
             typeParameters.length, const UnknownType());
-        var instantiatedType = tearoffType.withoutTypeParameters;
+        FunctionType instantiatedType = tearoffType.withoutTypeParameters;
         typeSchemaEnvironment.inferGenericFunctionOrType(
             instantiatedType, typeParameters, [], [], context, inferredTypes);
         if (!isTopLevel) {
-          var parent = expression.parent;
+          TreeNode parent = expression.parent;
           parent.replaceChild(
               expression,
               new Instantiation(expression, inferredTypes)
                 ..fileOffset = expression.fileOffset);
         }
-        var substitution =
+        Substitution substitution =
             Substitution.fromPairs(typeParameters, inferredTypes);
         return substitution.substituteType(instantiatedType);
       }
@@ -1745,7 +1766,7 @@
     if (interfaceMember is Field ||
         interfaceMember is Procedure &&
             interfaceMember.kind == ProcedureKind.Getter) {
-      var getType = getCalleeType(interfaceMember, receiverType);
+      DartType getType = getCalleeType(interfaceMember, receiverType);
       if (getType is DynamicType) {
         return MethodContravarianceCheckKind.none;
       }
@@ -1781,7 +1802,7 @@
       }
     }
 
-    var resolved = resolveOneStep(type);
+    DartType resolved = resolveOneStep(type);
     if (resolved == null) return type;
 
     // Detect circularities using the tortoise-and-hare algorithm.
@@ -1795,9 +1816,9 @@
       }
 
       // Hare takes two steps
-      var step1 = resolveOneStep(hare);
+      DartType step1 = resolveOneStep(hare);
       if (step1 == null) return hare;
-      var step2 = resolveOneStep(step1);
+      DartType step2 = resolveOneStep(step1);
       if (step2 == null) return hare;
       hare = step2;
 
@@ -1818,7 +1839,7 @@
   }
 
   DartType wrapFutureType(DartType type) {
-    var typeWithoutFutureOr = type ?? const DynamicType();
+    DartType typeWithoutFutureOr = type ?? const DynamicType();
     return new InterfaceType(
         coreTypes.futureClass, <DartType>[typeWithoutFutureOr]);
   }
@@ -1829,10 +1850,10 @@
 
   void _forEachArgument(
       Arguments arguments, void callback(String name, Expression expression)) {
-    for (var expression in arguments.positional) {
+    for (Expression expression in arguments.positional) {
       callback(null, expression);
     }
-    for (var namedExpression in arguments.named) {
+    for (kernel.NamedExpression namedExpression in arguments.named) {
       callback(namedExpression.name, namedExpression.value);
     }
   }
@@ -1872,7 +1893,7 @@
       return templateInvalidCastNewExpr;
     }
     if (expression is StaticGet) {
-      var target = expression.target;
+      Member target = expression.target;
       if (target is Procedure && target.kind == ProcedureKind.Method) {
         if (target.enclosingClass != null) {
           return templateInvalidCastStaticMethod;
@@ -1883,7 +1904,7 @@
       return null;
     }
     if (expression is VariableGet) {
-      var variable = expression.variable;
+      VariableDeclaration variable = expression.variable;
       if (variable is VariableDeclarationJudgment &&
           VariableDeclarationJudgment.isLocalFunction(variable)) {
         return templateInvalidCastLocalFunction;
@@ -1949,7 +1970,7 @@
       // abstract class S0&S1<...> extends Object implements S0, S1 {}
       // abstract class S0&S1<...> = S0 with S1;
       // abstract class S0&S1<...> extends S0 implements S1 {}
-      var mixinSuperclass = mixinSupertype.classNode;
+      Class mixinSuperclass = mixinSupertype.classNode;
       if (mixinSuperclass.mixedInType == null &&
           mixinSuperclass.implementedTypes.length != 1 &&
           (mixinSuperclass.superclass != coreTypes.objectClass ||
@@ -1962,7 +1983,7 @@
             mixinSuperclass.fileOffset,
             mixinSuperclass.fileUri);
       }
-      var substitution = Substitution.fromSupertype(mixinSupertype);
+      Substitution substitution = Substitution.fromSupertype(mixinSupertype);
       Supertype s0, s1;
       if (mixinSuperclass.implementedTypes.length == 2) {
         s0 = mixinSuperclass.implementedTypes[0];
@@ -2015,10 +2036,10 @@
     generateConstraints(mixinClass, baseType, mixinSupertype);
     // Solve them to get a map from type parameters to upper and lower
     // bounds.
-    var result = gatherer.computeConstraints();
+    Map<TypeParameter, TypeConstraint> result = gatherer.computeConstraints();
     // Generate new type parameters with the solution as bounds.
     List<TypeParameter> parameters = mixinClass.typeParameters.map((p) {
-      var constraint = result[p];
+      TypeConstraint constraint = result[p];
       // Because we solved for equality, a valid solution has a parameter
       // either unconstrained or else with identical upper and lower bounds.
       if (constraint != null && constraint.upper != constraint.lower) {
@@ -2036,9 +2057,10 @@
     }).toList();
     // Bounds might mention the mixin class's type parameters so we have to
     // substitute them before calling instantiate to bounds.
-    var substitution = Substitution.fromPairs(mixinClass.typeParameters,
+    Substitution substitution = Substitution.fromPairs(
+        mixinClass.typeParameters,
         parameters.map((p) => new TypeParameterType(p)).toList());
-    for (var p in parameters) {
+    for (TypeParameter p in parameters) {
       p.bound = substitution.substituteType(p.bound);
     }
     // Use instantiate to bounds.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index 69c352e..f8f0ff5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -230,8 +230,8 @@
   void enterLogicalExpression(Expression lhs, String operator) {
     debugEvent('enterLogicalExpression');
     // Figure out what the facts are based on possible LHS outcomes.
-    var trueFacts = _factsWhenTrue(lhs);
-    var falseFacts = _factsWhenFalse(lhs);
+    TypePromotionFact trueFacts = _factsWhenTrue(lhs);
+    TypePromotionFact falseFacts = _factsWhenFalse(lhs);
     // Record the fact that we are entering a new scope, and save the
     // appropriate facts for the case where the expression gets short-cut.
     bool isAnd = identical(operator, '&&');
@@ -246,8 +246,8 @@
   void enterThen(Expression condition) {
     debugEvent('enterThen');
     // Figure out what the facts are based on possible condition outcomes.
-    var trueFacts = _factsWhenTrue(condition);
-    var falseFacts = _factsWhenFalse(condition);
+    TypePromotionFact trueFacts = _factsWhenTrue(condition);
+    TypePromotionFact falseFacts = _factsWhenFalse(condition);
     // Record the fact that we are entering a new scope, and save the "false"
     // facts for when we enter the "else" branch.
     _currentScope = new _ConditionalScope(_currentScope, falseFacts);
@@ -295,7 +295,7 @@
   TypePromotionFact getFactForAccess(
       VariableDeclaration variable, int functionNestingLevel) {
     debugEvent('getFactForAccess');
-    var fact = _computeCurrentFactMap()[variable];
+    TypePromotionFact fact = _computeCurrentFactMap()[variable];
     TypePromotionFact._recordAccessedInScope(
         fact, _currentScope, functionNestingLevel);
     return fact;
@@ -309,7 +309,7 @@
       VariableDeclaration variable, DartType type, int functionNestingLevel) {
     debugEvent('handleIsCheck');
     if (!isPromotionCandidate(variable)) return;
-    var isCheck = new _IsCheck(
+    _IsCheck isCheck = new _IsCheck(
         ++_lastFactSequenceNumber,
         variable,
         _currentFacts,
@@ -333,7 +333,7 @@
   /// mutated.
   void mutateVariable(VariableDeclaration variable, int functionNestingLevel) {
     debugEvent('mutateVariable');
-    var fact = _computeCurrentFactMap()[variable];
+    TypePromotionFact fact = _computeCurrentFactMap()[variable];
     TypePromotionFact._recordMutatedInScope(fact, _currentScope);
     if (getVariableFunctionNestingLevel(variable) < functionNestingLevel) {
       setVariableMutatedInClosure(variable);
@@ -386,7 +386,7 @@
     for (TypePromotionFact newState = _currentFacts;
         !identical(newState, commonAncestor);
         newState = newState.previous) {
-      var currentlyCached = _factCache[newState.variable];
+      TypePromotionFact currentlyCached = _factCache[newState.variable];
       // Note: Since we roll forward the most recent facts first, we need to be
       // careful not write an older fact over a newer one.
       if (currentlyCached == null ||
@@ -654,13 +654,13 @@
   @override
   DartType _computePromotedType(
       TypePromoterImpl promoter, TypePromotionScope scope) {
-    var previousPromotedType =
+    DartType previousPromotedType =
         previousForVariable?._computePromotedType(promoter, scope);
 
     // If the variable was mutated somewhere in the scope of the potential
     // promotion, promotion does not occur.
     if (_mutatedInScopes != null) {
-      for (var assignmentScope in _mutatedInScopes) {
+      for (TypePromotionScope assignmentScope in _mutatedInScopes) {
         if (assignmentScope.containsScope(scope)) {
           return previousPromotedType;
         }
@@ -672,7 +672,7 @@
     // not occur.
     if (promoter.wasVariableMutatedAnywhere(variable) &&
         _accessedInClosureInScopes != null) {
-      for (var accessScope in _accessedInClosureInScopes) {
+      for (TypePromotionScope accessScope in _accessedInClosureInScopes) {
         if (accessScope.containsScope(scope)) {
           return previousPromotedType;
         }
@@ -681,7 +681,7 @@
 
     // What we do now depends on the relationship between the previous type of
     // the variable and the type we are checking against.
-    var previousType = previousPromotedType ?? variable.type;
+    DartType previousType = previousPromotedType ?? variable.type;
     if (promoter.typeSchemaEnvironment.isSubtypeOf(checkedType, previousType)) {
       // The type we are checking against is a subtype of the previous type of
       // the variable, so this is a refinement; we can promote.
diff --git a/pkg/front_end/lib/src/fasta/uri_translator.dart b/pkg/front_end/lib/src/fasta/uri_translator.dart
index 4d0d91e..bb2b025 100644
--- a/pkg/front_end/lib/src/fasta/uri_translator.dart
+++ b/pkg/front_end/lib/src/fasta/uri_translator.dart
@@ -50,6 +50,16 @@
     return packageBaseUri.fragment;
   }
 
+  /// Get the fragment for the package specified as the default package, if any.
+  String getDefaultPackageFragment() {
+    Uri emptyPackageRedirect = packages.asMap()[""];
+    if (emptyPackageRedirect == null) return null;
+    String packageName = emptyPackageRedirect.toString();
+    Uri packageBaseUri = packages.asMap()[packageName];
+    if (packageBaseUri == null) return null;
+    return packageBaseUri.fragment;
+  }
+
   bool isLibrarySupported(String libraryName) {
     // TODO(sigmund): change this to `?? false` when all backends provide the
     // `libraries.json` file by default (Issue #32657).
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 76adabd..56dfe2e 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -323,7 +323,6 @@
 InvalidCatchArguments/example: Fail
 InvalidContinueTarget/analyzerCode: Fail
 InvalidContinueTarget/example: Fail
-InvalidInitializer/analyzerCode: Fail # The analyzer reports a different error
 InvalidInitializer/example: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 4b3a96a..0b53548 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -925,8 +925,10 @@
 # TODO(danrubel): Review where this error is generated and consider generating
 # FieldInitializedOutsideDeclaringClass instead of this in some situations.
 InvalidInitializer:
+  index: 90
   template: "Not a valid initializer."
   tip: "To initialize a field, use the syntax 'name = value'."
+  analyzerCode: ParserErrorCode.INVALID_INITIALIZER
 
 FieldInitializedOutsideDeclaringClass:
   index: 88
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 731b221..2842dbf 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -9,7 +9,7 @@
   sdk: '>=2.2.2 <3.0.0'
 dependencies:
   kernel: 0.3.22
-  package_config: '^1.0.1'
+  package_config: '^1.1.0'
   path: '^1.3.9'
   yaml: '^2.1.12'
 dev_dependencies:
diff --git a/pkg/front_end/test/fasta/outline_test.dart b/pkg/front_end/test/fasta/outline_test.dart
index 3551732..43e9cc9 100644
--- a/pkg/front_end/test/fasta/outline_test.dart
+++ b/pkg/front_end/test/fasta/outline_test.dart
@@ -10,7 +10,6 @@
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  environment[LEGACY_MODE] = "";
   return FastaContext.create(suite, environment);
 }
 
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages
new file mode 100644
index 0000000..6a19ae2
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart
new file mode 100644
index 0000000..c669c23
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo.dart
@@ -0,0 +1,13 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.8*/
+
+import 'foo2.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart
new file mode 100644
index 0000000..0e38837
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/lib/foo2.dart
@@ -0,0 +1,12 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.4
+
+/*library: languageVersion=2.4*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/main.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_empty/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages
new file mode 100644
index 0000000..b18dc60
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/.packages
@@ -0,0 +1,2 @@
+foo:lib/#dart=2.5.3-dev.2
+:foo
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart
new file mode 100644
index 0000000..3870a48
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/main.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:foo/foo.dart';
+
+// Version comes from "default package" in .packages.
+
+/*library: languageVersion=2.5*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages
new file mode 100644
index 0000000..c86b3a4
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=2.5.3-dev.2
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart
new file mode 100644
index 0000000..5117999
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/main.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.8*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_no_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages
new file mode 100644
index 0000000..24fcebf
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/.packages
@@ -0,0 +1,2 @@
+foo:lib/#dart=2.5.3-dev.2
+:bar
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart
new file mode 100644
index 0000000..1fe23f3
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/lib/foo.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library: languageVersion=2.5*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart
new file mode 100644
index 0000000..5117999
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/main.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.8*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_non_package_wrong_redirect/pubspec.yaml
@@ -0,0 +1,5 @@
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index 606ccfd..e22cfe5 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -1,13 +1,3 @@
 # 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.
-
-src/fasta/flow_analysis/flow_analysis: Fail
-src/fasta/kernel/body_builder: Fail
-src/fasta/kernel/expression_generator: Fail
-src/fasta/kernel/inference_visitor: Fail
-src/fasta/kernel/kernel_shadow_ast: Fail
-src/fasta/parser/parser: Fail
-src/fasta/type_inference/type_constraint_gatherer: Fail
-src/fasta/type_inference/type_inferrer: Fail
-src/fasta/type_inference/type_promotion: Fail
diff --git a/pkg/front_end/test/old_dill_test.dart b/pkg/front_end/test/old_dill_test.dart
new file mode 100644
index 0000000..df757c40
--- /dev/null
+++ b/pkg/front_end/test/old_dill_test.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async' show Future;
+
+import 'dart:io';
+
+import 'package:kernel/binary/tag.dart' show Tag;
+
+import 'package:testing/testing.dart'
+    show ChainContext, Result, Step, TestDescription, Chain, runMe;
+
+Future<Null> main([List<String> arguments = const []]) async {
+  if (arguments.length == 1 && arguments[0] == "--generate") {
+    print("Should now generate a dill of dart2js.");
+    await generateDill();
+    return null;
+  } else if (arguments.length == 1 && arguments[0] == "--checkDill") {
+    await checkDill();
+    return null;
+  }
+  await runMe(arguments, createContext, "../testing.json");
+  await checkDill();
+}
+
+String get dartVm => Platform.resolvedExecutable;
+
+Uri generateOutputUri(int binaryVersion, int compileNumber) {
+  return Uri.base.resolve("pkg/front_end/testcases/old_dills/"
+      "dart2js"
+      ".version.$binaryVersion"
+      ".compile.$compileNumber"
+      ".dill");
+}
+
+verifyNotUsingCheckedInDart() {
+  String vm = dartVm.replaceAll(r"\", "/");
+  if (vm.contains("tools/sdks/dart-sdk/bin/dart")) {
+    throw "Running with checked-in VM which is not supported";
+  }
+}
+
+Future<Null> checkDill() async {
+  Uri uri = generateOutputUri(Tag.BinaryFormatVersion, 1);
+  if (!new File.fromUri(uri).existsSync()) {
+    print("File $uri doesn't exist. Generate running script");
+    print("${Platform.script.toFilePath()} --generate");
+    exit(1);
+  }
+}
+
+Future<Null> generateDill() async {
+  Uri fastaCompile = Uri.base.resolve("pkg/front_end/tool/_fasta/compile.dart");
+  if (!new File.fromUri(fastaCompile).existsSync()) {
+    throw "compile.dart from fasta tools couldn't be found";
+  }
+
+  Uri dart2js = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
+  if (!new File.fromUri(dart2js).existsSync()) {
+    throw "dart2js couldn't be found";
+  }
+
+  int compileNumber = 0;
+  Uri output;
+  do {
+    compileNumber++;
+    output = generateOutputUri(Tag.BinaryFormatVersion, compileNumber);
+  } while (new File.fromUri(output).existsSync());
+
+  ProcessResult result = await Process.run(
+      dartVm,
+      [
+        fastaCompile.toFilePath(),
+        "sdkroot:/pkg/compiler/bin/dart2js.dart",
+        "-o",
+        output.toFilePath(),
+        "--target=vm",
+        "--single-root-base=${Uri.base.toFilePath()}",
+        "--single-root-scheme=sdkroot",
+      ],
+      workingDirectory: Uri.base.toFilePath());
+  if (result.exitCode != 0) {
+    print("stdout: ${result.stdout}");
+    print("stderr: ${result.stderr}");
+    print("Exit code: ${result.exitCode}");
+    throw "Got exit code ${result.exitCode}";
+  } else {
+    print("File generated.");
+  }
+}
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  return new Context();
+}
+
+class Context extends ChainContext {
+  final List<Step> steps = const <Step>[
+    const RunDill(),
+  ];
+}
+
+class RunDill extends Step<TestDescription, TestDescription, Context> {
+  const RunDill();
+
+  String get name => "RunDill";
+
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    verifyNotUsingCheckedInDart();
+    ProcessResult result = await Process.run(
+        dartVm,
+        [
+          "--compile_all",
+          description.uri.toFilePath(),
+          "-h",
+        ],
+        workingDirectory: Uri.base.toFilePath());
+    print("stdout: ${result.stdout}");
+    print("stderr: ${result.stderr}");
+    print("Exit code: ${result.exitCode}");
+    if (result.exitCode != 0) {
+      return fail(description, "Got exit code ${result.exitCode}");
+    }
+    return pass(description);
+  }
+}
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 794a2a1..df8d7bd 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -108,6 +108,7 @@
 dictionary
 differs
 dillfile
+dills
 dirname
 disagree
 disconnect
@@ -316,6 +317,8 @@
 scans
 screen
 scripts
+sdkroot
+sdks
 secondary
 seconds
 segment
diff --git a/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect b/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
index f7cedf9..dfcdbe8 100644
--- a/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_instance_access.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:24: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension on Class {
-//                        ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:24: Error: 'Class' is already declared in this scope.
-// extension Extension on Class {
-//                        ^^^^^
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class {
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension GenericExtension<T> on GenericClass<T> {
-//           ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:31: Error: Expected '{' before this.
-// extension GenericExtension<T> on GenericClass<T> {
-//                               ^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:34: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension GenericExtension<T> on GenericClass<T> {
-//                                  ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:34: Error: 'GenericClass' is already declared in this scope.
-// extension GenericExtension<T> on GenericClass<T> {
-//                                  ^^^^^^^^^^^^
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:69:7: Context: Previous declaration of 'GenericClass'.
-// class GenericClass<T> {
-//       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:1: Warning: Type 'extension' not found.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:9:21: Warning: Type 'on' not found.
-// extension Extension on Class {
-//                     ^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:1: Warning: Type 'extension' not found.
-// extension GenericExtension<T> on GenericClass<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_instance_access.dart:73:31: Warning: Type 'on' not found.
-// extension GenericExtension<T> on GenericClass<T> {
-//                               ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -69,8 +12,105 @@
   synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
     ;
 }
-static field invalid-type Extension;
-static method GenericExtension<T extends core::Object* = dynamic>() → invalid-type
+extension Extension on self::Class* {
+  method readGetter = self::Extension|readGetter;
+  method writeSetterRequired = self::Extension|writeSetterRequired;
+  method writeSetterOptional = self::Extension|writeSetterOptional;
+  method writeSetterNamed = self::Extension|writeSetterNamed;
+  get tearOffGetterNoArgs = self::Extension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::Extension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::Extension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::Extension|get#tearOffGetterNamed;
+  get property = self::Extension|get#property;
+  method invocations = self::Extension|invocations;
+  method tearOffs = self::Extension|tearOffs;
+  method getterCalls = self::Extension|getterCalls;
+  set property = self::Extension|set#property;
+}
+extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
+  method readGetter = self::GenericExtension|readGetter;
+  method writeSetterRequired = self::GenericExtension|writeSetterRequired;
+  method writeSetterOptional = self::GenericExtension|writeSetterOptional;
+  method writeSetterNamed = self::GenericExtension|writeSetterNamed;
+  method genericWriteSetterRequired = self::GenericExtension|genericWriteSetterRequired;
+  method genericWriteSetterOptional = self::GenericExtension|genericWriteSetterOptional;
+  method genericWriteSetterNamed = self::GenericExtension|genericWriteSetterNamed;
+  get property = self::GenericExtension|get#property;
+  get tearOffGetterNoArgs = self::GenericExtension|get#tearOffGetterNoArgs;
+  get tearOffGetterRequired = self::GenericExtension|get#tearOffGetterRequired;
+  get tearOffGetterOptional = self::GenericExtension|get#tearOffGetterOptional;
+  get tearOffGetterNamed = self::GenericExtension|get#tearOffGetterNamed;
+  get tearOffGetterGenericRequired = self::GenericExtension|get#tearOffGetterGenericRequired;
+  get tearOffGetterGenericOptional = self::GenericExtension|get#tearOffGetterGenericOptional;
+  get tearOffGetterGenericNamed = self::GenericExtension|get#tearOffGetterGenericNamed;
+  method invocations = self::GenericExtension|invocations;
+  method tearOffs = self::GenericExtension|tearOffs;
+  method getterCalls = self::GenericExtension|getterCalls;
+  set property = self::GenericExtension|set#property;
+}
+static method Extension|readGetter(final self::Class* #this) → dynamic
+  ;
+static method Extension|writeSetterRequired(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|writeSetterOptional(final self::Class* #this, [dynamic value]) → dynamic
+  ;
+static method Extension|writeSetterNamed(final self::Class* #this, {dynamic value}) → dynamic
+  ;
+static method Extension|get#tearOffGetterNoArgs(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterRequired(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterOptional(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dynamic
+  ;
+static method Extension|get#property(final self::Class* #this) → dynamic
+  ;
+static method Extension|set#property(final self::Class* #this, dynamic value) → void
+  ;
+static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|tearOffs(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method Extension|getterCalls(final self::Class* #this, dynamic value) → dynamic
+  ;
+static method GenericExtension|readGetter<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|readGetter::#T*>* #this) → self::GenericExtension|readGetter::#T*
+  ;
+static method GenericExtension|writeSetterRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterRequired::#T*>* #this, self::GenericExtension|writeSetterRequired::#T* value) → dynamic
+  ;
+static method GenericExtension|writeSetterOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterOptional::#T*>* #this, [self::GenericExtension|writeSetterOptional::#T* value]) → dynamic
+  ;
+static method GenericExtension|writeSetterNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterNamed::#T*>* #this, {self::GenericExtension|writeSetterNamed::#T* value}) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterRequired<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::#T*>* #this, self::GenericExtension|genericWriteSetterRequired::S value) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterOptional<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::#T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S value]) → dynamic
+  ;
+static method GenericExtension|genericWriteSetterNamed<#T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::#T = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::#T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S value}) → dynamic
+  ;
+static method GenericExtension|get#property<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::#T*>* #this) → self::GenericExtension|get#property::#T*
+  ;
+static method GenericExtension|set#property<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::#T*>* #this, self::GenericExtension|set#property::#T* value) → void
+  ;
+static method GenericExtension|get#tearOffGetterNoArgs<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericRequired<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericOptional<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|get#tearOffGetterGenericNamed<#T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::#T*>* #this) → dynamic
+  ;
+static method GenericExtension|invocations<#T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::#T = dynamic>(final self::GenericClass<self::GenericExtension|invocations::#T*>* #this, self::GenericExtension|invocations::S value) → dynamic
+  ;
+static method GenericExtension|tearOffs<#T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::#T = dynamic>(final self::GenericClass<self::GenericExtension|tearOffs::#T*>* #this, self::GenericExtension|tearOffs::S value) → dynamic
+  ;
+static method GenericExtension|getterCalls<#T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::#T = dynamic>(final self::GenericClass<self::GenericExtension|getterCalls::#T*>* #this, self::GenericExtension|getterCalls::S value) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect b/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
index e6826b8..5a1e9ab 100644
--- a/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/direct_static_access.dart.outline.expect
@@ -1,36 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension<T> on Class<T> {
-//           ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:24: Error: Expected '{' before this.
-// extension Extension<T> on Class<T> {
-//                        ^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:27: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension<T> on Class<T> {
-//                           ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:27: Error: 'Class' is already declared in this scope.
-// extension Extension<T> on Class<T> {
-//                           ^^^^^
-// pkg/front_end/testcases/extensions/direct_static_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class<T> {
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:1: Warning: Type 'extension' not found.
-// extension Extension<T> on Class<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/direct_static_access.dart:9:24: Warning: Type 'on' not found.
-// extension Extension<T> on Class<T> {
-//                        ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -39,7 +7,81 @@
   synthetic constructor •() → self::Class<self::Class::T*>*
     ;
 }
-static method Extension<T extends core::Object* = dynamic>() → invalid-type
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static method readGetter = self::Extension|readGetter;
+  static method writeSetterRequired = self::Extension|writeSetterRequired;
+  static method writeSetterOptional = self::Extension|writeSetterOptional;
+  static method writeSetterNamed = self::Extension|writeSetterNamed;
+  static method genericWriteSetterRequired = self::Extension|genericWriteSetterRequired;
+  static method genericWriteSetterOptional = self::Extension|genericWriteSetterOptional;
+  static method genericWriteSetterNamed = self::Extension|genericWriteSetterNamed;
+  static get tearOffGetterNoArgs = get self::Extension|tearOffGetterNoArgs;
+  static get tearOffGetterRequired = get self::Extension|tearOffGetterRequired;
+  static get tearOffGetterOptional = get self::Extension|tearOffGetterOptional;
+  static get tearOffGetterNamed = get self::Extension|tearOffGetterNamed;
+  static get tearOffGetterGenericRequired = get self::Extension|tearOffGetterGenericRequired;
+  static get tearOffGetterGenericOptional = get self::Extension|tearOffGetterGenericOptional;
+  static get tearOffGetterGenericNamed = get self::Extension|tearOffGetterGenericNamed;
+  static method invocationsFromStaticContext = self::Extension|invocationsFromStaticContext;
+  static method tearOffsFromStaticContext = self::Extension|tearOffsFromStaticContext;
+  static method fieldAccessFromStaticContext = self::Extension|fieldAccessFromStaticContext;
+  static method getterCallsFromStaticContext = self::Extension|getterCallsFromStaticContext;
+  method invocationsFromInstanceContext = self::Extension|invocationsFromInstanceContext;
+  method tearOffsFromInstanceContext = self::Extension|tearOffsFromInstanceContext;
+  method fieldAccessFromInstanceContext = self::Extension|fieldAccessFromInstanceContext;
+  method getterCallsFromInstanceContext = self::Extension|getterCallsFromInstanceContext;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static get Extension|property() → dynamic
+  ;
+static set Extension|property(dynamic value) → void
+  ;
+static method Extension|readGetter() → dynamic
+  ;
+static method Extension|writeSetterRequired(dynamic value) → dynamic
+  ;
+static method Extension|writeSetterOptional([dynamic value]) → dynamic
+  ;
+static method Extension|writeSetterNamed({dynamic value}) → dynamic
+  ;
+static method Extension|genericWriteSetterRequired<S extends core::Object* = dynamic>(self::Extension|genericWriteSetterRequired::S* value) → dynamic
+  ;
+static method Extension|genericWriteSetterOptional<S extends core::Object* = dynamic>([self::Extension|genericWriteSetterOptional::S* value]) → dynamic
+  ;
+static method Extension|genericWriteSetterNamed<S extends core::Object* = dynamic>({self::Extension|genericWriteSetterNamed::S* value}) → dynamic
+  ;
+static get Extension|tearOffGetterNoArgs() → dynamic
+  ;
+static get Extension|tearOffGetterRequired() → dynamic
+  ;
+static get Extension|tearOffGetterOptional() → dynamic
+  ;
+static get Extension|tearOffGetterNamed() → dynamic
+  ;
+static get Extension|tearOffGetterGenericRequired() → dynamic
+  ;
+static get Extension|tearOffGetterGenericOptional() → dynamic
+  ;
+static get Extension|tearOffGetterGenericNamed() → dynamic
+  ;
+static method Extension|invocationsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|tearOffsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|fieldAccessFromStaticContext() → dynamic
+  ;
+static method Extension|getterCallsFromStaticContext(core::int* value) → dynamic
+  ;
+static method Extension|invocationsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|invocationsFromInstanceContext::#T*>* #this, self::Extension|invocationsFromInstanceContext::#T* value) → dynamic
+  ;
+static method Extension|tearOffsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|tearOffsFromInstanceContext::#T*>* #this, self::Extension|tearOffsFromInstanceContext::#T* value) → dynamic
+  ;
+static method Extension|fieldAccessFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|fieldAccessFromInstanceContext::#T*>* #this) → dynamic
+  ;
+static method Extension|getterCallsFromInstanceContext<#T extends core::Object* = dynamic>(final self::Class<self::Extension|getterCallsFromInstanceContext::#T*>* #this, self::Extension|getterCallsFromInstanceContext::#T* value) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
index 6102ceb..0819186 100644
--- a/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/explicit_this.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/explicit_this.dart:10:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -37,6 +9,16 @@
   method method1() → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+static method A2|method2(final self::A1* #this) → void
+  ;
+static method A2|method3(final self::A1* #this) → core::Object*
+  ;
+static method A2|method4(final self::A1* #this, core::Object* o) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
index ba9ea5f..0819186 100644
--- a/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/implicit_this.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/implicit_this.dart:10:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -37,6 +9,16 @@
   method method1() → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+static method A2|method2(final self::A1* #this) → void
+  ;
+static method A2|method3(final self::A1* #this) → core::Object*
+  ;
+static method A2|method4(final self::A1* #this, core::Object* o) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
index f1182fb..c2ae0c9 100644
--- a/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/instance_members.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Error: Expected '{' before this.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: 'B1' is already declared in this scope.
-// extension B2<T> on B1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/instance_members.dart:28:7: Context: Previous declaration of 'B1'.
-// class B1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:7:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:1: Warning: Type 'extension' not found.
-// extension B2<T> on B1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Warning: Type 'on' not found.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -67,8 +10,27 @@
   synthetic constructor •() → self::B1<self::B1::T*>*
     ;
 }
-static field invalid-type A2;
-static method B2<T extends core::Object* = dynamic>() → invalid-type
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+  method method3 = self::A2|method3;
+  method method4 = self::A2|method4;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  method method2 = self::B2|method2;
+}
+static method A2|method1(final self::A1* #this) → self::A1*
+  ;
+static method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1*
+  ;
+static method A2|method3<T extends core::Object* = dynamic>(final self::A1* #this, [self::A2|method3::T* o]) → self::A1*
+  ;
+static method A2|method4<T extends core::Object* = dynamic>(final self::A1* #this, {self::A2|method4::T* o}) → self::A1*
+  ;
+static method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>*
+  ;
+static method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(final self::B1<self::B2|method2::#T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect b/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
index a323fdb..48438c1 100644
--- a/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/other_kinds.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/other_kinds.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1 {
-//       ^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/other_kinds.dart:18:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -44,6 +16,24 @@
   static method setStaticField(core::int* value) → void
     ;
 }
-static field invalid-type A2;
+extension A2 on self::A1* {
+  get instanceProperty = self::A2|get#instanceProperty;
+  operator + = self::A2|+;
+  static field staticField = self::A2|staticField;
+  static get staticProperty = get self::A2|staticProperty;
+  set instanceProperty = self::A2|set#instanceProperty;
+  static set staticProperty = set self::A2|staticProperty;
+}
+static field core::int* A2|staticField;
+static method A2|get#instanceProperty(final self::A1* #this) → core::int*
+  ;
+static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → void
+  ;
+static method A2|+(final self::A1* #this, core::int* value) → core::int*
+  ;
+static get A2|staticProperty() → core::int*
+  ;
+static set A2|staticProperty(core::int* value) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/static_access.dart.outline.expect b/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
index 8334102..4e9dc86 100644
--- a/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/static_access.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:24: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension Extension on Class {
-//                        ^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:24: Error: 'Class' is already declared in this scope.
-// extension Extension on Class {
-//                        ^^^^^
-// pkg/front_end/testcases/extensions/static_access.dart:5:7: Context: Previous declaration of 'Class'.
-// class Class {}
-//       ^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:1: Warning: Type 'extension' not found.
-// extension Extension on Class {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/static_access.dart:7:21: Warning: Type 'on' not found.
-// extension Extension on Class {
-//                     ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -34,6 +6,21 @@
   synthetic constructor •() → self::Class*
     ;
 }
-static field invalid-type Extension;
+extension Extension on self::Class* {
+  static method method = self::Extension|method;
+  static method genericMethod = self::Extension|genericMethod;
+  static get property = get self::Extension|property;
+  static field field = self::Extension|field;
+  static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic
+  ;
+static method Extension|genericMethod<T extends core::Object* = dynamic>(self::Extension|genericMethod::T* t) → dynamic
+  ;
+static get Extension|property() → dynamic
+  ;
+static set Extension|property(dynamic value) → void
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
index a6d69ea..3689d95 100644
--- a/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
@@ -1,36 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2<T> on A1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Error: Expected '{' before this.
-// extension A2<T> on A1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2<T> on A1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: 'A1' is already declared in this scope.
-// extension A2<T> on A1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/type_variables.dart:5:7: Context: Previous declaration of 'A1'.
-// class A1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:1: Warning: Type 'extension' not found.
-// extension A2<T> on A1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Warning: Type 'on' not found.
-// extension A2<T> on A1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -38,7 +6,13 @@
   synthetic constructor •() → self::A1<self::A1::T*>*
     ;
 }
-static method A2<T extends core::Object* = dynamic>() → invalid-type
+extension A2<T extends core::Object* = dynamic> on self::A1<T*>* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+}
+static method A2|method1<#T extends core::Object* = dynamic, S extends self::A2|method1::#T = dynamic>(final self::A1<self::A2|method1::#T*>* #this) → self::A1<self::A2|method1::#T*>*
+  ;
+static method A2|method2<#T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::#T>* = dynamic>(final self::A1<self::A2|method2::#T*>* #this, self::A2|method2::S* o) → self::A1<self::A2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.outline.expect b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
index 9c0d4ca..dbd8b2e 100644
--- a/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
+++ b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
@@ -1,61 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension A2 on A1 {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: 'A1' is already declared in this scope.
-// extension A2 on A1 {
-//                 ^^
-// pkg/front_end/testcases/extensions/use_this.dart:7:7: Context: Previous declaration of 'A1'.
-// class A1 {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:11: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//           ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:17: Error: Expected '{' before this.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension B2<T> on B1<T> {
-//                    ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: 'B1' is already declared in this scope.
-// extension B2<T> on B1<T> {
-//                    ^^
-// pkg/front_end/testcases/extensions/use_this.dart:20:7: Context: Previous declaration of 'B1'.
-// class B1<T> {}
-//       ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: Type 'extension' not found.
-// extension A2 on A1 {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:9:14: Warning: Type 'on' not found.
-// extension A2 on A1 {
-//              ^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:1: Warning: Type 'extension' not found.
-// extension B2<T> on B1<T> {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extensions/use_this.dart:22:17: Warning: Type 'on' not found.
-// extension B2<T> on B1<T> {
-//                 ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -67,8 +10,21 @@
   synthetic constructor •() → self::B1<self::B1::T*>*
     ;
 }
-static field invalid-type A2;
-static method B2<T extends core::Object* = dynamic>() → invalid-type
+extension A2 on self::A1* {
+  method method1 = self::A2|method1;
+  method method2 = self::A2|method2;
+}
+extension B2<T extends core::Object* = dynamic> on self::B1<T*>* {
+  method method1 = self::B2|method1;
+  method method2 = self::B2|method2;
+}
+static method A2|method1(final self::A1* #this) → self::A1*
+  ;
+static method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1*
+  ;
+static method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>*
+  ;
+static method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(final self::B1<self::B2|method2::#T*>* #this, self::B2|method2::S* o) → self::B1<self::B2|method2::#T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
index daecf9e..0d1797b 100644
--- a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -183,13 +183,13 @@
   method execute() → void
     ;
 }
-static const field dynamic REQUIRED = const self::Strength::•(0, "required");
-static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
-static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
-static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
-static const field dynamic NORMAL = const self::Strength::•(4, "normal");
-static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
-static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
+static const field self::Strength* REQUIRED = const self::Strength::•(0, "required");
+static const field self::Strength* STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
+static const field self::Strength* PREFERRED = const self::Strength::•(2, "preferred");
+static const field self::Strength* STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
+static const field self::Strength* NORMAL = const self::Strength::•(4, "normal");
+static const field self::Strength* WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
+static const field self::Strength* WEAKEST = const self::Strength::•(6, "weakest");
 static const field core::int* NONE = 1;
 static const field core::int* FORWARD = 2;
 static const field core::int* BACKWARD = 0;
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
index 466c02c..4c54d2f 100644
--- a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
@@ -14,7 +14,7 @@
   static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
   @self::hest
   static const field self::Foo* bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<dynamic>(self::hest)
+  @self::Fisk::fisk<core::int*>(self::hest)
   static const field self::Foo* baz = const self::Foo::•(1, "Foo.baz");
   static const field self::Foo* cafebabe = const self::Foo::•(2, "Foo.cafebabe");
   const constructor •(core::int* index, core::String* _name) → self::Foo*
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
index 60367e2..750b872 100644
--- a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
@@ -5,13 +5,13 @@
 class A<X extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
-  method bar<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+  method bar<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
     ;
 }
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  static method foo<Y extends core::Object* = dynamic>() → self::A<self::B::foo::Y*>*
+  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
     ;
 }
 static method baz() → dynamic
diff --git a/pkg/front_end/testcases/general/bug30695.dart.outline.expect b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
index bb6576d..8ab1586 100644
--- a/pkg/front_end/testcases/general/bug30695.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
@@ -13,7 +13,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic foo;
+  field core::int* foo;
   synthetic constructor •() → self::A*
     ;
 }
diff --git a/pkg/front_end/testcases/general/bug31124.dart.outline.expect b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
index 8e65e77..7ac93d0 100644
--- a/pkg/front_end/testcases/general/bug31124.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
@@ -15,5 +15,6 @@
 //     ^
 //
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field () →* core::String* a;
diff --git a/pkg/front_end/testcases/general/bug32866.dart.outline.expect b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
index cb6153c..6857612 100644
--- a/pkg/front_end/testcases/general/bug32866.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
@@ -9,9 +9,9 @@
 }
 class A extends core::Object implements self::B {
   final field core::String* f;
-  constructor •(dynamic f) → self::A*
+  constructor •(core::String* f) → self::A*
     ;
 }
-static field dynamic a;
+static field self::A* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/bug35470.dart.outline.expect b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
index e3abe47..c18a369 100644
--- a/pkg/front_end/testcases/general/bug35470.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
@@ -5,7 +5,7 @@
 class A<X extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::A<self::A::X*>*
     ;
-  method foo<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+  method foo<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
     ;
 }
 class B extends self::A<dynamic> {
diff --git a/pkg/front_end/testcases/general/bug37476.dart.outline.expect b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
index 6c89350..50be2c0 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.outline.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void
     ;
 }
-class B<T extends core::num* = dynamic> extends core::Object {
+class B<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
   method foo() → (self::B::T*) →* void
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
index a5d2ec8..efd56f1 100644
--- a/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
index a513a65..9871382 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
@@ -21,6 +21,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
index a5d2ec8..efd56f1 100644
--- a/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
index 82269cd..37e88f3 100644
--- a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
@@ -19,6 +19,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
index 297fe46..fb0387c 100644
--- a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
@@ -1,12 +1,20 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/circularity-via-initializing-formal.dart:15:3: Error: Can't infer the type of 'C._circular': circularity found during type inference.
+// Specify the type explicitly.
+//   C._circular(this.f);
+//   ^^^^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic f;
-  constructor _circular(dynamic f) → self::C*
+  field self::C* f;
+  constructor _circular(self::C* f) → self::C*
     ;
 }
-static field dynamic x;
+static field self::C* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
index a2cf5b5..24bf6bc 100644
--- a/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
@@ -26,6 +26,74 @@
 // class Ef1<X extends Function({int})> {
 //                                  ^
 //
+// pkg/front_end/testcases/general/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+// pkg/front_end/testcases/general/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -197,7 +265,7 @@
     : super core::Object::•()
     ;
 }
-class Am2<X extends () →* dynamic = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
     ;
 }
@@ -449,87 +517,87 @@
   synthetic constructor •() → self::Km3<self::Km3::Z*>*
     ;
 }
-class Af1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Af1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
     ;
 }
-class Bf1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
     ;
 }
-class Cf1<X extends () →* core::int* = dynamic> extends core::Object {
+class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
   static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
     ;
 }
-class Df1<X extends () →* dynamic = dynamic> extends core::Object {
+class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
     ;
 }
-class Ef1<X extends () →* dynamic = dynamic> extends core::Object {
+class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
     ;
 }
-class Ff1<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
   static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
     ;
 }
-class Gf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
     ;
 }
-class Hf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
     ;
 }
-class If1<X extends core::Function* = dynamic> extends core::Object {
+class If1<X extends core::Function* = core::Function*> extends core::Object {
   static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
     ;
 }
-class Jf1<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
     ;
 }
-class Kf1<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
     ;
 }
-class Bf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
     ;
 }
-class Cf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
     ;
 }
-class Df2<X extends () →* core::int* = dynamic> extends core::Object {
+class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
   static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
     ;
 }
-class Ef2<X extends () →* dynamic = dynamic> extends core::Object {
+class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
     ;
 }
-class Ff2<X extends () →* dynamic = dynamic> extends core::Object {
+class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
   static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
     ;
 }
-class Gf2<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
   static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
     ;
 }
-class Hf2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
     ;
 }
-class If2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
   static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
     ;
 }
-class Jf2<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
     ;
 }
-class Kf2<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
   static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/closure.dart.outline.expect b/pkg/front_end/testcases/general/closure.dart.outline.expect
index 0f97df6..4f62ce2 100644
--- a/pkg/front_end/testcases/general/closure.dart.outline.expect
+++ b/pkg/front_end/testcases/general/closure.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field dynamic _field;
+  field self::Bar* _field;
   synthetic constructor •() → self::Foo*
     ;
 }
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
index 901ca71..73716f7 100644
--- a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
@@ -18,7 +18,7 @@
   synthetic constructor •() → self::D*
     ;
 }
-class G<T extends self::A* = dynamic> extends core::Object {
+class G<T extends self::A* = self::A*> extends core::Object {
   synthetic constructor •() → self::G<self::G::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
index 7640695..1446703 100644
--- a/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
@@ -20,6 +20,6 @@
   static method m() → core::int*
     ;
 }
-static field dynamic x;
+static field core::int* x;
 static method m(dynamic x) → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
index bedeadd..42a79f3 100644
--- a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
@@ -9,11 +9,11 @@
 // class Dupe {}
 //       ^^^^
 //
-// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
 //                                             ^
 //
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
index 6764ff8..1b8f882 100644
--- a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -299,7 +299,7 @@
 // typedef Typedef = Object Function();
 //         ^^^^^^^
 //
-// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Warning: 'C' isn't a type.
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
 // class Sub extends C {
 //                   ^
 // pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
@@ -332,7 +332,7 @@
     ;
 }
 class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  field dynamic field;
+  field core::String* field;
   constructor •(dynamic a) → self::C#2*
     ;
   method m() → dynamic
@@ -347,7 +347,7 @@
     ;
 }
 class C extends core::Object {
-  field dynamic field;
+  field core::String* field;
   constructor •(dynamic a) → self::C*
     ;
   method m() → dynamic
@@ -439,7 +439,7 @@
   method toString() → core::String*
     return this.{=self::AnotherEnum::_name};
 }
-static field dynamic field;
+static field core::String* field;
 static method main() → dynamic
   ;
 static method foo() → dynamic
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
index 8e9604a..96aece8 100644
--- a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
@@ -14,7 +14,7 @@
 
 class A extends core::Object {
   field core::int* a;
-  constructor •(dynamic a) → self::A*
+  constructor •(core::int* a) → self::A*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
index 4327762..9583c9b 100644
--- a/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Error: Type 'dynamic' not found.
 // /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
 //                           ^^^^^^^
 //
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.outline.expect b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
index 5fcae20..98495a1 100644
--- a/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
@@ -1,32 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/general/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/general/extension_methods.dart:13:13: Warning: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -38,6 +10,10 @@
   get one() → core::int*
     ;
 }
-static field invalid-type E;
+extension E on self::C* {
+  get two = self::E|get#two;
+}
+static method E|get#two(final self::C* #this) → core::int*
+  ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_in_field.dart.outline.expect b/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
index 3470a7a..9f1148b 100644
--- a/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
@@ -1,6 +1,7 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field () →* core::int* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
index 055c6c8..3edc43d 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
@@ -7,9 +7,9 @@
 static field core::String* z;
 static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
   ;
-static method identityObject<T extends core::Object* = dynamic>(self::identityObject::T* t) → self::identityObject::T*
+static method identityObject<T extends core::Object* = core::Object*>(self::identityObject::T* t) → self::identityObject::T*
   ;
-static method identityList<T extends core::List<self::identityList::T>* = dynamic>(self::identityList::T* t) → self::identityList::T*
+static method identityList<T extends core::List<self::identityList::T>* = core::List<dynamic>*>(self::identityList::T* t) → self::identityList::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
index 9bfb098..9d451cd 100644
--- a/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
@@ -10,7 +10,7 @@
 // void Function({obj: Object}) x;
 //                   ^
 //
-// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Warning: Type 'obj' not found.
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Error: Type 'obj' not found.
 // void Function({obj: Object}) x;
 //                ^^^
 //
diff --git a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
index 07147d2..55f17dd 100644
--- a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static const field dynamic constField = 87;
+  static const field core::int* constField = 87;
   const constructor •(dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
-static const field dynamic constTopLevelField = 42;
+static const field core::int* constTopLevelField = 42;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect
new file mode 100644
index 0000000..5494096
--- /dev/null
+++ b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C*
+    ;
+  constructor b() → self::C*
+    ;
+  constructor c() → self::C*
+    ;
+  constructor d() → self::C*
+    ;
+}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.outline.expect b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
index 27f485d..8485710 100644
--- a/pkg/front_end/testcases/general/many_errors.dart.outline.expect
+++ b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
@@ -15,7 +15,7 @@
 //   const A.named2() : x = new Object();
 //                          ^^^
 //
-// pkg/front_end/testcases/general/many_errors.dart:10:24: Warning: 'x' is a final instance variable that has already been initialized.
+// pkg/front_end/testcases/general/many_errors.dart:10:24: Error: 'x' is a final instance variable that has already been initialized.
 //   const A.named2() : x = new Object();
 //                        ^
 // pkg/front_end/testcases/general/many_errors.dart:6:9: Context: 'x' was initialized here.
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
index fd825b0..c8bbb73 100644
--- a/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -12,7 +12,7 @@
 // class A0 = S with M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -22,7 +22,7 @@
 // class A1 = S with M1, M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -32,7 +32,7 @@
 // class A2 = S with M1, M2, M;
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -42,7 +42,7 @@
 // class A0X = S with M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -52,7 +52,7 @@
 // class A1X = S with M1, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -62,7 +62,7 @@
 // class A2X = S with M1, M2, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -72,7 +72,7 @@
 // class B0 extends S with M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -82,7 +82,7 @@
 // class B1 extends S with M1, M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -92,7 +92,7 @@
 // class B2 extends S with M1, M2, M {}
 //       ^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -102,7 +102,7 @@
 // class B0X extends S with M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -112,7 +112,7 @@
 // class B1X extends S with M1, M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/general/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
index 485f78a..5d68397 100644
--- a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A*
     ;
 }
-class C<T extends self::A* = dynamic> extends core::Object {
+class C<T extends self::A* = self::A*> extends core::Object {
   generic-covariant-impl field self::C::T* _field;
   synthetic constructor •() → self::C<self::C::T*>*
     ;
diff --git a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
index d28f088..2da0b47 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
@@ -1,4 +1,27 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:26:9: Error: The return type of the method 'F.y' is 'A', which does not match the return type, 'B', of the overridden method, 'D.y'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a subtype of 'B'.
+//   A get y => null;
+//         ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:16:7: Context: This is the overridden method ('y').
+//   get y => null; // Inferred type: B
+//       ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:25:16: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_after_inference.dart:15:12: Context: This is the overridden method ('x').
+//   void set x(value) {} // Inferred type: A
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
index ba70391..5e1469f 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
@@ -1,4 +1,27 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:21:14: Error: The return type of the method 'E.y' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.y'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object get y => null;
+//              ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:11:9: Context: This is the overridden method ('y').
+//   A get y => null;
+//         ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:20:16: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x(B value) {}
+//                ^
+// pkg/front_end/testcases/general/override_check_accessor_basic.dart:10:12: Context: This is the overridden method ('x').
+//   void set x(A value) {}
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
index a3eaa5e..c042245 100644
--- a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
@@ -1,4 +1,26 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:22:17: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.x4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x4(B value) {} // Not covariant
+//                 ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:13:12: Context: This is the overridden method ('x4').
+//   void set x4(A value) {}
+//            ^
+//
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:23:32: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.x5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void set x5(covariant String value) {}
+//                                ^
+// pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart:14:12: Context: This is the overridden method ('x5').
+//   void set x5(covariant A value) {}
+//            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
index 3f00110..a04839a 100644
--- a/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
@@ -1,4 +1,17 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_after_inference.dart:22:12: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'D.f'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f(B x) {}
+//            ^
+// pkg/front_end/testcases/general/override_check_after_inference.dart:14:8: Context: This is the overridden method ('f').
+//   void f(x) {} // Inferred type: (A) -> void
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
index aa8593d..82a45c2 100644
--- a/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
@@ -1,4 +1,47 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:27:10: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type, 'A', of the overridden method, 'C.f4'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a subtype of 'A'.
+//   Object f4() {}
+//          ^
+// pkg/front_end/testcases/general/override_check_basic.dart:13:5: Context: This is the overridden method ('f4').
+//   A f4() {}
+//     ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:26:14: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f3'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f3({B x}) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:12:8: Context: This is the overridden method ('f3').
+//   void f3({A x}) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:24:13: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f1'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f1(B x) {}
+//             ^
+// pkg/front_end/testcases/general/override_check_basic.dart:10:8: Context: This is the overridden method ('f1').
+//   void f1(A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_basic.dart:25:14: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f2'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f2([B x]) {}
+//              ^
+// pkg/front_end/testcases/general/override_check_basic.dart:11:8: Context: This is the overridden method ('f2').
+//   void f2([A x]) {}
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
index 6865779..193f75c 100644
--- a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends self::Foo<self::Foo::T>* = dynamic> extends core::Object {
+class Foo<T extends self::Foo<self::Foo::T>* = self::Foo<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
 }
 abstract class Bar extends core::Object {
   synthetic constructor •() → self::Bar*
     ;
-  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = dynamic>() → void;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = self::Foo<dynamic>*>() → void;
 }
 class Hest extends core::Object implements self::Bar {
   synthetic constructor •() → self::Hest*
     ;
   @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U>* = dynamic>() → void
+  method fisk<U extends self::Foo<self::Hest::fisk::U>* = self::Foo<dynamic>*>() → void
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
index a65975c..4c08082 100644
--- a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
@@ -1,4 +1,26 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:23:28: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type, 'A', in the overridden method, 'C.f5'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f5(covariant String x) {}
+//                            ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:14:8: Context: This is the overridden method ('f5').
+//   void f5(covariant A x) {}
+//        ^
+//
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:22:13: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type, 'A', in the overridden method, 'C.f4'.
+//  - 'B' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
+//   void f4(B x) {} // Not covariant
+//             ^
+// pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart:13:8: Context: This is the overridden method ('f4').
+//   void f4(A x) {}
+//        ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
index 6cf04c8..65071a6 100644
--- a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart' but its 'part of' declaration says 'foo'.
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart' but its 'part of' declaration says 'foo'.
 // Try changing the 'part of' declaration to use a relative file name.
 // part 'part_not_part_of_same_named_library_lib1.dart';
 //      ^
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
index de523ea..bcd74cd 100644
--- a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart'.
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart'.
 // part 'part_part_of_different_unnamed_library_lib1.dart';
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
index 886001a..4f277c37 100644
--- a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Warning: Using 'pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart' as part of 'foo' but its 'part of' declaration says 'bar'.
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Error: Using 'pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart' as part of 'foo' but its 'part of' declaration says 'bar'.
 // part 'part_part_of_differently_named_library_lib1.dart';
 //      ^
 //
diff --git a/pkg/front_end/testcases/general/qualified.dart.outline.expect b/pkg/front_end/testcases/general/qualified.dart.outline.expect
index 08d37e9..c8750b5 100644
--- a/pkg/front_end/testcases/general/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/general/qualified.dart.outline.expect
@@ -9,18 +9,14 @@
 // class Bad extends lib.Missing {
 //       ^^^
 //
-// pkg/front_end/testcases/general/qualified.dart:11:19: Warning: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/general/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
 // pkg/front_end/testcases/general/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
 // class Bad extends lib.Missing {
 //                   ^^^^^^^^^^^
 //
+// pkg/front_end/testcases/general/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
 // pkg/front_end/testcases/general/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
 // class IllegalSupertype extends lib.VoidFunction {}
 //       ^
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
index c4b1096..ba037f1 100644
--- a/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
@@ -1,4 +1,13 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/general/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
index c5cbd80..b81eb59 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
@@ -3,10 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A*
     ;
-  redirecting_factory first() = self::A::•;
-  redirecting_factory second() = self::A::first;
+  static factory first() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A*
+    let dynamic #redirecting_factory = self::A::first in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
index 8d1d812..636af62 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
@@ -10,8 +10,8 @@
   static factory •(dynamic p) → self::Foo*
     let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
 }
-static const field dynamic forParameter = 1;
-static const field dynamic forFactoryItself = 2;
-static const field dynamic anotherForParameter = 3;
+static const field core::int* forParameter = 1;
+static const field core::int* forFactoryItself = 2;
+static const field core::int* anotherForParameter = 3;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
index f14f820..fc62503 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
@@ -3,9 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
     ;
-  redirecting_factory redir() = self::A::•;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
index e691673..caf6826 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
@@ -3,20 +3,22 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X*
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y*
     ;
 }
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
     ;
-  redirecting_factory redir() = self::B::•<self::Y>;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
 }
-class B<T extends self::X> extends self::A {
-  constructor •() → void
+class B<T extends self::X* = self::X*> extends self::A {
+  constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
index 8e9ac92..4526c6e 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
@@ -2,10 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object, S extends core::Object> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object* = dynamic, S extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
-  redirecting_factory redir<T extends core::Object, S extends core::Object>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object* = dynamic, S extends core::Object* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
index 01df3c7..5c26d8c 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
@@ -3,17 +3,19 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X*
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y*
     ;
 }
-class A<T extends core::Object, S extends self::A::T> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object* = dynamic, S extends self::A::T* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T* t, self::A::S* s) → self::A<self::A::T*, self::A::S*>*
     ;
-  redirecting_factory redir<T extends core::Object, S extends T>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object* = dynamic, S extends self::A::redir::T* = dynamic>(self::A::redir::T* t, self::A::redir::S* s) → self::A<self::A::redir::T*, self::A::redir::S*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
index f130ab6..0974ead 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::X*
     ;
 }
-class Foo<T extends self::X* = dynamic> extends core::Object {
+class Foo<T extends self::X* = self::X*> extends core::Object {
   generic-covariant-impl field self::Foo::T* x;
   constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
     ;
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
index af53cce..2160bc2 100644
--- a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
@@ -1,4 +1,11 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart:8:12: Error: Type variables can't have generic function types in their bounds.
+// class Hest<TypeX extends TypeY Function<TypeY>(TypeY)> {}
+//            ^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/stringliteral.dart.outline.expect b/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
index a46e629..0c2680f 100644
--- a/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
+++ b/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
@@ -1,11 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic color;
-static field dynamic thing;
-static field dynamic phrase;
-static field dynamic adjacent;
-static field dynamic linebreaks;
-static field dynamic other;
+static field core::String* color;
+static field core::String* thing;
+static field core::String* phrase;
+static field core::String* adjacent;
+static field core::String* linebreaks;
+static field core::String* other;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
index 8174b6c..519578a 100644
--- a/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/type_variable_prefix.dart:8:3: Warning: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8:3: Error: 'T.String' can't be used as a type because 'T' doesn't refer to an import prefix.
 //   T.String method() => "Hello, World!";
 //   ^^^^^^^^
 //
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
index 9bdf117..6de5e4c 100644
--- a/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
 //   static C<T> staticMethod() {
 //               ^
 //
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
index 45f6ecf..9a8c9d9 100644
--- a/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
@@ -15,7 +15,7 @@
     ;
 }
 static field core::List<self::A*>* list;
-static method g<T extends self::A* = dynamic>(self::g::T* t) → core::List<self::g::T*>*
+static method g<T extends self::A* = self::A*>(self::g::T* t) → core::List<self::g::T*>*
   ;
 static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>*
   ;
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
index 421073f..6da5c74 100644
--- a/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
@@ -6,7 +6,7 @@
 //   Map<String, var> m;
 //               ^^^
 //
-// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Warning: Type 'var' not found.
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Error: Type 'var' not found.
 //   Map<String, var> m;
 //               ^^^
 //
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect
new file mode 100644
index 0000000..2582eae
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field asy::Future<core::int*>* futureInt;
+static field () →* asy::Future<core::int*>* f;
+static field () →* asy::Future<core::int*>* g;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect
new file mode 100644
index 0000000..0231dd0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field () →* asy::Future<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect
new file mode 100644
index 0000000..d290a5b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static field asy::FutureOr<core::int*>* futureOrInt;
+static field () →* asy::FutureOr<core::int*>* f;
+static field () →* asy::Future<core::int*>* g;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect
new file mode 100644
index 0000000..49da2ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+
+import "dart:async";
+import "dart:math";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect
new file mode 100644
index 0000000..666bc54
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect
new file mode 100644
index 0000000..d08afaa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::String* g;
+static method f() → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect
new file mode 100644
index 0000000..55e2ed1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect
new file mode 100644
index 0000000..55e2ed1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+import "dart:async";
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect
new file mode 100644
index 0000000..672fbfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h;
+static method foo((core::Object*) →* core::int* f) → void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect
new file mode 100644
index 0000000..0a623d0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+import "dart:math";
+
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/bottom.dart.outline.expect b/pkg/front_end/testcases/inference/bottom.dart.outline.expect
new file mode 100644
index 0000000..0387d83
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom.dart.outline.expect
@@ -0,0 +1,6 @@
+library test;
+import self as self;
+
+static field dynamic v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
new file mode 100644
index 0000000..5497bda
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field () →* core::Null* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect
new file mode 100644
index 0000000..97b8e80
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x;
+static field () →* invalid-type y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect
new file mode 100644
index 0000000..947182a0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart:8:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
+//     ^
+//
+import self as self;
+
+static field invalid-type x;
+static field () →* invalid-type y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
index caf7760..a57d812 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
@@ -5,6 +5,6 @@
 static field core::bool* b;
 static field core::int* x;
 static field core::double* y;
-static field dynamic z;
+static field core::num* z;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
new file mode 100644
index 0000000..10031dd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -0,0 +1,51 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::I1*
+    ;
+}
+class I2 extends self::I1 {
+  field core::int* y;
+  synthetic constructor •() → self::I2*
+    ;
+}
+class A extends core::Object {
+  final field self::I1* a;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  final field self::I2* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    ;
+  get a() → invalid-type
+    ;
+}
+class C2 extends core::Object implements self::B, self::A {
+  synthetic constructor •() → self::C2*
+    ;
+  get a() → invalid-type
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
new file mode 100644
index 0000000..f509791
--- /dev/null
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -0,0 +1,52 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   get a => null;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class I1 extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::I1*
+    ;
+}
+class I2 extends core::Object {
+  field core::int* y;
+  synthetic constructor •() → self::I2*
+    ;
+}
+class I3 extends core::Object implements self::I1, self::I2 {
+  field core::int* x;
+  field core::int* y;
+  synthetic constructor •() → self::I3*
+    ;
+}
+class A extends core::Object {
+  final field self::I1* a;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  final field self::I2* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C1 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C1*
+    ;
+  get a() → self::I3*
+    ;
+}
+class C2 extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C2*
+    ;
+  get a() → invalid-type
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect
new file mode 100644
index 0000000..be7aa62
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class Foo<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect
new file mode 100644
index 0000000..704851c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
index a195c85..0a07ab4 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
@@ -7,7 +7,7 @@
   synthetic constructor •() → self::A*
     ;
 }
-class C<T extends self::A* = dynamic> extends core::Object {
+class C<T extends self::A* = self::A*> extends core::Object {
   constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect
new file mode 100644
index 0000000..da1258f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
+    : self::C::t = t, super core::Object::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect
new file mode 100644
index 0000000..cbb70eb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D<T extends core::num* = core::num*> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect
new file mode 100644
index 0000000..1936950
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::C::T*>* list) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect
new file mode 100644
index 0000000..c33e3cc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor _() → self::C<self::C::T*>*
+    ;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect
new file mode 100644
index 0000000..9bb0a3d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A<self::A::T*>* f;
+  constructor •() → self::A<self::A::T*>*
+    ;
+  static factory factory<T extends core::Object* = dynamic>() → self::A<self::A::factory::T*>*
+    ;
+  method m() → self::A<self::A::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect
new file mode 100644
index 0000000..ba86a01
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect
new file mode 100644
index 0000000..28ffdec
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •() → self::C<self::C::T*>*
+    ;
+  static factory named<T extends core::Object* = dynamic>(self::C::named::T* t) → self::C<self::C::named::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect
new file mode 100644
index 0000000..306987f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
+    ;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect
new file mode 100644
index 0000000..b66d0d6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::•];
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
+}
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
index ee4e32e..4d266f4 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     ;
 }
-class Pair<T extends self::Cloneable<self::Pair::T>* = dynamic, U extends self::Cloneable<self::Pair::U>* = dynamic> extends core::Object {
+class Pair<T extends self::Cloneable<self::Pair::T>* = self::Cloneable<dynamic>*, U extends self::Cloneable<self::Pair::U>* = self::Cloneable<dynamic>*> extends core::Object {
   generic-covariant-impl field self::Pair::T* t;
   generic-covariant-impl field self::Pair::U* u;
   constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect
new file mode 100644
index 0000000..f1f5c5d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl field self::Pair::U* u;
+  constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
+    ;
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect
new file mode 100644
index 0000000..38f29cd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect
new file mode 100644
index 0000000..908d36a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.outline.expect
@@ -0,0 +1,30 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of 'int'.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Context: This is the overridden method ('x').
+//   final int x = 2;
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → dynamic
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect
new file mode 100644
index 0000000..13d8894
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic x;
+  static field core::int* y;
+  field dynamic x2;
+  field core::int* y2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static field dynamic x;
+static field core::int* y;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect
new file mode 100644
index 0000000..5df14ed
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field (self::A::T*) →* self::A::T* x;
+  constructor •((self::A::T*) →* self::A::T* x) → self::A<self::A::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
index 14bb442..2aa6d59 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
@@ -10,12 +10,12 @@
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <dynamic>[])
+@self::Foo::•(const <core::String*>[])
 class Bar extends core::Object {
   synthetic constructor •() → self::Bar*
     ;
 }
-@self::Foo::named(const <dynamic>[])
+@self::Foo::named(const <core::String*>[])
 class Baz extends core::Object {
   synthetic constructor •() → self::Baz*
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
index 779bc69..5b2f604 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
@@ -8,12 +8,12 @@
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   field dynamic x;
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   constructor •() → self::Bar*
     ;
-  @self::Foo::•(const <dynamic>[])
+  @self::Foo::•(const <core::String*>[])
   abstract method f() → void;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect
new file mode 100644
index 0000000..c74ce2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect
new file mode 100644
index 0000000..7554b7c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method main() → asy::Future<dynamic>*
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
new file mode 100644
index 0000000..3d473dc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    ;
+}
+static method F<T extends core::Object* = dynamic>() → self::F::T*
+  ;
+static method f() → asy::Future<dynamic>*
+  ;
+static method main() → asy::Future<dynamic>*
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect
new file mode 100644
index 0000000..e0a7edc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = ([S*]) →* T*;
+class Foo extends core::Object {
+  field core::List<core::int*>* x;
+  constructor •([core::List<core::int*>* x]) → self::Foo*
+    ;
+  constructor named([core::List<core::int*>* x]) → self::Foo*
+    ;
+}
+static field ([core::List<core::int*>*]) →* core::String* g;
+static method f([core::List<core::int*>* l]) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect
new file mode 100644
index 0000000..6794a5c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field self::B<core::int*>* b;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
+    ;
+}
+static field self::A* t1;
+static field core::List<self::B<core::int*>*>* t2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
index e341531..9d0ad6f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -6,6 +6,6 @@
   constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
-static field dynamic t1;
+static field core::List<self::A<core::int*>*>* t1;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..3ec491b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F0 extends core::Object {
+  constructor •(core::List<core::int*>* a) → self::F0*
+    ;
+}
+class F1 extends core::Object {
+  constructor •({core::List<core::int*>* a}) → self::F1*
+    ;
+}
+class F2 extends core::Object {
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
+    ;
+}
+class F3 extends core::Object {
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
+    ;
+}
+class F4 extends core::Object {
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a}) → self::F4*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..2037825
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f0(core::List<core::int*>* a) → void
+  ;
+static method f1({core::List<core::int*>* a}) → void
+  ;
+static method f2(core::Iterable<core::int*>* a) → void
+  ;
+static method f3(core::Iterable<core::Iterable<core::int*>*>* a) → void
+  ;
+static method f4({core::Iterable<core::Iterable<core::int*>*>* a}) → void
+  ;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect
new file mode 100644
index 0000000..3539aa7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect
new file mode 100644
index 0000000..27b374a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect
new file mode 100644
index 0000000..ba76888
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    ;
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a}) → self::F4<self::F4::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..c651d5f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.outline.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class F0<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::F0::T*>* a) → self::F0<self::F0::T*>*
+    ;
+}
+class F1<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::List<self::F1::T*>* a}) → self::F1<self::F1::T*>*
+    ;
+}
+class F2<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<self::F2::T*>* a) → self::F2<self::F2::T*>*
+    ;
+}
+class F3<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::Iterable<core::Iterable<self::F3::T*>*>* a) → self::F3<self::F3::T*>*
+    ;
+}
+class F4<T extends core::Object* = dynamic> extends core::Object {
+  constructor •({core::Iterable<core::Iterable<self::F4::T*>*>* a}) → self::F4<self::F4::T*>*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect
new file mode 100644
index 0000000..c74ce2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..2bf3613
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.outline.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl field self::A::T* y;
+  constructor •(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    ;
+  constructor named(self::A::S* x, self::A::T* y) → self::A<self::A::S*, self::A::T*>*
+    ;
+}
+class B<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::B::T*, self::B::S*> {
+  constructor •(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    ;
+  constructor named(self::B::S* y, self::B::T* x) → self::B<self::B::S*, self::B::T*>*
+    ;
+}
+class C<S extends core::Object* = dynamic> extends self::B<self::C::S*, self::C::S*> {
+  constructor •(self::C::S* a) → self::C<self::C::S*>*
+    ;
+  constructor named(self::C::S* a) → self::C<self::C::S*>*
+    ;
+}
+class D<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::B<self::D::T*, core::int*> {
+  constructor •(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    ;
+  constructor named(self::D::T* a) → self::D<self::D::S*, self::D::T*>*
+    ;
+}
+class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::C<self::E::S*>*, self::E::T*> {
+  constructor •(self::E::T* a) → self::E<self::E::S*, self::E::T*>*
+    ;
+}
+class F<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::A<self::F::S*, self::F::T*> {
+  constructor •(self::F::S* x, self::F::T* y, {core::List<self::F::S*>* a, core::List<self::F::T*>* b}) → self::F<self::F::S*, self::F::T*>*
+    ;
+  constructor named(self::F::S* x, self::F::T* y, [self::F::S* a, self::F::T* b]) → self::F<self::F::S*, self::F::T*>*
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect
new file mode 100644
index 0000000..a92d585
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::List<core::String*>* list1, core::List<core::String*>* list2]) → void
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect
new file mode 100644
index 0000000..57c5b68
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.outline.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
+class DartType extends core::Object {
+  synthetic constructor •() → self::DartType*
+    ;
+}
+abstract class C extends core::Object {
+  static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  synthetic constructor •() → self::C*
+    ;
+  static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+    ;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic
+    ;
+}
+abstract class G<T extends core::Object* = dynamic> extends core::Object {
+  field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  synthetic constructor •() → self::G<self::G::T*>*
+    ;
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic
+    ;
+}
+static field (self::DartType*) →* void _isInt;
+static field (self::DartType*) →* void _isString;
+static field (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertBOf;
+static get assertCOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect
new file mode 100644
index 0000000..2456a4a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo([core::Map<core::int*, core::String*>* m1, core::Map<core::int*, core::String*>* m2]) → void
+  ;
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
new file mode 100644
index 0000000..e1e83f3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+abstract class MyStream<T extends core::Object* = dynamic> extends asy::Stream<self::MyStream::T*> {
+  static factory •<T extends core::Object* = dynamic>() → self::MyStream<self::MyStream::•::T*>*
+    ;
+}
+static method foo() → asy::Stream<core::List<core::int*>*>*
+  ;
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect
new file mode 100644
index 0000000..0ac31d4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::C*
+    ;
+  static get _x() → core::int*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect
new file mode 100644
index 0000000..2df00b8e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::C*
+    ;
+}
+static get y() → core::int*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect
new file mode 100644
index 0000000..c763edf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method add(core::int* x) → void
+  ;
+static method add2(core::int* y) → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect
new file mode 100644
index 0000000..c410a31
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef ToValue<T extends core::Object* = dynamic> = (T*) →* void;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect
new file mode 100644
index 0000000..9f34989
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<S extends core::Object* = dynamic, T extends core::Object* = dynamic>(self::f::S* s) → self::f::T*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
index 464dcd7..1a8b966 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern* = dynamic> extends core::Object {
+class Foo<T extends core::Pattern* = core::Pattern*> extends core::Object {
   synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
-  method method<generic-covariant-impl U extends self::Foo::T* = dynamic>(self::Foo::method::U* u) → self::Foo::method::U*
+  method method<generic-covariant-impl U extends self::Foo::T* = self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect
new file mode 100644
index 0000000..47b4040
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math";
+
+static method printInt(core::int* x) → void
+  ;
+static method printDouble(core::double* x) → void
+  ;
+static method myMax(core::num* x, core::num* y) → core::num*
+  ;
+static method f() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect
new file mode 100644
index 0000000..07bf679
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:13:3: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type, 'T', of the overridden method, 'C.m'.
+// Change to a subtype of 'T'.
+//   m(x) => x;
+//   ^
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
+//   T m<T>(T x) => x;
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m(dynamic x) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect
new file mode 100644
index 0000000..649bb11
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object* = dynamic>(core::List<self::f::T*>* s) → self::f::T*
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect
new file mode 100644
index 0000000..b3ae44d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test() → void
+  ;
+static method functionExpressionInvocation() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect
new file mode 100644
index 0000000..9bbf070
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.outline.expect
@@ -0,0 +1,55 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:5: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T m<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:12: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type, 'dynamic', in the overridden method, 'C.m'.
+// Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
+//   T m<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:3: Context: This is the overridden method ('m').
+//   m(x) => x;
+//   ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:5: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T g<T>(T x) => x;
+//     ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:12: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type, 'int', in the overridden method, 'C.g'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
+//   T g<T>(T x) => x;
+//            ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m(dynamic x) → dynamic
+    ;
+  method g(core::int* x) → dynamic
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m<T extends core::Object* = dynamic>(self::D::m::T* x) → self::D::m::T*
+    ;
+  method g<T extends core::Object* = dynamic>(self::D::g::T* x) → self::D::g::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect
new file mode 100644
index 0000000..465372c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<V extends core::Object* = dynamic> = (V*) →* void;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::f::U*) →* void
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect
new file mode 100644
index 0000000..cd56022
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef G<V extends core::Object* = dynamic> = () →* core::List<V*>*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(() →* core::List<self::C::f::U*>* g) → void
+    ;
+}
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  abstract method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect
new file mode 100644
index 0000000..0a73a00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<V extends core::Object* = dynamic> = () →* V*;
+class C<T extends core::Object* = dynamic> extends self::D<self::C::T*> {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → () →* self::C::f::U*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect
new file mode 100644
index 0000000..e19be4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.outline.expect
@@ -0,0 +1,45 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+import "dart:math";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
+    ;
+}
+static method test() → dynamic
+  ;
+static method takeIII((core::int*, core::int*) →* core::int* fn) → void
+  ;
+static method takeDDD((core::double*, core::double*) →* core::double* fn) → void
+  ;
+static method takeIDI((core::double*, core::int*) →* core::int* fn) → void
+  ;
+static method takeDID((core::int*, core::double*) →* core::double* fn) → void
+  ;
+static method takeIDN((core::double*, core::int*) →* core::num* fn) → void
+  ;
+static method takeDIN((core::int*, core::double*) →* core::num* fn) → void
+  ;
+static method takeIIN((core::int*, core::int*) →* core::num* fn) → void
+  ;
+static method takeDDN((core::double*, core::double*) →* core::num* fn) → void
+  ;
+static method takeNNN((core::num*, core::num*) →* core::num* fn) → void
+  ;
+static method takeOON((core::Object*, core::Object*) →* core::num* fn) → void
+  ;
+static method takeOOO((core::Object*, core::Object*) →* core::num* fn) → void
+  ;
+static method takeOOI((core::Object*, core::Object*) →* core::int* fn) → void
+  ;
+static method takeIIO((core::int*, core::int*) →* core::Object* fn) → void
+  ;
+static method takeDDO((core::double*, core::double*) →* core::Object* fn) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect
new file mode 100644
index 0000000..45f2f2b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method m<S extends core::Object* = dynamic>(self::D::m::S* x) → self::D::m::S*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect
new file mode 100644
index 0000000..824697a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method f() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect
new file mode 100644
index 0000000..abf425d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method make(core::int* x) → asy::Future<core::int*>*
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect
new file mode 100644
index 0000000..41b11c5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math" as math;
+
+class Trace extends core::Object {
+  field core::List<self::Frame*>* frames;
+  synthetic constructor •() → self::Trace*
+    ;
+}
+class Frame extends core::Object {
+  field core::String* location;
+  synthetic constructor •() → self::Frame*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect
new file mode 100644
index 0000000..2afc98d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::Iterable<core::num*>*;
+typedef G = (core::double*) →* core::List<core::int*>*;
+static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
index 4046a6c..1374798 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
@@ -5,13 +5,13 @@
 class A extends core::Object implements self::B {
   synthetic constructor •() → self::A*
     ;
-  get x() → dynamic
+  get x() → core::int*
     ;
-  set x(dynamic value) → void
+  set x(core::int* value) → void
     ;
 }
 class B extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect
new file mode 100644
index 0000000..7971d4a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* f;
+  synthetic constructor •() → self::A*
+    ;
+}
+static field self::A* a;
+static field core::int* c;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect
new file mode 100644
index 0000000..f9000f4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.outline.expect
@@ -0,0 +1,16 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  operator +(dynamic other) → core::int*
+    ;
+  operator -(dynamic other) → core::double*
+    ;
+}
+static field core::int* v_add;
+static field core::double* v_minus;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect
new file mode 100644
index 0000000..fc1ae00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::double* a_add;
+static field core::double* a_subtract;
+static field core::double* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::double* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect
new file mode 100644
index 0000000..cc7c479
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_equal;
+static field core::bool* a_notEqual;
+static field core::int* a_bitXor;
+static field core::int* a_bitAnd;
+static field core::int* a_bitOr;
+static field core::int* a_bitShiftRight;
+static field core::int* a_bitShiftLeft;
+static field core::int* a_add;
+static field core::int* a_subtract;
+static field core::int* a_multiply;
+static field core::double* a_divide;
+static field core::int* a_floorDivide;
+static field core::bool* a_greater;
+static field core::bool* a_less;
+static field core::bool* a_greaterEqual;
+static field core::bool* a_lessEqual;
+static field core::int* a_modulo;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect
new file mode 100644
index 0000000..6ea6d78
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::num* a;
+static field core::num* b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
new file mode 100644
index 0000000..d58d84f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.outline.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_consts_transitively_2_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = inf::a1;
+static const field core::int* m2 = inf::a2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_consts_transitively_2.dart" as self;
+import "infer_consts_transitively_2_b.dart" as inf2;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = self::m2;
+static const field core::int* a2 = inf2::b1;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf2;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
new file mode 100644
index 0000000..cb88599
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_consts_transitively_2.dart" as test;
+import "infer_consts_transitively_2_b.dart" as inf;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
+import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
+
+static const field core::int* a1 = test::m2;
+static const field core::int* a2 = inf::b1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_consts_transitively_2_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
+
+static const field core::int* m1 = self::a1;
+static const field core::int* m2 = self::a2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect
new file mode 100644
index 0000000..afdd6d7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect
new file mode 100644
index 0000000..afdd6d7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* b1 = 2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect
new file mode 100644
index 0000000..dfad962
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.outline.expect
@@ -0,0 +1,23 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x;
+  field core::int* y;
+  field core::String* z;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  field dynamic x;
+  field core::int* y;
+  field core::String* z;
+  field core::int* w;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
index 218f5e9..4f999da 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
index b917227..915eb44 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
@@ -11,7 +11,7 @@
 }
 class B extends self::A {
   final field core::int* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::int* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
index 167fce8..b79c1b0 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
@@ -9,7 +9,7 @@
 }
 class B extends self::A {
   final field core::int* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::int* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
index afb8687..9e5258a 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
@@ -10,7 +10,7 @@
 }
 class B extends self::A {
   final field core::double* x;
-  constructor •(dynamic x) → self::B*
+  constructor •(core::double* x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect
new file mode 100644
index 0000000..1a5ccea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.outline.expect
@@ -0,0 +1,41 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:46: Error: Getter not found: 'x'.
+// var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                              ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
+//   /*error:UNDEFINED_IDENTIFIER*/ x
+//                                  ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+  operator +(dynamic other) → self::B*
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic ignore) → self::B*
+    ;
+}
+static field self::A* a;
+static field self::B* b;
+static field core::List<dynamic>* c1;
+static field core::List<dynamic>* c2;
+static field core::Map<dynamic, dynamic>* d;
+static field self::A* e;
+static field core::int* f;
+static field core::int* g;
+static field self::B* h;
+static field dynamic i;
+static field self::B* j;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect
new file mode 100644
index 0000000..c17611a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  field dynamic x;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect
new file mode 100644
index 0000000..8b9dd44
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field dynamic x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  final field dynamic x;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect
new file mode 100644
index 0000000..6a7760a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.outline.expect
@@ -0,0 +1,51 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
+
+static field core::int* y;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self3;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self3::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self4;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self4::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect
new file mode 100644
index 0000000..e70d202
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.outline.expect
@@ -0,0 +1,29 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect
new file mode 100644
index 0000000..6cdbef6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.outline.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect
new file mode 100644
index 0000000..7a1dac1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.outline.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+static field core::int* x;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self3::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect
new file mode 100644
index 0000000..a618e67
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
+
+static field core::int* y;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static field core::int* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect
new file mode 100644
index 0000000..07b69ed
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.outline.expect
@@ -0,0 +1,27 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag2_a.dart";
+
+class B extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self::B*
+    ;
+}
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect
new file mode 100644
index 0000000..9aa0236
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect
new file mode 100644
index 0000000..59f6600
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect
new file mode 100644
index 0000000..dc27164
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, {core::String* b, self::C::m::T* c}) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect
new file mode 100644
index 0000000..fab9845
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b]) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect
new file mode 100644
index 0000000..da0aacf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(core::int* a, [core::String* b, self::C::m::T* c]) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect
new file mode 100644
index 0000000..2798d5a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect
new file mode 100644
index 0000000..1421f70
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.outline.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Resource extends core::Object {
+  synthetic constructor •() → self::Resource*
+    ;
+}
+class Folder extends self::Resource {
+  synthetic constructor •() → self::Folder*
+    ;
+}
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::Foo::T* t) → self::Foo<self::Foo::T*>*
+    ;
+}
+static method getResource(core::String* str) → self::Resource*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect
new file mode 100644
index 0000000..f87eb4f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+class D extends core::Object {
+  field core::int* foo;
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect
new file mode 100644
index 0000000..8d523c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends self::D {
+  synthetic constructor •() → self::C*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+  set foo(core::int* x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect
new file mode 100644
index 0000000..5594f99
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* a_not;
+static field core::int* a_complement;
+static field core::int* a_negate;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect
new file mode 100644
index 0000000..264d18b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A*
+    ;
+  operator ~() → core::int*
+    ;
+  operator unary-() → core::double*
+    ;
+}
+static field self::A* a;
+static field core::int* v_complement;
+static field core::double* v_negate;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect
new file mode 100644
index 0000000..628cf39
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method strings() → core::List<core::String*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect
new file mode 100644
index 0000000..531005e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self2::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect
new file mode 100644
index 0000000..376e563
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int* x1 = 1;
+static final field core::int* x2;
+static final field core::int* y1;
+static final field core::int* y2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
new file mode 100644
index 0000000..992d62b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.outline.expect
@@ -0,0 +1,32 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_statics_transitively3_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
+import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
+
+static const field core::int* t1 = 1;
+static const field core::int* t2 = self::t1;
+static const field core::int* t3 = inf::a1;
+static const field core::int* t4 = inf::a2;
+static const field dynamic t5 = inf::A::a3;
+static const field dynamic t6 = inf::A::a3;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = null;
+  synthetic constructor •() → inf::A*
+    ;
+}
+static const field core::int* a1 = 3;
+static const field core::int* a2 = 4;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect
new file mode 100644
index 0000000..7eda95a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.outline.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static const field dynamic a3 = null;
+  synthetic constructor •() → self::A*
+    ;
+}
+static const field core::int* a1 = 3;
+static const field core::int* a2 = 4;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect
new file mode 100644
index 0000000..b62ec89
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.outline.expect
@@ -0,0 +1,52 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
+
+library;
+import self as self4;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self4::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect
new file mode 100644
index 0000000..54f49cb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively.dart";
+import "org-dartlang-testcase:///infer_statics_transitively_b.dart";
+
+class A extends core::Object {
+  static final field core::int* a2;
+  synthetic constructor •() → self::A*
+    ;
+}
+static final field core::int* a1;
+static method main() → dynamic
+  ;
+
+library test;
+import self as self2;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_transitively_a.dart";
+
+static final field core::int* m1;
+static final field core::int* m2;
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect
new file mode 100644
index 0000000..1634bbb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static final field core::int* b1;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect
new file mode 100644
index 0000000..82eac85
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.outline.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_statics_with_method_invocations_a.dart";
+
+class T extends core::Object {
+  static final field self::T* foo;
+  synthetic constructor •() → self::T*
+    ;
+  static method m1(core::String* m) → self::T*
+    ;
+  static method m2(dynamic e) → core::String*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1, dynamic a2]) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect
new file mode 100644
index 0000000..92e6635
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method m3(core::String* a, core::String* b, [dynamic a1, dynamic a2]) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect b/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect
new file mode 100644
index 0000000..a26c77f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_throw.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::bool* t;
+static field dynamic a;
+static field core::int* b;
+static field core::int* c;
+static field core::int* d;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect
new file mode 100644
index 0000000..fdad487
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect
new file mode 100644
index 0000000..740163e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect
new file mode 100644
index 0000000..59396ab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect
new file mode 100644
index 0000000..556acab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  field core::int* y;
+  final field core::int* z;
+  synthetic constructor •() → self::A*
+    ;
+  method test1() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect
new file mode 100644
index 0000000..818f5f5e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::int* x;
+static field core::int* y;
+static final field core::int* z;
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect
new file mode 100644
index 0000000..6e632b8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.outline.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as inf;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends inf::B {
+  synthetic constructor •() → self::C*
+    ;
+  get x() → core::int*
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as self;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends self::A {
+  synthetic constructor •() → inf::B*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect
new file mode 100644
index 0000000..3dc6858
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "infer_type_regardless_of_declaration_order_or_cycles.dart" as test;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
+
+class B extends test::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "infer_type_regardless_of_declaration_order_or_cycles_b.dart" as self;
+import "dart:core" as core;
+
+import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
+
+class C extends self::B {
+  synthetic constructor •() → test::C*
+    ;
+  get x() → core::int*
+    ;
+}
+class A extends core::Object {
+  synthetic constructor •() → test::A*
+    ;
+  get x() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect
new file mode 100644
index 0000000..de41e4b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* a;
+static field core::Map<core::double*, core::int*>* b;
+static field core::Map<core::List<core::int*>*, core::Map<core::String*, core::double*>*>* c;
+static field core::Map<core::int*, dynamic>* d;
+static field core::Map<dynamic, core::int*>* e;
+static field core::Map<dynamic, dynamic>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect
new file mode 100644
index 0000000..fd0db16
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.outline.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x;
+  final field self::A::T* w;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → core::int*
+    ;
+  get w() → core::int*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect
new file mode 100644
index 0000000..42d4b2e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.outline.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y;
+  synthetic constructor •() → self::B<self::B::E*>*
+    ;
+  get x() → self::B::E*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect
new file mode 100644
index 0000000..f7f66a7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.outline.expect
@@ -0,0 +1,33 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
+}
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+  abstract method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → self::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect
new file mode 100644
index 0000000..d10152a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.outline.expect
@@ -0,0 +1,46 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
+    : super core::Object::•()
+    ;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → self::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
+    : super self::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as inf;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → inf::I<inf::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect
new file mode 100644
index 0000000..4b3a052
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle.dart" as test;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";
+
+abstract class I<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::E*>*
+    ;
+  abstract method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
+}
+static method main() → dynamic
+  ;
+
+library test;
+import self as test;
+import "dart:core" as core;
+import "infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;
+
+import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";
+
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
+    : super core::Object::•()
+    ;
+}
+abstract class M extends core::Object {
+  final field core::int* y;
+  synthetic constructor •() → test::M*
+    ;
+}
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
+    : super test::A::•()
+    ;
+  get y() → core::int*
+    ;
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>*
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect
new file mode 100644
index 0000000..6186c9d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.outline.expect
@@ -0,0 +1,30 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type, 'int', of the overridden method, 'A.x'.
+// Change to a subtype of 'int'.
+//   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
+//                                                 ^
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Context: This is the overridden method ('x').
+//   final T x = null;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  final field self::A::T* x;
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
+    ;
+  get x() → dynamic
+    ;
+}
+static method foo() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect
new file mode 100644
index 0000000..2ecbacc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.outline.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* bar;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
+    ;
+  method foo(generic-covariant-impl self::Bar::T* t) → void
+    ;
+}
+class Baz<T extends core::Object* = dynamic, E extends core::Iterable<self::Baz::T*>* = core::Iterable<dynamic>*, S extends self::Baz::E* = core::Iterable<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
+    ;
+  method foo(generic-covariant-impl self::Baz::S* t) → void
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index 15b2a4d..43bc546 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -10,13 +10,13 @@
   synthetic constructor •() → self::Foo*
     ;
 }
-class Bar<T extends asy::Stream<core::String*>* = dynamic> extends core::Object {
+class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
   synthetic constructor •() → self::Bar<self::Bar::T*>*
     ;
   method foo(generic-covariant-impl self::Bar::T* t) → dynamic
     ;
 }
-class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = asy::Stream<dynamic>*, S extends self::Baz::E* = asy::Stream<dynamic>*> extends core::Object {
   synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     ;
   method foo(generic-covariant-impl self::Baz::S* t) → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect
new file mode 100644
index 0000000..8e85697
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect b/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect
new file mode 100644
index 0000000..3c20c2d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_variable_void.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+
+static field void x;
+static method f() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect
new file mode 100644
index 0000000..e484bfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* x;
+  constructor •([core::int* x]) → self::Foo*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect
new file mode 100644
index 0000000..10e00b4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::String* x;
+  field core::Map<core::String*, core::Map<core::String*, core::String*>*>* y;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect
new file mode 100644
index 0000000..546284f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::String* y;
+  synthetic constructor •() → self::C*
+    ;
+}
+static field core::String* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect
new file mode 100644
index 0000000..558a097
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a;
+  field core::List<core::int*>* b;
+  synthetic constructor •() → self::A*
+    ;
+  method m() → void
+    ;
+}
+static field self::A* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect
new file mode 100644
index 0000000..023351f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator *(self::C* other) → core::bool*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..e63cff7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator *(self::C* other) → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect
new file mode 100644
index 0000000..0bc720e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator [](core::int* index) → core::bool*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..071abaa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator [](core::int* index) → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static method f() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect
new file mode 100644
index 0000000..4c4ec52
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator unary-() → core::bool*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect
new file mode 100644
index 0000000..01d1040
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  operator unary-() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field self::C* c;
+static field core::bool* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect
new file mode 100644
index 0000000..7f7e2d3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method g() → core::bool*
+    ;
+}
+static field () →* core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect
new file mode 100644
index 0000000..dd6d6c5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  method g() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field () →* core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect
new file mode 100644
index 0000000..093165a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field (core::Object*) →* void v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect
new file mode 100644
index 0000000..64a0c83
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method g() → core::bool*
+    ;
+}
+static field core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect
new file mode 100644
index 0000000..1dc5beb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.outline.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  method g() → core::bool*
+    ;
+}
+abstract class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field core::bool* x;
+static method f() → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
new file mode 100644
index 0000000..f34fca1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];
+  static const field self::E* v1 = const self::E::•(0, "E.v1");
+  const constructor •(core::int* index, core::String* _name) → self::E*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static final field self::E* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
new file mode 100644
index 0000000..c337f19
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];
+  static const field self::E* v1 = const self::E::•(0, "E.v1");
+  const constructor •(core::int* index, core::String* _name) → self::E*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static final field core::List<self::E*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect
new file mode 100644
index 0000000..8c72258
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Map<core::String*, () →* void>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect
new file mode 100644
index 0000000..41a8e7b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+static final field core::Map<core::String*, () →* core::int*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect
new file mode 100644
index 0000000..022fc54
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<() →* core::Object*>* v;
+static method f() → core::int*
+  ;
+static method g() → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect
new file mode 100644
index 0000000..19ea551
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<((core::String*) →* core::int*) →* core::Object*>* v;
+static method f((core::String*) →* core::int* x) → core::int*
+  ;
+static method g((core::String*) →* core::int* x) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect
new file mode 100644
index 0000000..13063fa5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<({x: core::int*}) →* core::Object*>* v;
+static method f({core::int* x}) → core::int*
+  ;
+static method g({core::int* x}) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect
new file mode 100644
index 0000000..bd37456
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<([core::int*]) →* core::Object*>* v;
+static method f([core::int* x]) → core::int*
+  ;
+static method g([core::int* x]) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect
new file mode 100644
index 0000000..4de588f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<(core::int*) →* core::Object*>* v;
+static method f(core::int* x) → core::int*
+  ;
+static method g(core::int* x) → core::String*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect
new file mode 100644
index 0000000..4673ba3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* (core::int*) →* core::Map<core::int*, core::bool*>* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect
new file mode 100644
index 0000000..a4ec082
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::bool* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect
new file mode 100644
index 0000000..40aeb8e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static final field (core::bool*) →* core::int* f;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect
new file mode 100644
index 0000000..d303dfc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static final field (core::bool*) →* core::int* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
index 3a1211f..d0bd559 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  final field dynamic x;
+  final field core::int* x;
   synthetic constructor •() → self::I1*
     ;
 }
@@ -18,6 +18,6 @@
   get x() → core::int*
     ;
 }
-static field dynamic y;
+static field core::int* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect
new file mode 100644
index 0000000..6aa475b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::B<self::A<core::int*>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect
new file mode 100644
index 0000000..90698fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A<core::int*>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect
new file mode 100644
index 0000000..0a2734e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A<dynamic>*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect
new file mode 100644
index 0000000..34b5179
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::A<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect
new file mode 100644
index 0000000..34b5179
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+static field self::A<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect
new file mode 100644
index 0000000..fc54b7b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect
new file mode 100644
index 0000000..2d88b5d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static field self::C<core::int*>* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect
new file mode 100644
index 0000000..8f0c87e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+static field self::B<self::A*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect
new file mode 100644
index 0000000..a021f96
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method getListOfString() → core::List<core::String*>*
+  ;
+static method foo() → void
+  ;
+static method bar() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
index ecd13b6..683fac8 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.outline.expect
@@ -1,9 +1,10 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
+static field core::List<core::int*>* a;
+static field core::List<core::double*>* b;
+static field core::List<core::List<core::int*>*>* c;
+static field core::List<dynamic>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals.dart.outline.expect
new file mode 100644
index 0000000..893540e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect
new file mode 100644
index 0000000..24cab9d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* x1;
+static field core::List<core::num*>* x2;
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals.dart.outline.expect
new file mode 100644
index 0000000..893540e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect
new file mode 100644
index 0000000..f63db32
--- /dev/null
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::Map<core::int*, core::String*>* x1;
+static field core::Map<core::num*, core::Pattern*>* x2;
+static method test1() → dynamic
+  ;
+static method test2() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect
new file mode 100644
index 0000000..9bfb5d5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect
new file mode 100644
index 0000000..26e19b2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.outline.expect
@@ -0,0 +1,18 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::C* c;
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect
new file mode 100644
index 0000000..ee571a5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.outline.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect
new file mode 100644
index 0000000..5edbaf7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
+    ;
+}
+static field self::D<core::int*>* g;
+static method f<T extends core::Object* = dynamic>() → self::D<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
index a7ce02f..07c3f61 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object* = dynamic, Y extends core::String* = dynamic> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::String* = core::String*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
index 6af70be..f952fac 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
@@ -1,4 +1,16 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class A extends M1 with M0 {}
+//       ^
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
+// class M0<X, Y extends Comparable<Y>> extends I<X> {}
+//             ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -6,7 +18,7 @@
   synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = dynamic> extends self::I<self::M0::X*> {
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = core::Comparable<dynamic>*> extends self::I<self::M0::X*> {
   synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect
new file mode 100644
index 0000000..3619892
--- /dev/null
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+
+static method test1() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect
new file mode 100644
index 0000000..672fbfb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic h;
+static method foo((core::Object*) →* core::int* f) → void
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
index 583e980..3c44d0c 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A<X extends core::Object* = dynamic> extends core::Object {
-  final field dynamic foo;
+  final field core::String* foo;
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
 class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
-  final field dynamic foo;
-  constructor •(dynamic foo) → self::B<self::B::Y*>*
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::B<self::B::Y*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
index 2efb122..6bd3591 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B* = dynamic>(self::f::T* a) → void
+static method f<T extends self::B* = self::B*>(self::f::T* a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect
new file mode 100644
index 0000000..24a81b6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect
new file mode 100644
index 0000000..24a81b6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect
new file mode 100644
index 0000000..630505e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method test5() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect
new file mode 100644
index 0000000..b31847d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.outline.expect
@@ -0,0 +1,26 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  field self::A* a;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  field self::B* b;
+  synthetic constructor •() → self::C*
+    ;
+}
+class D extends core::Object {
+  field self::C* c;
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
index 1ec74b1..b1da205 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
@@ -12,7 +12,7 @@
     ;
 }
 static field self::C* c;
-static field dynamic function_ref;
-static field dynamic function_ref_list;
+static field () →* core::int* function_ref;
+static field core::List<() →* core::int*>* function_ref_list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect
new file mode 100644
index 0000000..a1ba81e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* void;
+static final field core::Type* x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect
new file mode 100644
index 0000000..4b7a850
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(core::double* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect
new file mode 100644
index 0000000..c8572b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(core::int* b) → void
+    ;
+  method opEq(core::int* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect
new file mode 100644
index 0000000..5050ee5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.outline.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method op(generic-covariant-impl self::C::T* b) → void
+    ;
+  method opEq(generic-covariant-impl self::C::T* b) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
index 7e1ab76..7cc78f5 100644
--- a/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::bool* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
index 7e1ab76..ce3f6d5 100644
--- a/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::double* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
index 7e1ab76..0596698 100644
--- a/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field core::int* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
new file mode 100644
index 0000000..74e9791
--- /dev/null
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method f(core::String* s) → core::int*
+    ;
+}
+static const field (core::String*) →* core::int* v = self::C::f;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.outline.expect b/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
index b10c845..506fd95 100644
--- a/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/string_literal.dart.outline.expect
@@ -1,9 +1,10 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
+static field core::int* x;
+static field core::String* a;
+static field core::String* b;
+static field core::String* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
index b8b9db0..2148ea4 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic x;
+  field core::int* x;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
index 4752269..50d69f8 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field dynamic f;
+  field () →* core::int* f;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
index ec6089a..93be11a 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
@@ -9,7 +9,7 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f;
+  field self::CallableClass* f;
   synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
index 3b44c95..e393ff8 100644
--- a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic i;
+static field core::int* i;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
index 0cf1b92..32f2f1d 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
@@ -13,6 +13,6 @@
     ;
 }
 static field self::A<core::num*>* a;
-static field dynamic b;
+static field self::B<core::int*>* b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..bd31fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static field self::C<dynamic>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..19474ef
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static field self::C<core::int*>* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..be2806f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..db56dbb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •(() →* dynamic x) → self::C*
+    ;
+}
+static field self::C* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..10eb51f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<dynamic>* v;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
new file mode 100644
index 0000000..10eb51f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<dynamic>* v;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..f0dd2fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
new file mode 100644
index 0000000..f0dd2fa
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -0,0 +1,9 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int*>* v;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..c7133df
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect
new file mode 100644
index 0000000..c7133df
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..8c0f7c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f(dynamic x) → core::double*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect
new file mode 100644
index 0000000..8c0f7c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.outline.expect
@@ -0,0 +1,8 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic
+  ;
+static method f(dynamic x) → core::double*
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect
new file mode 100644
index 0000000..87c776d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect
new file mode 100644
index 0000000..87c776d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.outline.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F = () →* core::int*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect
new file mode 100644
index 0000000..09dc88c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.outline.expect
@@ -0,0 +1,5 @@
+library test;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect
new file mode 100644
index 0000000..a207fbd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.outline.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect
new file mode 100644
index 0000000..2579e0a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.outline.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f(dynamic x) → core::double*
+    ;
+}
+static field core::double* v;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect
new file mode 100644
index 0000000..24086b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -0,0 +1,11 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static field dynamic x;
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T*
+  ;
+static method printRunning() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
index a833221..7ba11cd 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
@@ -1,4 +1,12 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart:18:5: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+// var b = /*@ returnType=() ->* invalid-type */ () =>
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -10,10 +18,10 @@
   method g(dynamic i) → core::int*
     ;
 }
-static field dynamic a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
-static field dynamic e;
+static field self::A* a;
+static field invalid-type b;
+static field () →* invalid-type c;
+static field () →* () →* core::int* d;
+static field () →* core::int* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
index 078aa97..c44763e 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
@@ -1,15 +1,23 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
+// Specify the type explicitly.
+// var a = /*@ returnType=num* */ () => intValue /*@target=num::+*/ + b;
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
 static field core::int* intValue;
 static field core::num* numValue;
 static field core::double* doubleValue;
-static field dynamic a;
+static field invalid-type a;
 static field dynamic b;
-static field dynamic c;
-static field dynamic d;
-static field dynamic e;
-static field dynamic f;
+static field () →* core::num* c;
+static field core::num* d;
+static field () →* core::double* e;
+static field core::double* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
index 7322015..f42e8b5 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
@@ -11,6 +11,6 @@
   constructor •(self::B::T* x) → self::B<self::B::T*>*
     ;
 }
-static field dynamic t3;
+static field core::List<self::B<core::int*>*>* t3;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
index 7ce484e..382933c 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -6,6 +6,6 @@
   constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
-static field dynamic t2;
+static field core::List<self::A<core::int*>*>* t2;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
index 93bd955..c95d0de 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
@@ -1,16 +1,24 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/field_inference_circularity.dart:12:7: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+//   var x = /*@returnType=invalid-type*/ () => new B(). /*@target=B::x*/ x;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic x;
-  field dynamic y;
+  field invalid-type x;
+  field () →* invalid-type y;
   synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  field dynamic x;
-  field dynamic y;
+  field invalid-type x;
+  field () →* invalid-type y;
   synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
index 4f84fb6..b3128a3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static field core::List<core::double*>* a;
-static field dynamic b;
+static field core::double* b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
index 30d498e..e5e9410 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
@@ -7,13 +7,13 @@
   synthetic constructor •() → self::A*
     ;
 }
-static field dynamic v_assign;
-static field dynamic v_plus;
-static field dynamic v_minus;
-static field dynamic v_multiply;
-static field dynamic v_prefix_pp;
-static field dynamic v_prefix_mm;
-static field dynamic v_postfix_pp;
-static field dynamic v_postfix_mm;
+static field core::int* v_assign;
+static field core::int* v_plus;
+static field core::int* v_minus;
+static field core::int* v_multiply;
+static field core::int* v_prefix_pp;
+static field core::int* v_prefix_mm;
+static field core::int* v_postfix_pp;
+static field core::int* v_postfix_mm;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
index abd1782..f0cfbcc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
@@ -15,9 +15,9 @@
   synthetic constructor •() → self::B*
     ;
 }
-static field dynamic v_prefix_pp;
-static field dynamic v_prefix_mm;
-static field dynamic v_postfix_pp;
-static field dynamic v_postfix_mm;
+static field core::int* v_prefix_pp;
+static field core::double* v_prefix_mm;
+static field self::A* v_postfix_pp;
+static field self::A* v_postfix_mm;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
index 1e6470c..454ab6d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
@@ -8,8 +8,8 @@
     ;
 }
 static field self::A* a;
-static field dynamic b;
-static field dynamic c;
-static field dynamic d;
+static field core::int* b;
+static field core::int* c;
+static field core::int* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
index fe43c76..a468053 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
@@ -23,8 +23,8 @@
   synthetic constructor •() → self::D*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field self::C* x;
+static field self::C* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
index f51db36..8c060c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
@@ -20,8 +20,8 @@
   synthetic constructor •() → self::D*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field self::C* x;
+static field self::C* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
index aae5d7d..fee3471 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
@@ -1,15 +1,23 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart:11:7: Error: Can't infer the type of 'b': circularity found during type inference.
+// Specify the type explicitly.
+//   var b = /*@ returnType=() ->* invalid-type */ () => x;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  field dynamic b;
-  field dynamic c;
+  field invalid-type b;
+  field () →* () →* invalid-type c;
   synthetic constructor •() → self::A*
     ;
 }
-static field dynamic a;
-static field dynamic x;
-static field dynamic y;
+static field self::A* a;
+static field () →* invalid-type x;
+static field () →* () →* () →* invalid-type y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
index 2f9d5ce..13732dc 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic y;
+static field core::bool* x;
+static field core::bool* y;
 static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
index 093da51..2013872 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
@@ -14,6 +14,6 @@
   method f() → void
     ;
 }
-static field dynamic x;
+static field void x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
index 2c1f8c3..51cd968 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
@@ -4,6 +4,6 @@
 
 static field core::int* i;
 static field core::String* s;
-static field dynamic x;
+static field core::String* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
index cbf3089..efecb76 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field core::List<core::Null*>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
index cbf3089..0f28e73 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
@@ -1,6 +1,7 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic x;
+static field core::Map<core::Null*, core::Null*>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
index c49eaef..ea79db2 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
@@ -12,11 +12,11 @@
     ;
 }
 static field self::C* c;
-static field dynamic field_ref;
-static field dynamic getter_ref;
-static field dynamic function_ref;
-static field dynamic field_ref_list;
-static field dynamic getter_ref_list;
-static field dynamic function_ref_list;
+static field core::int* field_ref;
+static field core::int* getter_ref;
+static field () →* core::int* function_ref;
+static field core::List<core::int*>* field_ref_list;
+static field core::List<core::int*>* getter_ref_list;
+static field core::List<() →* core::int*>* function_ref_list;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
index 34725d5..e14b203 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
@@ -1,10 +1,18 @@
 library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/inference_new/strongly_connected_component.dart:17:5: Error: Can't infer the type of 'x': circularity found during type inference.
+// Specify the type explicitly.
+// var x = /*@ returnType=() ->* invalid-type */ () => f() ? y : z;
+//     ^
+//
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x;
-static field dynamic y;
-static field dynamic z;
+static field invalid-type x;
+static field () →* invalid-type y;
+static field () →* invalid-type z;
 static method f() → core::bool*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
index 3e04860..d517114 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
@@ -40,7 +40,7 @@
   method foo() → self::C*
     ;
 }
-static field dynamic x;
+static field self::B* x;
 static method bar() → self::G*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
index 81dff1f..f0dd2fa 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* v;
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
index 81dff1f..f0dd2fa 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v;
+static field core::List<core::int*>* v;
 static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
index abbb66b..46dad28 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic y;
+static field void y;
 static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T*
   ;
 static method printRunning() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 773a50f..b3d2329 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -10,7 +10,7 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic, Z extends (self::D::Y*) →* self::D::X* = dynamic, W extends core::num* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null*) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
index 1c9866f..ddec6fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
index 1c9866f..ddec6fc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
index a44d4e1..b719a1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+class A<T extends self::A<self::A::T>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
index 44ba958..3d491c7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
index 44ba958..3d491c7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
new file mode 100644
index 0000000..9038ebd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<U extends (U) →* dynamic = (dynamic) →* dynamic> = (U*) →* dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 5a9d18f..941b9b6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
+static field self::C<core::num*, (core::Null*) →* void>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index 38c128d..28f1f4b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
+static field core::List<self::C<core::num*, (core::Null*) →* void>*>* lc;
+static field core::Map<self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>* mc;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index 42b3335..543c453 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic>* e;
+static field self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>* d;
+static field self::E<(core::Null*) →* void>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index b75263b..bcf89d2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
+static field core::List<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* ld;
+static field core::Map<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* md;
+static field core::List<self::E<(core::Null*) →* void>*>* le;
+static field core::Map<self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
index 06bc06a..e6c39b1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
@@ -6,25 +6,25 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic>* e;
-static field self::F<dynamic, dynamic>* f;
+static field self::C<dynamic, self::A<dynamic>*>* c;
+static field self::D<core::num*, self::A<core::num*>*>* d;
+static field self::E<dynamic, () →* dynamic>* e;
+static field self::F<core::num*, () →* core::num*>* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
index 32d8cdb..3bf392c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
@@ -6,29 +6,29 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends self::A<self::D::X*>* = self::A<core::num*>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends core::Object* = dynamic, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+class F<X extends core::num* = core::num*, Y extends () →* self::F::X* = () →* core::num*> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
-static field dynamic lf;
-static field dynamic mf;
+static field core::List<self::C<dynamic, self::A<dynamic>*>*>* lc;
+static field core::Map<self::C<dynamic, self::A<dynamic>*>*, self::C<dynamic, self::A<dynamic>*>*>* mc;
+static field core::List<self::D<core::num*, self::A<core::num*>*>*>* ld;
+static field core::Map<self::D<core::num*, self::A<core::num*>*>*, self::D<core::num*, self::A<core::num*>*>*>* md;
+static field core::List<self::E<dynamic, () →* dynamic>*>* le;
+static field core::Map<self::E<dynamic, () →* dynamic>*, self::E<dynamic, () →* dynamic>*>* me;
+static field core::List<self::F<core::num*, () →* core::num*>*>* lf;
+static field core::Map<self::F<core::num*, () →* core::num*>*, self::F<core::num*, () →* core::num*>*>* mf;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
index 2c04aba..ab32947 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
@@ -10,20 +10,20 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () →* self::F::X = dynamic> extends core::Object {
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic>* e;
-static field self::F<dynamic>* f;
+static field self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, () →* dynamic>* e;
+static field self::F<() →* dynamic>* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
index 6cfd9f5..e9f5ac1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
@@ -10,23 +10,23 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::B<self::D::X, self::D::Y>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+class E<X extends self::B<self::E::X, self::E::Y>* = self::B<dynamic, dynamic>*, Y extends () →* self::E::X* = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () →* self::F::X = dynamic> extends core::Object {
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
   synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
-static field dynamic ld;
-static field dynamic md;
-static field dynamic le;
-static field dynamic me;
-static field dynamic lf;
-static field dynamic mf;
+static field core::List<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* ld;
+static field core::Map<self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*>* md;
+static field core::List<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* le;
+static field core::Map<self::E<self::B<dynamic, dynamic>*, () →* dynamic>*, self::E<self::B<dynamic, dynamic>*, () →* dynamic>*>* me;
+static field core::List<self::F<() →* dynamic>*>* lf;
+static field core::Map<self::F<() →* dynamic>*, self::F<() →* dynamic>*>* mf;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index 1a94d9d..e767b17 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -6,15 +6,15 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic>* c;
-static field self::D<dynamic, dynamic>* d;
+static field self::C<dynamic, (core::Null*) →* dynamic>* c;
+static field self::D<core::num*, (core::Null*) →* core::num*>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index e27f41f..04e5fdf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -6,17 +6,17 @@
   synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-static field dynamic lc;
-static field dynamic mc;
-static field dynamic ld;
-static field dynamic md;
+static field core::List<self::C<dynamic, (core::Null*) →* dynamic>*>* lc;
+static field core::Map<self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>* mc;
+static field core::List<self::D<core::num*, (core::Null*) →* core::num*>*>* ld;
+static field core::Map<self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>* md;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
index a014cc8..053b62f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
@@ -4,6 +4,6 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<dynamic>* y;
+static field col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
index b01dcf6..86fbb12 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
index b01dcf6..86fbb12 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
index 8db9fc1..1a8907a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::num* = dynamic, S extends core::List<self::B::T*>* = dynamic> extends self::A<self::B::T*> {
+class B<T extends core::num* = core::num*, S extends core::List<self::B::T*>* = core::List<core::num*>*> extends self::A<self::B::T*> {
   constructor •([self::B::T* x]) → self::B<self::B::T*, self::B::S*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
index dafb049..4b449c4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T>* = dynamic> extends core::Object {
+class B<T extends core::Comparable<self::B::T>* = core::Comparable<dynamic>*> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-static field dynamic y;
+static field self::B<core::Comparable<dynamic>*>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
index 4db0df2..7bd7cea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  method foo(self::A<dynamic>* a) → dynamic
+  method foo(self::A<core::num*>* a) → dynamic
     ;
-  method bar() → self::A<dynamic>*
+  method bar() → self::A<core::num*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
index c7fd878..048cb6e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field dynamic a;
+static field core::List<self::A<core::num*>*>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
index c7fd878..1fef771 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num* = dynamic> extends core::Object {
+class A<T extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field dynamic a;
+static field core::Map<self::A<core::num*>*, self::A<core::num*>*>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index 81409aa..556a2ee 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -37,40 +37,40 @@
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends self::A<self::D::X>* = dynamic, Y extends self::A<self::D::Y>* = dynamic> extends core::Object {
+class D<X extends self::A<self::D::X>* = self::A<dynamic>*, Y extends self::A<self::D::Y>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X>* = dynamic, X extends self::C<self::E::W*, self::E::X>* = dynamic, Y extends self::B<self::E::Y, self::E::Z>* = dynamic, Z extends self::C<self::E::Y*, self::E::Z>* = dynamic> extends core::Object {
+class E<W extends self::B<self::E::W, self::E::X>* = self::B<dynamic, dynamic>*, X extends self::C<self::E::W*, self::E::X>* = self::C<dynamic, dynamic>*, Y extends self::B<self::E::Y, self::E::Z>* = self::B<dynamic, dynamic>*, Z extends self::C<self::E::Y*, self::E::Z>* = self::C<dynamic, dynamic>*> extends core::Object {
   synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
     ;
 }
-class F<V extends core::num* = dynamic, W extends self::B<self::F::W, self::F::X>* = dynamic, X extends self::C<self::F::W*, self::F::X>* = dynamic, Y extends self::B<self::F::W*, self::F::X*>* = dynamic, Z extends self::C<self::F::Y*, self::F::Z>* = dynamic> extends core::Object {
+class F<V extends core::num* = core::num*, W extends self::B<self::F::W, self::F::X>* = self::B<dynamic, dynamic>*, X extends self::C<self::F::W*, self::F::X>* = self::C<dynamic, dynamic>*, Y extends self::B<self::F::W*, self::F::X*>* = self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, Z extends self::C<self::F::Y*, self::F::Z>* = self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*> extends core::Object {
   synthetic constructor •() → self::F<self::F::V*, self::F::W*, self::F::X*, self::F::Y*, self::F::Z*>*
     ;
 }
-class G<V extends core::num* = dynamic, W extends self::B<self::G::V*, self::G::X>* = dynamic, X extends self::C<self::G::W*, self::G::V*>* = dynamic, Y extends self::B<self::G::W*, self::G::X*>* = dynamic, Z extends self::C<self::G::Y*, self::G::Z>* = dynamic> extends core::Object {
+class G<V extends core::num* = core::num*, W extends self::B<self::G::V*, self::G::X>* = self::B<core::num*, dynamic>*, X extends self::C<self::G::W*, self::G::V*>* = self::C<dynamic, core::num*>*, Y extends self::B<self::G::W*, self::G::X*>* = self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, Z extends self::C<self::G::Y*, self::G::Z>* = self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*> extends core::Object {
   synthetic constructor •() → self::G<self::G::V*, self::G::W*, self::G::X*, self::G::Y*, self::G::Z*>*
     ;
 }
-class H<S extends self::A<self::H::S>* = dynamic, T extends self::B<self::H::T, self::H::U>* = dynamic, U extends self::C<self::H::T*, self::H::U>* = dynamic, V extends self::A<self::H::V>* = dynamic, W extends self::H::S* = dynamic, X extends self::H::T* = dynamic, Y extends self::H::U* = dynamic, Z extends self::H::V* = dynamic> extends core::Object {
+class H<S extends self::A<self::H::S>* = self::A<dynamic>*, T extends self::B<self::H::T, self::H::U>* = self::B<dynamic, dynamic>*, U extends self::C<self::H::T*, self::H::U>* = self::C<dynamic, dynamic>*, V extends self::A<self::H::V>* = self::A<dynamic>*, W extends self::H::S* = self::A<dynamic>*, X extends self::H::T* = self::B<dynamic, dynamic>*, Y extends self::H::U* = self::C<dynamic, dynamic>*, Z extends self::H::V* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::H<self::H::S*, self::H::T*, self::H::U*, self::H::V*, self::H::W*, self::H::X*, self::H::Y*, self::H::Z*>*
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = dynamic, W extends (self::I::X) →* dynamic = dynamic, X extends (self::I::V*) →* dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = (core::Null*) →* dynamic, W extends (self::I::X) →* dynamic = (core::Null*) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null*) →* dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> extends core::Object {
   synthetic constructor •() → self::I<self::I::T, self::I::U, self::I::V*, self::I::W*, self::I::X*, self::I::Y, self::I::Z>*
     ;
 }
-class J<S extends (self::J::U) →* self::J::T = dynamic, T extends (self::J::S*) →* self::J::U = dynamic, U extends (self::J::T*) →* self::J::S* = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U) →* self::J::T = (core::Null*) →* dynamic, T extends (self::J::S*) →* self::J::U = (core::Null*) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null*) →* dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = (core::Null*) →* dynamic, Y extends self::J::Z = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V, self::J::W, self::J::X*, self::J::Y, self::J::Z*>*
     ;
 }
-static field self::D<dynamic, dynamic>* d;
-static field self::E<dynamic, dynamic, dynamic, dynamic>* e;
-static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic>* f;
-static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic>* g;
-static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* h;
-static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* i;
-static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* j;
+static field self::D<self::A<dynamic>*, self::A<dynamic>*>* d;
+static field self::E<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>* e;
+static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
+static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
+static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
+static field self::I<dynamic, dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* i;
+static field self::J<(core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index 8c2fc53..78b6d1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -6,50 +6,50 @@
   synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
     ;
 }
-class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
 }
-class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::C1<dynamic, dynamic>* c1;
-static field self::C2<dynamic, dynamic>* c2;
-static field self::C3<dynamic, dynamic>* c3;
-static field self::C4<dynamic, dynamic>* c4;
-static field self::D1<dynamic, dynamic>* d1;
-static field self::D2<dynamic, dynamic>* d2;
-static field self::D3<dynamic, dynamic>* d3;
-static field self::D4<dynamic, dynamic>* d4;
-static field self::E<dynamic>* e;
+static field self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c1;
+static field self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c2;
+static field self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c3;
+static field self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d4;
+static field self::E<(core::Null*) →* dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index b742990..0db7d67 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -6,59 +6,59 @@
   synthetic constructor •() → self::B<self::B::X*, self::B::Y*>*
     ;
 }
-class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y